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.
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?
Beispiel: Angenommen, die Gewichte lauten . An einem Punkt haben wir die Liste der letzten Zahlen und die gewichtete Summe .
Wenn eine andere Zahl, , empfangen wird, aktualisieren wir die Liste, um und wir müssen .
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.
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 ) )
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.
quelle
Antworten:
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 ,m m O(nlogn) m w i n a i t a t ' = 0 t ' > 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 = √m O(m) i O(i) O(m)+O(nlogn/m) O( √m=nlogn−−−−−√ O(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−−−−−√) m C T , p 2 m O ( m log m ) C ⌊ t / m ⌋ - p , p 0 ≤ p ≤ n / m - 1 O ( n / m + m
quelle