Załóżmy, że otrzymujemy liczby w strumieniu. Po otrzymaniu każdej liczby należy obliczyć ważoną sumę ostatnich liczb, przy czym wagi są zawsze takie same, ale dowolne.
Jak skutecznie można to zrobić, jeśli pozwolimy zachować strukturę danych, która pomoże w obliczeniach? Czy możemy zrobić coś lepszego niż , tj. Przeliczać sumę za każdym razem, gdy liczba jest odbierana?
Na przykład: Załóżmy, że wagi to . W pewnym momencie mamy listę ostatnich liczb i ważoną sumę .
Po otrzymaniu innej liczby, , aktualizujemy listę, aby uzyskać i musimy obliczyć .
Rozważanie przy użyciu FFT Szczególny przypadek tego problemu wydaje się być do rozwiązania w wyniku skutecznego zastosowania szybkiej transformacji Fouriera. Tutaj obliczania sumy ważonych wielokrotność . Innymi słowy, otrzymujemy liczb i tylko wtedy możemy obliczyć odpowiednie ważonych sum. Aby to zrobić, potrzebujemy przeszłych liczb (dla których sumy zostały już obliczone) i nowych liczb, łącznie liczb.
Jeśli ten wektor liczb wejściowych i wektor ciężaru określają współczynniki wielomianów i , przy współczynnikach w odwróconym , widzimy, że iloczyn jest a wielomian, którego współczynniki przed do są dokładnie ważonymi sumami, których szukamy. Można je obliczyć za pomocą FFT w czasie , co daje nam średni czas Θ (\ log (N)) na liczbę wejściową.P ( x ) Q ( x ) Q P ( x ) × Q ( x ) x N - 1 x 2 N - 2 Θ ( N ∗ log ( N ) ) Θ ( log ( N ) )
Nie jest to jednak rozwiązanie problemu, jak stwierdzono, ponieważ wymagane jest, aby suma ważona była obliczana wydajnie za każdym razem, gdy otrzymywana jest nowa liczba - nie możemy opóźniać obliczeń.
źródło
Odpowiedzi:
Oto opracowanie twojego podejścia. Każdy iteracji używamy algorytm do obliczania FFT wartości zwoju w czasie , przy założeniu, że kolejne wartości zero. Innymi słowy, gdzie są wagami (lub wagi odwrotne), jest sekwencją wprowadzania, jest bieżącym czasem, a dla .m O ( n log n ) m n - 1 ∑ i = 0 w i a t - i + k ,m m O(nlogn) m w i n a i t a t ′ = 0 t ′ > t
Dla każdego z poniższych iteracji, że są w stanie wyliczyć wymagane splot w czasie (The tą iterację potrzebuje czasu, ). Tak więc zamortyzowany czas wynosi . Można to zminimalizować, wybierając , co daje zamortyzowany czas działania .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−−−−−√)
Możemy to poprawić do najgorszego czasu działania , dzieląc obliczenia na części. Napraw i zdefiniuj Każde zależy tylko od wejść, więc można je obliczyć w czasie . Ponadto, biorąc pod uwagę dla , możemy obliczyć splot w czasie . Dlatego planuje się utrzymanie listy Dla każdego okresumb T , p , o = m - 1 ∑ i = 0 w p m + i a T m - i + o ,O(nlogn−−−−−√) m C T , str
źródło