Misalkan kita menerima angka dalam aliran. Setelah setiap angka diterima, jumlah tertimbang dari angka terakhir perlu dihitung, di mana bobot selalu sama, tetapi sewenang-wenang.
Seberapa efisien hal ini dapat dilakukan jika kita diizinkan menyimpan struktur data untuk membantu perhitungan? Bisakah kita melakukan yang lebih baik daripada , yaitu menghitung ulang jumlah setiap kali nomor diterima?
Sebagai contoh: Misalkan bobot yang . Pada satu titik kita memiliki daftar terakhir nomor , dan jumlah tertimbang .
Ketika nomor lain, , diterima, kami memperbarui daftar untuk mendapatkan dan kita perlu menghitung .
Pertimbangan menggunakan FFT Kasus khusus masalah ini tampaknya dapat dipecahkan secara efisien dengan menggunakan Fast Fourier Transform. Di sini, kita menghitung jumlah ditimbang dalam kelipatan . Dengan kata lain, kita menerima angka dan baru kemudian kita dapat menghitung jumlah ditimbang sesuai . Untuk melakukan ini, kita membutuhkan angka yang lalu (yang jumlahnya telah dihitung), dan angka baru, total angka N - 1 .
Jika vektor bilangan masukan dan vektor berat menentukan koefisien polinomial dan , dengan koefisien dalam terbalik, kita melihat bahwa produk adalah polinomial yang koefisiennya di depan hingga adalah jumlah tertimbang yang kami cari. Ini dapat dihitung menggunakan FFT di waktu, yang memberi kami rata-rata waktuper nomor input.
Namun ini bukan solusi masalah seperti yang disebutkan, karena diperlukan bahwa jumlah tertimbang dihitung secara efisien setiap kali nomor baru diterima - kami tidak dapat menunda perhitungan.
sumber
Jawaban:
Berikut ini adalah penjabaran dari pendekatan Anda. Setiap iterasi, kita menggunakan algoritma FFT untuk menghitung nilai-nilai konvolusi dalam waktu , dengan asumsi bahwa selanjutnya nilai-nilai nol. Dengan kata lain, kami menghitung mana adalah bobot (atau timbangan terbalik), adalah urutan input, adalah waktu saat ini, dan untuk .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
Untuk setiap iterasi berikut , kami dapat menghitung konvolusi yang diperlukan dalam waktu ( iterasi ke- membutuhkan waktu ). Jadi waktu yang diamortisasi adalah . Ini diminimalkan dengan memilih , yang memberikan waktu berjalan diamortisasi .m O(m) i O(i) O(m)+O(nlogn/m) m=nlogn−−−−−√ O(nlogn−−−−−√)
Kami dapat meningkatkan ini ke waktu berjalan terburuk dengan memecah komputasi menjadi beberapa bagian. Perbaiki , dan tentukan Setiap hanya bergantung pada input , sehingga dapat dihitung dalam waktu . Juga, mengingat untuk , kita dapat menghitung konvolusi dalam waktu . Karena itu, rencananya adalah mempertahankan daftar Untuk setiap periodeO(nlogn−−−−−√) m C T , hlm
sumber