Nouzui Лучше использовать сравнение >= max Хотя для вещественных чисел совпадение маловероятно, но все же так логичнее - при совпадении c max индекс maxi будет передвигаться дальше от начала окна
Nouzui На коленке... Размер maxindex'а можно подобрать по данным. P.S. Добавлено чуть позже: // (*(maxindex) == i - k) *(++maxindex) = *(maxindex); - сразу не подумал
t00x Можно, но не нужно, т.к. ты упорно продолжаешь решать свою задачку поиска максимума на растущем интервале 1..i, а нужно на скользящем интервале фиксированного размера i-k..i, где k=10000
Miller Rabin мой алгос считает массивы выровненые по границе, а у Pavia именно идёт поиск макс./мин. в окне на каждом шаге - это совершенно разные вещи.
t00x Потому, что задача так поставлена изначально - выдать Max и Min на скользящем интервале, т.е. показать динамику их изменения во времени. А у тебя что получается - если где-то в начале массива попадется самый большой максимум, то он так и останется до конца массива, хотя по условию задачи мы должны его выбросить когда он выйдет за пределы окна
запоздало пришло в голову, что я загнался с размерностями - там, где у меня в коде встречалось n-k нужно писать n-k+1
leo Sorry. Добавил строчку чуть позже. Nouzui Это понятно. leo P.S. Поторопился. P.P.S. Или добавить ещё массив, в который записывать индексы если *p<*p[i+1]. Потом по нему считать 10000.
leo Код (Text): template<class T, int n, int k> void func(/*IN*/ T (*p)[n], /*OUT T(*p1)[n-k]*/ OUT T(*maxindex)[n]) { int i, j, m; T max, gmax; max = MINDOUBLE; gmax = max; int* localindex[k]; for(i= 0; i<n; i++) { if (*p[i]>max) { // save max index *(maxindex++) = i; if (*p[i] > gmax) { gmax = *p[i]; // globalMax m = 0; // index in table localindex } else { *(localindex[m++]) = i; } } if (*(maxindex) == i - k) { for (j = 0; j < m; j++) if (*p[localindex[j]] > max) *(maxindex) = localindex[j]; // k = 10000 gmax = *p[*(maxindex)]; //globalmax = last max m = 0; } } } Это с массивом localindex и переменной gmax, m - индекс для localindex. Если меньше gmax'а - индекс в localindex, в котором будем искать max(10000).
Вот он код, тот, что есть оптимизированный вариант. Miller Rabin - а ты мужчина или женщина ? я просто перечитывал твои сообщения и никак немогу понять Код (Text): struct RatesInfo ctm dd ? open dq ? low dq ? hihg dq ? close dq ? vol dq ? ends ;Rates - массив с элементами, каждый элемент представляет собой структуру RatesInfo (из неё нужен только "close") ;buffer_size - Количество элементов в массиве ;Length - длинна окна proc X Rates, buffer_size, Length local __Highest:QWORD, __Lowest:QWORD, \ __IndexLast:DWORD, __IndexLowest:DWORD, \ __IndexHighest:DWORD, __StartTicks:DWORD push ebx ecx edx esi edi ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; invoke GetTickCount mov dword [__StartTicks], eax ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; mov esi, [Rates] mov ecx, [buffer_size] cmp ecx, [Length] jb .ret cmp [Length], 0 je .ret stdcall StepUp, sizeof.RatesInfo, [Length] add esi, eax sub eax, sizeof.RatesInfo mov dword [__IndexLast], eax stdcall StepUp, sizeof.RatesInfo.close, [Length] add edi, eax sub ecx, [Length] finit push ecx edi lea ebx, [__Highest] lea edx, [__Lowest] lea ecx, [__IndexHighest] lea edi, [__IndexLowest] stdcall GetHighestLowest, esi, [Length], ebx, edx, ecx, edi pop edi ecx .lp: mov eax, esi sub eax, dword [__IndexLast] cmp dword [__IndexHighest], eax jb .recount cmp dword [__IndexLowest], eax jb .recount fld qword [esi + RatesInfo.close] fcom qword [__Highest] fstsw ax sahf jna .ch_low fst qword [__Highest] mov dword [__IndexHighest], esi .ch_low: fcom qword [__Lowest] fstsw ax sahf jnb .fcompare fst qword [__Lowest] mov dword [__IndexLowest], esi .fcompare: fstp st0 jmp .ecompare .recount: push ecx edi lea ecx, [__IndexHighest] lea edi, [__IndexLowest] stdcall GetHighestLowest, esi, [Length], ebx, edx, ecx, edi pop edi ecx ; в этом месте значения локальных переменных __Highest, _Lowest соответственно ; содержат пминимальное и максимальное значение (за окно Length) для текущего элемента массива add esi, sizeof.RatesInfo dec ecx jnz .lp .ret: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; invoke GetTickCount sub eax, dword [__StartTicks] ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; pop edi esi edx ecx ebx ret endp proc GetHighestLowest Rates, Length, lpHighest, lpLowest, lpIndexHighest, lpIndexLowest push ebx ecx edx esi mov ebx, dword [lpHighest] mov edx, dword [lpLowest] mov ecx, dword [Length] fld qword [esi + RatesInfo.close] fst qword [ebx] fstp qword [edx] mov eax, dword [lpIndexHighest] mov dword [eax], esi mov eax, dword [lpIndexLowest] mov dword [eax], esi sub esi, sizeof.RatesInfo dec ecx jz .ret .lp: fld qword [esi + RatesInfo.close] fcom qword [ebx] fstsw ax sahf jna .ch_low fst qword [ebx] mov eax, dword [lpIndexHighest] mov dword [eax], esi .ch_low: fcom qword [edx] fstsw ax sahf jnb .continue fst qword [edx] mov eax, dword [lpIndexLowest] mov dword [eax], esi .continue: fstp st0 sub esi, sizeof.RatesInfo dec ecx jnz .lp .ret: pop esi edx ecx ebx ret endp proc StepUp __Size, __Steps push ebx ecx edx mov eax, dword [__Size] mov ebx, dword [__Steps] mul ebx pop edx ecx ebx ret endp
Miller Rabin Для того, что бы тебе понять мою квалификаию по поводу кода, зайди на www.linuxassembly.org на этот сайт помещен мой проект Traffic Accounting (traffic accounting daemon), это биллинговая система (учет интернет-трафика) написанная под Linux на nasm. В ней заложены более 100 различных функций для учета, это самый мощный из свободных проектов по учету трафика, и написан на assembler от начала до конца. Правда в последствии он был мною же переписан на С, для совместимости с другими процессорами т.к. вести проект для разных систем, одному человеку было черезчур затратно по времени. Это один из 18 проектов выложенных на этот сайт за несколько лет. Конечно проект сейчас я не продолжаю, нет времени, и пишу на разных языках, и переходя от одного к одному где то я не напишу так продуктивно, как если бы писал постоянно на одном и том же. Но меня устраивают мои результаты. Поэтому дорогой Miller Rabin, если ты выложишь свои доказательства и т.п. твоей квалификации то я поверю, а твой университет можешь засунуть себе именно туда куда ты засовывал мои "секунды". Я занимаюсь исседованиями в области финансового рынка, в частности о том как деньги влияют на людей, что происходит с человеком когда он получает или зарабатывать начинает определенные суммы практически ничего не делая, как меняется его сознание. Проводился такой эксперимент - были набраны люди из низкой социальной группы (бездомные, бомжи и т.п.), каждому из них был выделен отдельный компьютер на котором запущен торговый терминал валютной биржи, было обяснено каким образом кликая мышкой можно заработать деньги. И бомжи зарабатывали деньги! Как говорится не отходя от кассы, по простой торговой системе. Далее эти отчеты по сделкам были показаны начальниками отделов по ценным бумагам нескольким Управляющим Компаниям, и какого же было их удивление когда их самые лучшие трейдеры торговали хуже и зарабатывали меньше, со своим хваленым образованием, чам бомжи и пьяницы!! Удивление одной было настолько сильное что встал даже вопрос об увольнении комманды трейдеров. Так же после этого была создана компания где управляющими были бомжи, но она не имела успеха так как люди не доверяли, и в этом ничео удивительного, ты доверишь свои 100 тыс. USD бомжу ? На эту тему была защищена научная диссертация в области медицины (о влиянии денег на людей). При этом побочный эффект эксперимента привел к следующему - ЧЕМ БОЛЬШЕ ЧЕЛОВЕК ЗНАЕТ ТЕМ НИЖЕ У НЕГО РЕЗУЛЬТАТ (твоя Miller Rabin проблема), надо работать с собой определенным образом для того чтобы обстрагироваться от знаний и пользоваться ими в определенное время. И поэтому хваленые трейдеры проигрывали на рынке т.к. в голове у них много систем и знаний, определиться с выбором того или иного действия становится тем тяжелее чем их больше, и будут проигрывать, я то знаю, не один год в этом. Есть компании которые что то зарабатывают их их клиенты довольны но там простая стратегия купил-держи до роста, поэтому они и на плаву. Ты не составляешь даже 10 процентов от моей квалификаици в общем. Я знаю таких как ты, долго изучал людей и их поведение. Ты что то подобное сделал Miller Rabin, кроме окончания университета, как миллионы бомжей ? - сомневаюсь. Поэтому веди себя по человечески справедливо, и жизнь (природа/бог), тебя наградит поверь мне. Ничто не ново под луной.
Yashin_Sergey кстати, вопрос от тех кто давно не занимался асмом (тоесть от меня -)) ты мин. и макс. в одном цикле считаешь??
/offtop Бандиты отнимают деньги. Убийцы отнимают жизни. Медики отнимают и то и другое. современный юмор
Да, у меня в одном цикле считаются мин. и макс. одновременно. Здесь странного ничего нет так как мин. ничем по СУТИ не отличается от макс, поэтому зачем циклить два раза когда можно найти за один цикл, т.к. минимум и максимум могут быть равны, например.
Это правда можно разделить, для больших окон от (100 элементов) вероятность очень маленькая, но на меньших окнах вероятность растет, смотря на данных какого периода использовать (это уже свойства самих данных для конкретной задачи). Да и потом, так как цикл всё равно проходит один раз, то убрав одну "лишнюю" проверку на макс. или мин. заметного прироста в скорости не будет, поэтому я и не разделял.