Jumlah tertimbang dari angka N terakhir


19

Misalkan kita menerima angka dalam aliran. Setelah setiap angka diterima, jumlah tertimbang dari angka terakhir Nperlu 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 Θ(N) , yaitu menghitung ulang jumlah setiap kali nomor diterima?

Sebagai contoh: Misalkan bobot yang W=w1,w2,w3,w4 . Pada satu titik kita memiliki daftar terakhir N nomor L1=a,b,c,d> , dan jumlah tertimbang S1=w1a+w2b+w3c+w4d .

Ketika nomor lain, e , diterima, kami memperbarui daftar untuk mendapatkan L2=b,c,d,e dan kita perlu menghitung S2=w1b+w2c+w3d+w4e .

Pertimbangan menggunakan FFT Kasus khusus masalah ini tampaknya dapat dipecahkan secara efisien dengan menggunakan Fast Fourier Transform. Di sini, kita menghitung jumlah ditimbang S dalam kelipatan N . Dengan kata lain, kita menerima angka N dan baru kemudian kita dapat menghitung jumlah ditimbang sesuai N. Untuk melakukan ini, kita membutuhkan N1 angka yang lalu (yang jumlahnya telah dihitung), dan N angka baru, total 2N1 angka N - 1 .

Jika vektor bilangan masukan dan vektor berat W menentukan koefisien polinomial P(x) dan Q(x) , dengan koefisien dalam Q terbalik, kita melihat bahwa produk P(x)×Q(x) adalah polinomial yang koefisiennya di depan xN1 hingga x2N2 adalah jumlah tertimbang yang kami cari. Ini dapat dihitung menggunakan FFT di Θ(Nlog(N)) waktu, yang memberi kami rata-rata waktuper nomor input.Θ(log(N))

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.


Perhatikan bahwa Anda dapat menggunakan LaTeX di sini.
Raphael

Apakah input berasal dari beberapa distribusi yang dikenal? Apakah mereka memiliki sifat matematika yang berguna? Jika tidak, maka tidak mungkin hal ini dimungkinkan (kecuali seseorang dapat menemukan formulir tertutup yang rapi yang dapat dihitung sublinear - saya tentu saja tidak dapat menemukannya). Juga, apakah perkiraannya baik-baik saja? Itu mungkin salah satu cara untuk pergi jika bermanfaat bagi Anda sama sekali.
RDN

Filter FIR melakukan ini, sehingga desainnya akan relevan.
adrianN

@RDN Saya mengajukan pertanyaan ini sebagai rasa ingin tahu, saya tidak memiliki aplikasi praktis dalam pikiran.
Ambroz Bizjak

Jawaban:


6

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 ,mmO(nlogn)mw i n a i t a t = 0 t > t

i=0n1wiati+k,0km1,
winaitat=0t>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 .mO(m)iO(i)O(m)+O(nlogn/m)m=nlognO(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)mC T , hlm

bT,p,o=i=0m1wpm+iaTmi+o,CT,p=bT,p,0,,bT,p,m1.
CT,p2mO(mlogm)Ct/mp,p0pn/m1O(n/m+m)m n / m O ( m log m ) O ( ( n
Ct/mp,p,0pn/m1.
minput, kita perlu memperbarui ini. Setiap pembaruan membutuhkan waktu , jadi jika kami menyebarkan pembaruan ini secara merata, setiap input akan membutuhkan kerja . Bersama dengan menghitung konvolusi itu sendiri, kompleksitas waktu per input adalah . Memilih seperti sebelumnya, ini menghasilkan .n/mO(mlogm)O((n/m2)mlogm)=O((n/m)logm)O((n/m)logm+m)m=nlognO(nlogn)

Solusi yang bagus, terima kasih, saya tidak begitu yakin apakah itu bisa dilakukan.
Ambroz Bizjak

Dan itu berhasil! Pelaksanaan C: ideone.com/opuoMj
Ambroz Bizjak

Meh, saya kehilangan kode terakhir yang benar-benar membuatnya memecah perhitungan, diperbaiki di sini ideone.com/GRXMAZ .
Ambroz Bizjak

Di mesin saya, algoritma ini mulai lebih cepat daripada algoritma sederhana di sekitar 17000 bobot. Untuk sejumlah kecil bobot lambat. Benchmark: ideone.com/b7erxu
Ambroz Bizjak

mm=nlognm
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.