Зважена сума останніх N чисел


19

Припустимо, ми отримуємо номери в потоці. Після отримання кожного числа необхідно обчислити зважену суму останніх чисел, де ваги завжди однакові, але довільні.N

Наскільки ефективно це можна зробити, якщо нам дозволяють зберігати структуру даних, щоб допомогти в обчисленні? Чи можемо ми зробити краще, ніж , тобто перерахувати суму щоразу, коли число отримане?Θ(N)

Наприклад: Припустимо, ваги . В один момент ми маємо список останніх чисел , і зважена сума .Н L 1 = в , б , з , д > S 1 = W 1 * + ш 2 * б + ш 3 * з + ш 4 * гW=w1,w2,w3,w4NL1=a,b,c,d>S1=w1a+w2b+w3c+w4d

Коли буде отримано інше число, , ми оновлюємо список, щоб отримати і нам потрібно обчислити .л 2 = б , з , д , е S 2 = ш 1eL2=b,c,d,eS2=w1b+w2c+w3d+w4e

Розгляд використання FFT Особливий випадок цієї проблеми, як видається, вирішується ефективно шляхом використання Швидкої перетворення Фур'є. Тут ми обчислимо зважені суми в упаковці . Іншими словами, ми отримуємо чисел і тільки тоді ми можемо обчислити відповідні зважених сум. Для цього нам потрібні минулі номери (для яких вже були обчислені суми) та нових чисел, загалом числа.NSNNNN1N2N1

Якщо цей вектор вхідних чисел і ваговий вектор визначають коефіцієнти многочленів і , а коефіцієнти в зворотні, ми бачимо, що добуток є a многочлен, коефіцієнти якого перед до це саме зважені суми, яких ми шукаємо. Їх можна обчислити, використовуючи FFT за час, що дає нам у середньому час на номер введення.WP(x)Q(x)QP(x)×Q(x)xN1x2N2Θ(Nlog(N))Θ(log(N))

Це, однак, не є вирішенням проблеми, як заявлено, оскільки потрібно, щоб зважена сума була ефективно обчислена щоразу, коли надходило нове число - ми не можемо затримувати обчислення.


Зауважте, що ви можете використовувати LaTeX тут.
Рафаель

Чи надходять дані з якогось відомого розподілу? Чи мають вони якісь корисні математичні властивості? Якщо вони цього не роблять, то це малоймовірно, що це можливо (якщо хтось не зможе знайти акуратну закриту форму, яка є підлінійною для обчислення - я, звичайно, не можу її знайти). Крім того, чи наближення добре? Це може бути один із способів, якщо він взагалі корисний для вас.
RDN

FIR-фільтри роблять це, тому їх дизайн буде актуальним.
adrianN

@RDN Я поставив це питання як цікавість, я не маю на увазі практичного застосування.
Ambroz Bizjak

Відповіді:


6

Ось розробка вашого підходу. Кожні ітерації ми використовуємо алгоритм FFT для обчислення m значень згортки за час O ( n log n ) , вважаючи, що наступні m значення дорівнюють нулю. Іншими словами, ми обчислюємо n - 1 i = 0 w i a t - i + k ,mmO(nlogn)m де ш я є п ваги (або зворотні ваги), я це вхідна послідовність, т поточного часу і т ' = 0 для т ' > т .

i=0n1wiati+k,0km1,
winaitat=0t>t

Для кожної з наступних ітерацій ми можемо обчислити необхідну згортання у часі O ( m ) (для i- ї ітерації потрібен час O ( i ) ). Отже, амортизований час становить O ( m ) + O ( n log n / m ) . Це зводиться до мінімуму, вибираючи m = mO(m)iO(i)O(m)+O(nlogn/m) , що дає амортизований час роботиO(m=nlogn.O(nlogn)

Ми можемо покращити це до найгіршого часу роботи шляхом розбиття обчислення на частини. Зафіксуйтеmі визначте b T , p , o = m - 1 i = 0 w p m + i a T m - i + o ,O(nlogn)m Кожен C T , p залежить лише від 2 м входів, тому його можна обчислити за час O ( m log m ) . Також, враховуючи C t / m - p , p при 0 p n

bT,p,o=i=0m1wpm+iaTmi+o,CT,p=bT,p,0,,bT,p,m1.
CT,p2mO(mlogm)Ct/mp,p , ми можемо обчислити згортку в часі O ( n / m + m ) . Таким чином, план полягає у підтримці списку C t / m - p , p ,0pn/m1O(n/m+m) Для кожного періоду m входів нам необхідно оновлювати n / m з них. Кожне оновлення потребує часу O ( m log m ) , тому якщо ми розподілимо ці оновлення рівномірно, кожен вхід займе роботу O ( ( n / m 2 ) m log m ) = O ( ( n / m ) log m )
Ct/mp,p,0pn/m1.
mn/mO(mlogm)O((n/m2)mlogm)=O((n/m)logm). Разом із обчисленням самої згортки часова складність на вхід становить . Вибір m = O((n/m)logm+m) як і раніше, це даєO(m=nlogn.O(nlogn)

Чудове рішення, дякую, я не був дуже впевнений, чи можна це зробити.
Ambroz Bizjak

І це працює! Реалізація C: ideone.com/opuoMj
Ambroz Bizjak

Мех, мені не вистачало того останнього біта коду, який насправді змушує розбити обчислення, зафіксований тут ideone.com/GRXMAZ .
Ambroz Bizjak

На моїй машині цей алгоритм починає бути швидшим, ніж простий алгоритм з приблизно 17000 вагами. Для невеликої кількості ваг це повільно. Орієнтир: ideone.com/b7erxu
Ambroz Bizjak

mm=nlognm
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.