Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Фотошоп, возвращай свою пятничную про последовательности  [new]
AmKad
Member

Откуда:
Сообщений: 4905
Заинтриговал. Третий час с моделью бьюсь, победить не могу: cyclic/acyclic. Посмотрю потом твои решения.

P.S. Модераторы, ну послал там кто-то фотошопа на Плавучее Нефтяное Хранилище, ну удалили бы пост. Зачем всю тему-то?
Да и вообще, если ругаться запретите, кто ж сюда заходить-то будет?
12 окт 18, 13:32    [21702457]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 5847
AmKad,

Чтобы условие задачи не потерялось
12 окт 18, 13:37    [21702466]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5142
AmKad,

Я специально попросил удалить тему целиком.
Если интересны мои решения (model/rec with) напиши в почту.
12 окт 18, 13:42    [21702471]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
AmKad
Member

Откуда:
Сообщений: 4905
dbms_photoshop,

Написал.
12 окт 18, 13:47    [21702486]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
merch
Member

Откуда:
Сообщений: 115
dbms_photoshop
Я специально попросил удалить тему целиком.


Почему?
12 окт 18, 13:52    [21702496]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 17843
Лучше бы этого неадеквата забанили (который сразу какашки начал кидать), чем тему удалять
Он, почему-то остался безнаказанным...
12 окт 18, 14:18    [21702539]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5142
merch,

Потому что пятничная создается не для себя с практическим интересом а для людей, для развлечения.
Достаточно одной гниды, которая безнаказанно может писать все что вздумается, чтоб перекрыть плюсы.
Кроме того, учитывая что кроме вышеозначенного никто в теме не отметился,
это навело на мысли что тема создана не на подходящей площадке и подобное баловство стоит делать на соответствующих сайтах.
12 окт 18, 14:18    [21702541]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
123йй
Member

Откуда:
Сообщений: 1416
dbms_photoshop
учитывая что кроме вышеозначенного никто в теме не отметился

так еще пятник не кончился :)
считай, что все кому интересно в процессе решения.
я тоже пытаюсь модельку прикрутить, но пока не выходит
12 окт 18, 14:26    [21702550]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5142
Ребята, не надо катить бочку на модераторов. Они сработали на отлично.
Бан бессмыленный и с его помощью обиды не лечатся, а наоборот.

Неадекват на меня почему-то давно затаил злобу...
Написал бы мне уже что ли на почту, выговорился, но нет, он любит публично показывать каков он.

+ В целях скорейшей развязки, заготовки под спойлером
select*from dual model dimension by(0 i)measures(0 a)(a[for i from 1to 10increment 1]=
case when a[cv()-1]>cv(i) and a[cv()-1]-cv(i)not member of cast(collect(a)[i<cv()]as ku$_objnumset)then a[cv()-1]-cv(i)else a[cv()-1]+cv(i)end);

with r(i,a,c)as(select 1,0,ku$_objnumset()from dual
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<=10)select i-1,a from r;
12 окт 18, 14:28    [21702557]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 17843
Ну а если честно, то он сразу привел решение тоже с ku$_objnumset, просто немного более многобуквенное, но и, возможно, проще для сопровождения
12 окт 18, 14:34    [21702569]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 17843
А, стоп, там просто массив чиселков был -- ну в принципе, тоже ничего
12 окт 18, 14:35    [21702572]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
hayde
Member

Откуда:
Сообщений: 2
Отличная пятничная задачка.
+ 175 символов
with t(i,n,s)as(select 1,0,'.'from dual union all select i+1,n+i*(case when(n<i or s||n||'.'like'%.'||(n-i)||'.%')then 1else-1end),s||n||'.'from t where i<&Z)select i,n from t
12 окт 18, 14:42    [21702584]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
booby
Member [заблокирован]

Откуда:
Сообщений: 1609
dbms_photoshop
...
это навело на мысли что тема создана не на подходящей площадке и подобное баловство стоит делать на соответствующих сайтах.

о как.
а я уж понадеялся, что ты понял неадекватность задачи
для решения её на "голом" sql, совсем без pl/sql.

Необходимая по условию проверка на существование,
на таком голом sql, которому нельзя заказать временное индексирование
уже набранных значений, гарантированно неэффективна.
В лучшем случае время проверки будет расти линейно.
Разумный человек, даже ради "баловства" не начнет
выписывать её решение на таком "голом sql"

И, просто выполни свои sql для каких-нибудь значений номера последнего вычисляемого
элемента, превышающего, например, 7110...
добавив distinct, ты продвинешься немного, в обмен на оквадрачивание времени.

PS
что за любовь к бессмысленному sql по пятницам...
12 окт 18, 14:52    [21702595]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1319
hayde,

я тоже сделал с || и in_str, но ж 4000 символов

.....
stax
12 окт 18, 14:53    [21702597]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
-2-
Member

Откуда:
Сообщений: 13834
Вячеслав Любомудров
ku$_objnumset
ku$_vcnt короче.
12 окт 18, 14:53    [21702598]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1319
dbms_photoshop
Ребята, не надо катить бочку на модераторов. Они сработали на отлично.
Бан бессмыленный и с его помощью обиды не лечатся, а наоборот.

Неадекват на меня почему-то давно затаил злобу...
Написал бы мне уже что ли на почту, выговорился, но нет, он любит публично показывать каков он.

+ В целях скорейшей развязки, заготовки под спойлером
select*from dual model dimension by(0 i)measures(0 a)(a[for i from 1to 10increment 1]=
case when a[cv()-1]>cv(i) and a[cv()-1]-cv(i)not member of cast(collect(a)[i<cv()]as ku$_objnumset)then a[cv()-1]-cv(i)else a[cv()-1]+cv(i)end);

with r(i,a,c)as(select 1,0,ku$_objnumset()from dual
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<=10)select i-1,a from r;


хотелось БЫ без collect

что-то аля
select rn,s from dual
  model
  dimension by (0 as rn)
  measures (0 s)
  rules iterate (13)
  (
  s[iteration_number] = ...
  s[iteration_number] order by rn = case when sum(decode(s,s[cv()], 1, 0))[any]=1 
        then ...
        else ...
        end
  )
/


но у меня не выходит каменный цветок

....
stax
12 окт 18, 14:57    [21702604]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5142
Stax
что-то аля
sum(decode(s,s[cv()], 1, 0))[any]
В выражении для агрегата нельзя ссылаться на "текущую строку".

С другой стороны, мера не может быть коллекцией, так что накапливать посчитанное в мере с целью проверки вхождения тоже не выйдет.
Разве что накапливать в строке с соответствующими ограничениями. Зато итеративная модель и без collect.
12 окт 18, 15:12    [21702624]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1319
dbms_photoshop,

в строке и через рекурсивный with делается

жаль что нельзя "В выражении для агрегата нельзя ссылаться на "текущую строку"."
по идее не обязательно текущую cv
12 окт 18, 15:17    [21702629]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1319
dbms_photoshop,

ой случайно отправил
по идее не обязательно текущую (cv), можно конкретную напр iteration_number, или текущую где-то запоминать

.....
stax
12 окт 18, 15:20    [21702631]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28282
Я специально попросил удалить тему целиком.
Никогда не понимал модераторов, потворствующих ТС-ам в их самомнении, что они полные хозяева созданных ими тем.
12 окт 18, 15:21    [21702632]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1319
booby
что за любовь к бессмысленному sql по пятницам...

в пятничных для меня часто не так важна ефективность

более интересно поглядеть на возможности фич напр с model, match_recognize, multiset и тд

....
stax
12 окт 18, 15:23    [21702634]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 17843
Elic
Я специально попросил удалить тему целиком.
Никогда не понимал модераторов, потворствующих ТС-ам в их самомнении, что они полные хозяева созданных ими тем.
Помнится, Маркеленков просил удаление своих ПОСТОВ
Все проще -- надо требовать удаления ТОПИКОВ, где встречались его посты
12 окт 18, 15:26    [21702643]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 16772
Stax
хотелось БЫ без collect
что-то аля
select rn,s from dual
  model
  dimension by (0 as rn)
  measures (0 s)
  rules iterate (13)


Проще простого :)
select i, Ai 
from ( select * from dual
        model ignore nav
        dimension by (0 i)
        measures (0 Ai, 0 t, 0 yy)
        rules iterate (11)
        ( 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
order by i
12 окт 18, 15:28    [21702645]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
j2k
Member

Откуда: Новосибирск
Сообщений: 525
А какое условие задачи? Получить ряд для N элементов на голом sql ?
12 окт 18, 15:30    [21702650]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
hayde
Member

Откуда:
Сообщений: 2
Stax
hayde,

я тоже сделал с || и in_str, но ж 4000 символов

.....
stax

Ну так ведь и NUMBER ограничен (:


На правах шутки:
+ 154 символа
select level i,n from(select &Z z,rownum-1n from xmltable('0to &Z*&Z'))where rownum<=z start with n=0connect by nocycle level-1=abs(n-prior n)and level<=z
12 окт 18, 15:31    [21702652]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9116
AmKad
Заинтриговал. Третий час с моделью бьюсь, победить не могу: cyclic/acyclic.


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.
12 окт 18, 15:35    [21702661]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1319
andrey_anonymous,

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

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

....
stax
12 окт 18, 15:43    [21702680]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 16772
Stax
буду осознавать

Из трюков там только смешанное использование dimension - как индекса последовательности Ai и как кэша встреченных значений последовательности t, собственно поэтому пришлось оборачивать в динамическое представление - отфильтровать Ai is not null...
12 окт 18, 15:52    [21702697]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5142
Вячеслав Любомудров
Все проще -- надо требовать
Не совсем понятно к чему это ёрничанье.
На Stack Overflow можно удалять свои темы, посты или редактировать их как угодно.
И ничего - живет ресурс. И что удивительно без взаимных тычков.
Диктатура имеет смысл только в определенных сообществах.
12 окт 18, 16:01    [21702712]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5142
Stax
текущую где-то запоминать
Очередная вариация
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)
)
12 окт 18, 16:25    [21702732]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 16772
dbms_photoshop
Stax
текущую где-то запоминать
Очередная вариация[/src]

Красиво, но размножение текущего значения по всей коллекции на каждой итерации смущает.
12 окт 18, 16:43    [21702743]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5142
andrey_anonymous,

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

PS.
Можно учитывать заполненность первой строки и уменьшить число итераций на одну,
при этом убрав ignore nav в предложенных вариантах с минимальными изменениями.
12 окт 18, 16:48    [21702750]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 16772
dbms_photoshop
Можно учитывать заполненность первой строки

Еще можно попробовать учесть тот факт, что минимальное возможное значение i-го элемента последовательности растет, что теоретисски допускает сокращение размера кэша значений.
min(Ai) over(order by i rows 10 preceding) m_i
12 окт 18, 17:02    [21702760]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 16772
dbms_photoshop
Да, решение с "душком".


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

Попробовал "вариацию" на 100000 итерациях - что-то оно "ушло в себя".
Вариант Соломона (с двойной итерацией) тоже.
Мой вариант уложился в 3 секунды.
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>  
12 окт 18, 17:13    [21702772]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5142
andrey_anonymous,

Трюк с nested cells не оставляет никаких шансов прочим проверкам.
12 окт 18, 17:20    [21702783]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9116
andrey_anonymous
Красиво, но размножение текущего значения по всей коллекции на каждой итерации смущает.


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

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> 


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

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.
12 окт 18, 18:18    [21702836]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 16772
SY
andrey_anonymous
Красиво, но размножение текущего значения по всей коллекции на каждой итерации смущает.

Без размножения:

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> 


Ммм?
12 окт 18, 18:26    [21702846]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9116
andrey_anonymous
Ммм?


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.
12 окт 18, 19:40    [21702898]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 16772
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


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

Угу.
Но сама идея мне понравилась, спасибо.
12 окт 18, 20:11    [21702915]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
SkilledJunior
Member

Откуда:
Сообщений: 126
booby
dbms_photoshop
...
это навело на мысли что тема создана не на подходящей площадке и подобное баловство стоит делать на соответствующих сайтах.
а я уж понадеялся, что ты понял неадекватность задачи
для решения её на "голом" sql, совсем без pl/sql.

Интересно было бы посмотреть на эффективное решение с помощью pl/sql и сравнить его по времени выполнения с вариантом SY.
13 окт 18, 02:01    [21703132]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
SkilledJunior
Member

Откуда:
Сообщений: 126
booby
Необходимая по условию проверка на существование,
на таком голом sql, которому нельзя заказать временное индексирование
уже набранных значений, гарантированно неэффективна.


Решение подобных задач и на pl/sql не эффективно, если памяти, для языка способного с ней работать напрямую, хватает чтобы закрыть максимальное значение ряда, то индексирование тоже неэффективно с точки зрения производительности.
13 окт 18, 13:48    [21703261]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
-2-
Member

Откуда:
Сообщений: 13834
SkilledJunior
booby
Необходимая по условию проверка на существование,
на таком голом sql, которому нельзя заказать временное индексирование
уже набранных значений, гарантированно неэффективна.
Решение подобных задач и на pl/sql не эффективно...
Не верю.
С остальными запятыми, кто на ком стоял, я разобраться не смог.
13 окт 18, 14:00    [21703266]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9116
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 можно создать два одноатрибутных массива и тогда отсеивать не нужно:

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> 


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.
13 окт 18, 16:15    [21703318]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
SkilledJunior
Member

Откуда:
Сообщений: 126
SY,

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

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;
14 окт 18, 01:14    [21703494]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
SkilledJunior
Member

Откуда:
Сообщений: 126
-2-
Не верю.
С остальными запятыми, кто на ком стоял, я разобраться не смог.

Выделяем область памяти, записываем в нее битовые флаги, число ряда преобразуется в адрес битового флага, по сути оно представляет собой смещение от начала выделенной области памяти. Для проверки существования числа в уже сформированном ряду нужно одно прямое чтение из памяти и извлечение из прочитанного битового флага, никаких массивов и индексаций, PL/SQL такое могёт?
14 окт 18, 01:31    [21703499]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
-2-
Member

Откуда:
Сообщений: 13834
SkilledJunior
и извлечение из прочитанного битового флага
Лишние сдвиги быстродействия не прибавят. Но, если взялся за третий критерий эффективности - объем памяти, давай и компрессию наворачивай.
SkilledJunior
PL/SQL такое могёт?
Работа с битами для plsql не проблема.
14 окт 18, 14:56    [21703632]     Ответить | Цитировать Сообщить модератору
 Re: Фотошоп, возвращай свою пятничную про последовательности  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5142
hayde
На правах шутки
Здесь проверяется цикличность и при сложении и при вычитании, а должна только при вычитании.
Соответственно 42 во второй раз не выбирается.
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, но при таком подходе цикличность вообще не будет проверяться.
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.
14 окт 18, 17:11    [21703661]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Oracle Ответить