Gewichtete Summe der letzten N Zahlen

19

Angenommen, wir empfangen Zahlen in einem Stream. Nachdem jede Zahl empfangen wurde, muss eine gewichtete Summe der letzten Zahlen berechnet werden, wobei die Gewichte immer gleich, aber willkürlich sind.N

Wie effizient kann dies durchgeführt werden, wenn wir eine Datenstruktur zur Unterstützung der Berechnung beibehalten dürfen? Können wir etwas Besseres tun als , dh die Summe jedes Mal neu berechnen, wenn eine Zahl empfangen wird?Θ(N)

Beispiel: Angenommen, die Gewichte lauten . An einem Punkt haben wir die Liste der letzten Zahlen und die gewichtete Summe .W=w1,w2,w3,w4NL1=a,b,c,d>S1=w1a+w2b+w3c+w4d

Wenn eine andere Zahl, , empfangen wird, aktualisieren wir die Liste, um und wir müssen .eL2=b,c,d,eS2=w1b+w2c+w3d+w4e

Berücksichtigung der Verwendung von FFT Ein Sonderfall dieses Problems scheint durch die Verwendung der schnellen Fourier-Transformation effizient lösbar zu sein. Hier berechnen wir die gewogenen Summen ein Vielfaches von . Mit anderen Worten, wir erhalten Zahlen und können nur dann die entsprechenden gewogenen Summen berechnen . Dazu benötigen wir vergangene Zahlen (für die bereits Summen berechnet wurden) und neue Zahlen, insgesamt Zahlen.SNNNN1N2N1

Wenn dieser Vektor von Eingangszahlen und der Gewichtsvektor die Koeffizienten der Polynome und , wobei die Koeffizienten in umgekehrt sind, sehen wir, dass das Produkt ist Polynom, dessen Koeffizienten vor bis zu genau die gewichteten Summen sind, die wir suchen. Diese können mithilfe der FFT in berechnet werden. Dies ergibt einen Durchschnitt von average Zeit pro eingegebener Zahl.P ( x ) Q ( x ) Q P ( x ) × Q ( x ) × N - 1 × 2 N - 2( N log ( N ) ) ( log ( N ) )WP(x)Q(x)QP(x)×Q(x)xN1x2N2Θ(Nlog(N))Θ(log(N))

Dies ist jedoch keine Lösung für das angegebene Problem, da es erforderlich ist, dass die gewichtete Summe bei jedem Empfang einer neuen Zahl effizient berechnet wird - wir können die Berechnung nicht verzögern.

Ambroz Bizjak
quelle
Beachten Sie, dass Sie hier LaTeX verwenden können .
Raphael
Kommen die Eingaben von einer bekannten Distribution? Haben sie nützliche mathematische Eigenschaften? Wenn dies nicht der Fall ist, ist es unwahrscheinlich, dass dies möglich ist (es sei denn, jemand kann eine ordentliche geschlossene Form finden, die sublinear berechenbar ist - ich kann sicherlich keine finden). Sind auch Annäherungen in Ordnung? Das könnte ein Weg sein, wenn es für Sie überhaupt nützlich ist.
RDN
FIR-Filter tun dies, damit ihr Design relevant ist.
adrianN
@RDN Ich habe diese Frage aus Neugier gestellt und habe keine praktische Anwendung im Sinn.
Ambroz Bizjak

Antworten:

6

Hier ist eine Ausarbeitung Ihres Ansatzes. Alle Iterationen verwenden wir den FFT - Algorithmus zur Berechnung - Werte der Faltung in der Zeit , unter der Annahme , dass die nachfolgenden Werte sind Null. Mit anderen Worten, wir berechnen wobei die Gewichte sind (oder die umgekehrten Gewichte), ist die Eingabesequenz, ist die aktuelle Zeit und für .m O ( n log n ) m n - 1 Σ i = 0 w i ein t - i + k ,mmO(nlogn)mw i n a i t a t ' = 0 t ' > t

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

Für jede der folgenden Iterationen, wir sind in der Lage die erforderliche Faltung in der Zeit zu berechnen (der - ten Iteration benötigt Zeit ). Die amortisierte Zeit ist also . Dies wird durch Auswahl von minimiert , was eine amortisierte Laufzeit von ergibt .O ( m ) i O ( i ) O ( m ) + O ( n log n / m ) , m = mO(m)iO(i)O(m)+O(nlogn/m) O(m=nlognO(nlogn)

Wir können dies auf die Worst-Case-Laufzeit von verbessern, indem wir die Berechnung in Teile zerlegen. Fixiere und definiere Jedes hängt nur von Eingaben ab, sodass es in der Zeit berechnet werden kann . Wenn für , können wir auch die Faltung in der Zeit berechnen . Es ist daher geplant, die Liste Für jeden Zeitraum vonmb T , p , o = m - 1 Σ i = 0 w p m + i eine T m - i + o ,O(nlogn)mC T , p 2 m O ( m log m ) C t / m - p , p 0 p n / m - 1 O ( n / m + m

bT,p,o=i=0m1wpm+iaTmi+o,CT,p=bT,p,0,,bT,p,m1.
CT,p2mO(mlogm)Ct/mp,p0pn/m1C t / m - p , p ,O(n/m+m)
Ct/mp,p,0pn/m1.
mEingänge müssen wir von diesen aktualisieren . Jede Aktualisierung benötigt Zeit . Wenn wir diese Aktualisierungen also gleichmäßig verteilen, nimmt jede Eingabe Arbeit auf. . Zusammen mit der Berechnung der Faltung selbst beträgt die Zeitkomplexität pro Eingabe . Wenn Sie wie zuvor wählen, erhalten Sie .n/mO(mlogm)O((n/m2)mlogm)=O((n/m)logm)O((n/m)logm+m)m=nlognO(nlogn)
Yuval Filmus
quelle
Wunderbare Lösung, danke, ich war mir nicht wirklich sicher, ob es geht.
Ambroz Bizjak
Und es funktioniert! C-Implementierung: ideone.com/opuoMj
Ambroz Bizjak
Meh, mir fehlte das letzte Stück Code, durch das die Berechnung tatsächlich unterbrochen wird . Dies wurde hier behoben : ideone.com/GRXMAZ .
Ambroz Bizjak
Auf meinem Computer ist dieser Algorithmus ab etwa 17000 Gewichten schneller als der einfache Algorithmus. Bei kleinen Gewichtsmengen ist es langsam. Benchmark: ideone.com/b7erxu
Ambroz Bizjak
Sehr beeindruckend, dass Sie dies tatsächlich umgesetzt haben! Sie möchten wahrscheinlich über optimieren . Die Auswahl von ist nur eine grobe Richtlinie und möglicherweise nicht optimal. Haben Sie versucht, den Algorithmus mit verschiedenen Werten von auszuführen? m = m mm=nlognm
Yuval Filmus