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


19

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

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

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

Коли буде отримано інше число, , ми оновлюємо список, щоб отримати і нам потрібно обчислити .л 2 = ⟨ б , з , д , е ⟩ S 2 = ш 1eL2=⟨b,c,d,e⟩S2=w1∗b+w2∗c+w3∗d+w4∗e

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

Якщо цей вектор вхідних чисел і ваговий вектор визначають коефіцієнти многочленів і , а коефіцієнти в зворотні, ми бачимо, що добуток є a многочлен, коефіцієнти якого перед до це саме зважені суми, яких ми шукаємо. Їх можна обчислити, використовуючи FFT за час, що дає нам у середньому час на номер введення.WP(x)Q(x)QP(x)×Q(x)xN−1x2N−2Θ(N∗log⁡(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(nlog⁡n)m де ш я є п ваги (або зворотні ваги), я це вхідна послідовність, т поточного часу і т ' = 0 для т ' > т .

∑i=0n−1wiat−i+k,0≤k≤m−1,
winaitat′=0t′>t

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

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

bT,p,o=∑i=0m−1wpm+iaTm−i+o,CT,p=bT,p,0,…,bT,p,m−1.
CT,p2mO(mlog⁡m)C⌊t/m⌋−p,p , ми можемо обчислити згортку в часі O ( n / m + m ) . Таким чином, план полягає у підтримці списку C ⌊ t / m ⌋ - p , p ,0≤p≤n/m−1O(n/m+m) Для кожного періоду m входів нам необхідно оновлювати n / m з них. Кожне оновлення потребує часу O ( m log m ) , тому якщо ми розподілимо ці оновлення рівномірно, кожен вхід займе роботу O ( ( n / m 2 ) m log m ) = O ( ( n / m ) log m )
C⌊t/m⌋−p,p,0≤p≤n/m−1.
mn/mO(mlog⁡m)O((n/m2)mlog⁡m)=O((n/m)log⁡m). Разом із обчисленням самої згортки часова складність на вхід становить . Вибір m = √O((n/m)log⁡m+m) як і раніше, це даєO( √m=nlog⁡n.O(nlog⁡n)

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

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

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

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

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