powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Фотошоп, возвращай свою пятничную про последовательности
25 сообщений из 56, страница 2 из 3
Фотошоп, возвращай свою пятничную про последовательности
    #39716763
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKadЗаинтриговал. Третий час с моделью бьюсь, победить не могу: cyclic/acyclic.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
SELECT  VAL
  FROM  DUAL
  MODEL
    DIMENSION BY(0 ID)
    MEASURES(
             0 TEMP_VAL,
             0 VAL
             )
    RULES ITERATE(&1)
      (
       TEMP_VAL[FOR ID FROM 0 TO ITERATION_NUMBER + 1 INCREMENT 1] = CASE
                                                                       WHEN VAL[ITERATION_NUMBER] - (ITERATION_NUMBER + 1) < 0
                                                                         THEN VAL[ITERATION_NUMBER] + ITERATION_NUMBER + 1
                                                                       ELSE VAL[ITERATION_NUMBER] - (ITERATION_NUMBER + 1)
                                                                     END,
       VAL[ITERATION_NUMBER + 1] = CASE
                                     WHEN VAL[ITERATION_NUMBER] - (ITERATION_NUMBER + 1) < 0
                                       THEN TEMP_VAL[0]
                                     WHEN COUNT(
                                                CASE TEMP_VAL
                                                  WHEN VAL THEN 1
                                                END
                                               )[ANY] = 1
                                       THEN VAL[ITERATION_NUMBER] + ITERATION_NUMBER + 1
                                       ELSE TEMP_VAL[0]
                                   END
      )
/
Enter value for 1: 20
old   9:     RULES ITERATE(&1)
new   9:     RULES ITERATE(20)

       VAL
----------
         0
         1
         3
         6
         2
         7
        13
        20
        12
        21
        11

       VAL
----------
        22
        10
        23
         9
        24
         8
        25
        43
        62
        42

21 rows selected.

SQL> 



SY.
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716775
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

спасиб, примерно етого я и хотел добится

для мене не просто, буду осознавать

....
stax
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716782
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Staxбуду осознавать
Из трюков там только смешанное использование dimension - как индекса последовательности Ai и как кэша встреченных значений последовательности t, собственно поэтому пришлось оборачивать в динамическое представление - отфильтровать Ai is not null...
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716791
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровВсе проще -- надо требоватьНе совсем понятно к чему это ёрничанье.
На Stack Overflow можно удалять свои темы, посты или редактировать их как угодно.
И ничего - живет ресурс. И что удивительно без взаимных тычков.
Диктатура имеет смысл только в определенных сообществах.
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716805
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Staxтекущую где-то запоминатьОчередная вариация
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select i, x
from dual
model ignore nav
dimension by (0 i)
measures (0 x, 0 tmp)
rules iterate(11)
(
 tmp[i<iteration_number]=x[iteration_number-1]-iteration_number,
 x[iteration_number]=x[iteration_number-1]+iteration_number*decode(sign(tmp[0])*sign(min(abs(x-tmp))[i<iteration_number]),1,-1,1)
)
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716810
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopStaxтекущую где-то запоминатьОчередная вариация[/src]
Красиво, но размножение текущего значения по всей коллекции на каждой итерации смущает.
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716813
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

Да, решение с "душком".

PS.
Можно учитывать заполненность первой строки и уменьшить число итераций на одну,
при этом убрав ignore nav в предложенных вариантах с минимальными изменениями.
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716821
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopМожно учитывать заполненность первой строки
Еще можно попробовать учесть тот факт, что минимальное возможное значение i-го элемента последовательности растет, что теоретисски допускает сокращение размера кэша значений.
Код: sql
1.
min(Ai) over(order by i rows 10 preceding) m_i
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716824
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopДа, решение с "душком".

Предлагаю перевести конкурс с критерия "многабукфф" в более традиционное русло:

Попробовал "вариацию" на 100000 итерациях - что-то оно "ушло в себя".
Вариант Соломона (с двойной итерацией) тоже.
Мой вариант уложился в 3 секунды.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
SQL> 
set timing on
with t1 as (
select i, Ai
from ( select * from dual
        model ignore nav
        dimension by (0 i)
        measures (0 Ai, 0 t)
        rules iterate (100000)
        ( Ai[iteration_number] = Ai[iteration_number-1]
                               + iteration_number
                               * case when t[Ai[iteration_number-1]-iteration_number] >0
                                        or Ai[iteration_number-1]-iteration_number <= 0
                                    then 1
                                  else -1
                                  end
        , t[Ai[iteration_number]] = 1
        )
) where Ai is not null
)
select count(*), sum(Ai) from t1
;
  COUNT(*)    SUM(AI)
---------- ----------
    100000 8643985072
Executed in 2,831 seconds

SQL>  
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716828
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

Трюк с nested cells не оставляет никаких шансов прочим проверкам.
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716854
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousКрасиво, но размножение текущего значения по всей коллекции на каждой итерации смущает.

Ну мое решение делает тоже самое. Без размножения:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
SELECT  ID,
        VAL
  FROM  DUAL
  MODEL
    DIMENSION BY(0 VAL)
    MEASURES(
             0 ID,
             0 PREV_VAL
             )
    RULES ITERATE(&1)
      (
       PREV_VAL[0] = CASE
                       WHEN PREV_VAL[0] - (ITERATION_NUMBER + 1) < 0
                         THEN PREV_VAL[0] + ITERATION_NUMBER + 1
                       WHEN ID[PREV_VAL[0] - (ITERATION_NUMBER + 1)] IS NOT NULL
                         THEN PREV_VAL[0] + ITERATION_NUMBER + 1
                       ELSE PREV_VAL[0] - (ITERATION_NUMBER + 1)
                     END,
       ID[PREV_VAL[0]] = ITERATION_NUMBER + 1
      )
/
Enter value for 1: 10
old  10:     RULES ITERATE(&1)
new  10:     RULES ITERATE(10)

        ID        VAL
---------- ----------
         0          0
         1          1
         2          3
         3          6
         4          2
         5          7
         6         13
         7         20
         8         12
         9         21
        10         11

11 rows selected.

SQL> 



Производительность:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
SQL> with t1 as (
  2  select i, Ai
  3  from ( select * from dual
  4          model ignore nav
  5          dimension by (0 i)
  6          measures (0 Ai, 0 t)
  7          rules iterate (100000)
  8          ( Ai[iteration_number] = Ai[iteration_number-1]
  9                                 + iteration_number
 10                                 * case when t[Ai[iteration_number-1]-iteration_number] >0
 11                                          or Ai[iteration_number-1]-iteration_number <= 0
 12                                      then 1
 13                                    else -1
 14                                    end
 15          , t[Ai[iteration_number]] = 1
 16          )
 17  ) where Ai is not null
 18  )
 19  select count(*), sum(Ai) from t1
 20  ;

  COUNT(*)    SUM(AI)
---------- ----------
    100000 8643985072

Elapsed: 00:00:04.39
SQL> WITH T AS (
  2             SELECT  ID,
  3                     VAL
  4               FROM  DUAL
  5               MODEL
  6                 DIMENSION BY(0 VAL)
  7                 MEASURES(
  8                          0 ID,
  9                          0 PREV_VAL
 10                          )
 11                 RULES ITERATE(&1)
 12                   (
 13                    PREV_VAL[0] = CASE
 14                                    WHEN PREV_VAL[0] - (ITERATION_NUMBER + 1) < 0
 15                                      THEN PREV_VAL[0] + ITERATION_NUMBER + 1
 16                                    WHEN ID[PREV_VAL[0] - (ITERATION_NUMBER + 1)] IS NOT NULL
 17                                      THEN PREV_VAL[0] + ITERATION_NUMBER + 1
 18                                    ELSE PREV_VAL[0] - (ITERATION_NUMBER + 1)
 19                                  END,
 20                    ID[PREV_VAL[0]] = ITERATION_NUMBER + 1
 21                   )
 22            )
 23  SELECT  COUNT(*),
 24          SUM(VAL)
 25    FROM  T
 26  /
Enter value for 1: 100000
old  11:                RULES ITERATE(&1)
new  11:                RULES ITERATE(100000)

  COUNT(*)   SUM(VAL)
---------- ----------
     74253 6575992441

Elapsed: 00:00:02.58
SQL> 



SY.
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716861
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYandrey_anonymousКрасиво, но размножение текущего значения по всей коллекции на каждой итерации смущает.
Без размножения:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SQL> WITH T AS (
...
 22            )
 23  SELECT  COUNT(*),
 24          SUM(VAL)
 25    FROM  T
 26  /
Enter value for 1: 100000
old  11:                RULES ITERATE(&1)
new  11:                RULES ITERATE(100000)

  COUNT(*)   SUM(VAL)
---------- ----------
     74253 6575992441

Elapsed: 00:00:02.58
SQL> 



Ммм?
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716887
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousМмм?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
with t1 as (
select i, Ai
from ( select * from dual
        model ignore nav
        dimension by (0 i)
        measures (0 Ai, 0 t)
        rules iterate (100000)
        ( Ai[iteration_number] = Ai[iteration_number-1]
                               + iteration_number
                               * case when t[Ai[iteration_number-1]-iteration_number] >0
                                        or Ai[iteration_number-1]-iteration_number <= 0
                                    then 1
                                  else -1
                                  end
        , t[Ai[iteration_number]] = 1
        )
) where Ai is not null
)
select count(*),count(distinct Ai) from t1
/

  COUNT(*) COUNT(DISTINCTAI)
---------- -----------------
    100000             74253

SQL> 



Я не учел что:

A(0) = 0
A(n) = A(n-1) - n if A(n-1) - n > 0 and is new, else
A(n) = A(n-1) + n


может породить и порождает дубли.

SY.
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716899
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYЯ не учел что:

A(0) = 0
A(n) = A(n-1) - n if A(n-1) - n > 0 and is new, else
A(n) = A(n-1) + n


может породить и порождает дубли.

Угу.
Но сама идея мне понравилась, спасибо.
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39716994
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
boobydbms_photoshop...
это навело на мысли что тема создана не на подходящей площадке и подобное баловство стоит делать на соответствующих сайтах. а я уж понадеялся, что ты понял неадекватность задачи
для решения её на "голом" sql, совсем без pl/sql.
Интересно было бы посмотреть на эффективное решение с помощью pl/sql и сравнить его по времени выполнения с вариантом SY.
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39717060
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
boobyНеобходимая по условию проверка на существование,
на таком голом sql, которому нельзя заказать временное индексирование
уже набранных значений, гарантированно неэффективна .

Решение подобных задач и на pl/sql не эффективно, если памяти, для языка способного с ней работать напрямую, хватает чтобы закрыть максимальное значение ряда, то индексирование тоже неэффективно с точки зрения производительности.
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39717062
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SkilledJuniorboobyНеобходимая по условию проверка на существование,
на таком голом sql, которому нельзя заказать временное индексирование
уже набранных значений, гарантированно неэффективна .Решение подобных задач и на pl/sql не эффективно...Не верю.
С остальными запятыми, кто на ком стоял, я разобраться не смог.
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39717099
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SkilledJuniorИнтересно было бы посмотреть на эффективное решение с помощью pl/sql и сравнить его по времени выполнения с вариантом SY.

Запросто.

SkilledJuniorРешение подобных задач и на pl/sql не эффективно

Мой вариант с одноатрибутным массивом из N элементов где N число элементов пoследовательности не проходит так-как пoследовательность не уникальна. Поэтому приходится использовать двухатрибутный массив из M элементов где M = N + X так как приходится в нем хранить флаг "а был ли этот мальчик", как Андрей и сделал. В результате приходится оборачивать MODEL в in-line view или CTE и отсеивать лишние X элементов (условие where Ai is not null). В PL/SQL можно создать два одноатрибутных массива и тогда отсеивать не нужно:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
SET TIMING ON
DECLARE
    TYPE NUM_LIST_TYPE
      IS
        TABLE OF PLS_INTEGER
          INDEX BY PLS_INTEGER;
    V_SEQ  NUM_LIST_TYPE;
    V_FLAG NUM_LIST_TYPE;
    V_CNT  NUMBER := &1;
    V_SUM  NUMBER;
BEGIN
    V_SEQ(0)  := 0;
    V_FLAG(0) := 0;
    V_SUM     := 0;
--    DBMS_OUTPUT.PUT_LINE('     0      0');
    FOR V_I IN 1..V_CNT - 1 LOOP
      IF V_SEQ(V_I - 1) <= V_I
        THEN
          V_SEQ(V_I) := V_SEQ(V_I - 1) + V_I;
      ELSIF  V_FLAG.EXISTS(V_SEQ(V_I - 1) - V_I)
        THEN 
          V_SEQ(V_I) := V_SEQ(V_I - 1) + V_I;
        ELSE
          V_SEQ(V_I) := V_SEQ(V_I - 1) - V_I;
      END IF;
      V_FLAG(V_SEQ(V_I)) := 0;
--      DBMS_OUTPUT.PUT_LINE(LPAD(V_I,6) || LPAD(V_SEQ(V_I),7));
      V_SUM := V_SUM + V_SEQ(V_I);
    END LOOP;
    DBMS_OUTPUT.PUT_LINE('SUM = ' || V_SUM);
END;
/
Enter value for 1: 100000
old   8:     V_CNT  NUMBER := &1;
new   8:     V_CNT  NUMBER := 100000;
SUM = 8643985072

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.09
SQL> 



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
CREATE OR REPLACE
  TYPE NUM_LIST_TYPE
    IS
      TABLE OF NUMBER
/
CREATE OR REPLACE
  FUNCTION RECAMAN(
                   P_CNT NUMBER
                  )
    RETURN NUM_LIST_TYPE
    IS
        TYPE PLS_INT_LIST_TYPE
          IS
            TABLE OF PLS_INTEGER
              INDEX BY PLS_INTEGER;
        V_SEQ  NUM_LIST_TYPE := NUM_LIST_TYPE();
        V_FLAG PLS_INT_LIST_TYPE;
        V_N    NUMBER;
    BEGIN
        V_SEQ.EXTEND(P_CNT);
        V_SEQ(1)  := 0;
        V_FLAG(1) := 0;
        FOR V_I IN 2..P_CNT LOOP
          V_N := V_I - 1;
          IF V_SEQ(V_I - 1) <= V_N
            THEN
              V_SEQ(V_I) := V_SEQ(V_I - 1) + V_N;
          ELSIF  V_FLAG.EXISTS(V_SEQ(V_I - 1) - V_N)
            THEN 
              V_SEQ(V_I) := V_SEQ(V_I - 1) + V_N;
            ELSE
              V_SEQ(V_I) := V_SEQ(V_I - 1) - V_N;
          END IF;
          V_FLAG(V_SEQ(V_I)) := 0;
        END LOOP;
        RETURN V_SEQ;
END;
/
SELECT  COUNT(*),
        SUM(COLUMN_VALUE)
  FROM  TABLE(RECAMAN(100000))
/

  COUNT(*) SUM(COLUMN_VALUE)
---------- -----------------
    100000        8643985072

Elapsed: 00:00:00.15
SQL> 




Можно еще с pipelined побаловаться.

SY.
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39717173
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY,

К сожалению разреженный ряд получается, простым массивом неэффективно по использованию памяти, но люблю я обычные массивы))

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
declare
	max_i number := 200000;
	TYPE Recaman IS VARRAY(200000) OF INTEGER;
	TYPE t_check_of_doubles IS VARRAY(1500000) OF varchar2(1);
	a Recaman := Recaman();
	check_of_doubles t_check_of_doubles := t_check_of_doubles();
	n number;
	max_ai number;

	l_systs1 TIMESTAMP WITH TIME ZONE := SYSTIMESTAMP;
	l_systs2 TIMESTAMP WITH TIME ZONE := SYSTIMESTAMP;
begin
	a.Extend(max_i);
	check_of_doubles.Extend(1500000);
	
	max_ai :=0;
	
	a(1) := 0;
	check_of_doubles(1) := '1';
	
	for i in 2 .. max_i loop
		n := i-1;
		if a(n)-n > 0 then
			a(i) := a(n)-n;

			if check_of_doubles(a(i)) = '1' then
				a(i) := a(n)+n;
			end if;

		else
			a(i) := a(n)+n;
		end if;

		check_of_doubles(a(i)) := '1';

		if a(i) > max_ai then
		    max_ai:= a(i);
		end if;
		
		if a(i) > 1000000 then
		    dbms_output.put_line('a('||n||') = ' || a(i));
		end if;
		
	end loop;

	dbms_output.put_line('----------------------------');

	for i in (max_i-4) .. max_i loop
		dbms_output.put_line('n = ' || (i-1) || ' a(n) = ' || a(i));
	end loop;
	
	dbms_output.put_line('max = ' || max_ai);
	
	l_systs2 := SYSTIMESTAMP;
	dbms_output.put_line( to_char(round(extract (second from (l_systs2 - l_systs1)),2), '9990.99') || ' секунд' );
end;
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39717176
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-Не верю.
С остальными запятыми, кто на ком стоял, я разобраться не смог.
Выделяем область памяти, записываем в нее битовые флаги, число ряда преобразуется в адрес битового флага, по сути оно представляет собой смещение от начала выделенной области памяти. Для проверки существования числа в уже сформированном ряду нужно одно прямое чтение из памяти и извлечение из прочитанного битового флага, никаких массивов и индексаций, PL/SQL такое могёт?
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39717258
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SkilledJunior и извлечение из прочитанного битового флагаЛишние сдвиги быстродействия не прибавят. Но, если взялся за третий критерий эффективности - объем памяти, давай и компрессию наворачивай.
SkilledJuniorPL/SQL такое могёт?Работа с битами для plsql не проблема.
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #39717277
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
haydeНа правах шуткиЗдесь проверяется цикличность и при сложении и при вычитании, а должна только при вычитании.
Соответственно 42 во второй раз не выбирается.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
SQL> with r(i,a,c)as(select 1,0,ku$_objnumset()from dual
  2  union all select i+1,case when a>i and a-i not member of c then a-i else a+i end,c multiset union ku$_objnumset(a)from r where i<25)select i-1,a from r;

       I-1          A
---------- ----------
         0          0
         1          1
         2          3
         3          6
         4          2
         5          7
         6         13
         7         20
         8         12
         9         21
        10         11
        11         22
        12         10
        13         23
        14          9
        15         24
        16          8
        17         25
        18         43
        19         62
        20         42
        21         63
        22         41
        23         18
        24         42

25 rows selected.

SQL> select level-1,n from(select rownum-1n from xmltable('0to 100'))start with n=0connect by nocycle level-1=abs(n-prior n)and rownum<=25;

   LEVEL-1          N
---------- ----------
         0          0
         1          1
         2          3
         3          6
         4          2
         5          7
         6         13
         7         20
         8         12
         9         21
        10         11
        11         22
        12         10
        13         23
        14          9
        15         24
        16          8
        17         25
        18         43
        19         62
        20         42
        21         63
        22         41
        23         18
        23         64

25 rows selected.

Можно расписать условие соединения и попытаться обмануть Оракл с помощью prior sys_guid, но при таком подходе цикличность вообще не будет проверяться.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
SQL> select level-1,n from(select rownum-1n from xmltable('0to 100'))start with n=0connect by nocycle
  2  case when prior n - (level - 1) = n or prior n + (level - 1) = n and prior sys_guid() is not null then 1 end = 1
  3  and not (level > 1 and n = 0)
  4  and rownum<=25;

   LEVEL-1          N
---------- ----------
         0          0
         1          1
         2          3
         3          6
         4          2
         5          7
         6          1
         7          8
         8         16
         9          7
        10         17
        11          6
        12         18
        13          5
        14         19
        15          4
        16         20
        17          3
        18         21
        19          2
        20         22
        21          1
        22         23
        23         46
        24         22

25 rows selected.

SQL> with r(i,a,c)as(select 1,0,ku$_objnumset()from dual
  2  union all select i+1,case when a>i/* and a-i not member of c */then a-i else a+i end,c multiset union ku$_objnumset(a)from r where i<25)select i-1,a from r;

       I-1          A
---------- ----------
         0          0
         1          1
         2          3
         3          6
         4          2
         5          7
         6          1
         7          8
         8         16
         9          7
        10         17
        11          6
        12         18
        13          5
        14         19
        15          4
        16         20
        17          3
        18         21
        19          2
        20         22
        21          1
        22         23
        23         46
        24         22

25 rows selected.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Фотошоп, возвращай свою пятничную про последовательности
    #40024849
Miserere
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select a from dual
model
dimension by(0 id)
measures(0 a)
ignore nav
rules iterate(30)
(
a[iteration_number] = case when a [iteration_number - 1 ] > iteration_number then 1 else -1 end,
a[iteration_number] = a[iteration_number - 1] - iteration_number * a[iteration_number],
update a[id] = case when count(*) over(partition by a order by id) > 1 then a[cv(id) - 1] + cv(id) else a[cv(id)] end
)
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #40024867
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miserere,

Если и занимаешься некрофильством то хоть приводи улучшенное решение.
Ну а теперь запусти это c rules iterate(100000) и сравни (если дождешься) с моим

Код: plsql
1.
2.
3.
4.
5.
6.
  COUNT(*) SUM(COLUMN_VALUE)
---------- -----------------
    100000        8643985072

Elapsed: 00:00:00.15
SQL> 



SY.
...
Рейтинг: 0 / 0
Фотошоп, возвращай свою пятничную про последовательности
    #40024924
Miserere
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это challenge, SY, производительность тут у ходит на второй план, никто не ставит это на прод.
Я задался вопросом как уйти отStaxтекущую где-то запоминать
С выходом на дубликат через флажок и его вариациями любой дурак сделает. Хочешь побахвалиться - сделай свои
Код: plsql
1.
Elapsed: 00:00:00.15


с одним measure
...
Рейтинг: 0 / 0
25 сообщений из 56, страница 2 из 3
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Фотошоп, возвращай свою пятничную про последовательности
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]