Взвешенная сумма последних N чисел


19

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

Насколько эффективно это можно сделать, если нам разрешено сохранять структуру данных, чтобы помочь с вычислениями? Можем ли мы сделать что-то лучше, чем Θ(N) , то есть пересчитывать сумму при каждом получении числа?

Например: Предположим , что веса W=w1,w2,w3,w4 . В какой -то момент мы имеем список последних N чисел L1=a,b,c,d> , а взвешенная сумма S1знак равновес1*a+вес2*б+вес3*с+вес4*d .

Когда другой номер, е , получена, мы обновить список , чтобы получить L2знак равноб,с,d,е и нам нужно вычислить S2знак равновес1*б+вес2*с+вес3*d+вес4*е .

Рассмотрение использования БПФ . Особый случай этой проблемы, по-видимому, эффективно решается с помощью быстрого преобразования Фурье. Здесь мы вычислим взвешенные суммы в упаковке N . Другими словами, мы получаем N чисел, и только тогда мы можем вычислить соответствующие N взвешенных сумм. Для этого нам нужно N - 1 прошлых чисел (для которых суммы уже были вычислены) и N новых чисел, всего 2 N - 1 чисел.SNNNN-1N2N-1

Если этот вектор входных чисел и весовой вектор определяют коэффициенты многочленов P ( x ) и Q ( x ) с обратными коэффициентами в Q , мы видим, что произведение P ( x ) × Q ( x ) является полиномом чьи коэффициенты перед x N - 1 до x 2 N - 2 - это именно те взвешенные суммы, которые мы ищем. Они могут быть вычислены с использованием БПФ в Θ ( N logWп(Икс)Q(Икс)Qп(Икс)×Q(Икс)ИксN-1Икс2N-2 времени, что дает нам в среднем thetas ; ( журнала ( N ) ) раз в номер входа.Θ(N*журнал(N))Θ(журнал(N))

Это, однако, не является решением проблемы, как указано, потому что требуется, чтобы взвешенная сумма вычислялась эффективно каждый раз, когда принимается новое число - мы не можем задержать вычисление.


Обратите внимание, что вы можете использовать LaTeX здесь.
Рафаэль

Входят ли из какого-то известного распределения? Есть ли у них полезные математические свойства? Если они этого не делают, то маловероятно, что это возможно (если кто-то не может найти аккуратную замкнутую форму, которая является сублинейной вычислимой - я, конечно, не могу ее найти). Кроме того, приближения в порядке? Это может быть одним из способов, если это вообще полезно для вас.
RDN

КИХ-фильтры делают это, поэтому их дизайн будет актуален.
adrianN

@ RDN Я поставил этот вопрос как любопытство, я не имею в виду практическое применение.
Амброз Бизжак

Ответы:


6

Вот разработка вашего подхода. Каждые итераций мы используем алгоритм FFT для вычисления m значений свертки за время O ( n log n ) , предполагая, что последующие m значений равны нулю. Другими словами, мы вычисляем n - 1 i = 0 w i a t - i + k ,ммО(NжурналN)м где w i - это n весов (или обратных весов), a i - входная последовательность, t - текущее время и a t = 0 для t > t .

Σязнак равно0N-1весяaT-я+К,0Км-1,
весяNaяTaT'знак равно0T'>T

Для каждой из следующих итераций мы можем рассчитать требуемую свертку за время O ( m ) (для i- й итерации требуется время O ( i ) ). Таким образом, амортизированное время составляет O ( m ) + O ( n log n / m ) . Это минимизируется путем выбора m = мО(м)яО(я)О(м)+О(NжурналN/м) , который дает амортизированное время работыO(мзнак равноNжурналN.О(NжурналN)

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

бT,п,ознак равноΣязнак равно0м-1веспм+яaTм-я+о,СT,пзнак равнобT,п,0,...,бT,п,м-1,
СT,п2мО(мжурналм)СT/м-п,п , мы можем вычислить свертку за время O ( n / m + m ) . Поэтому план состоит в том, чтобы сохранить список C t / m - p , p ,0пN/м-1О(N/м+м) Для каждого периода из m входов нам необходимо обновить n / m из них. Каждое обновление занимает время O ( m log m ) , поэтому, если мы распространим эти обновления равномерно, каждый вход займет работу O ( ( n / m 2 ) m log m ) = O ( ( n / m ) log m )
СT/м-п,п,0пN/м-1.
мN/мО(мжурналм)О((N/м2)мжурналм)знак равноО((N/м)журналм), Вместе с вычислением самой свертки временная сложность на вход составляет . Выбор м = О((N/м)журналм+м) как и раньше, это даетO(мзнак равноNжурналN.О(NжурналN)

Замечательное решение, спасибо, я не был уверен, можно ли это сделать.
Амброз Бизжак

И это работает! Реализация на C: ideone.com/opuoMj
Амброз Бизжак

Мех, мне не хватало того последнего куска кода, который фактически делает его разбивающим вычисления, зафиксированные здесь ideone.com/GRXMAZ .
Амброз Бизжак

На моей машине этот алгоритм начинает работать быстрее простого алгоритма на 17000 весах. Для небольшого количества весов это медленно. Тест: ideone.com/b7erxu
Амброз Бижак

ммзнак равноNжурналNм
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.