Son N sayısının ağırlıklı toplamı


19

Bir akışta numaralar aldığımızı varsayalım. Her sayı alındıktan sonra , ağırlıkların her zaman aynı, ancak keyfi olduğu son N sayılarının ağırlıklı bir toplamının hesaplanması gerekir.

Hesaplamaya yardımcı olacak bir veri yapısını korumamıza izin verilirse bu ne kadar verimli bir şekilde yapılabilir? den daha iyi yapabilir miyiz Θ(N), yani bir sayı her alındığında toplamı yeniden hesaplayabilir miyiz?

Örneğin: ağırlıkları varsayalım W=w1,w2,w3,w4 . Bir noktada son listesine sahip N numaraları L1=a,b,c,d> ve ağırlıklı toplamı S1=w1a+w2b+w3c+w4d .

Başka bir sayı, zaman e , alınan olduğu için, elde etmek için listeyi güncelleştirmek L2=b,c,d,e ve hesaplamak için gereken S2=w1*b+w2*c+w3*d+w4*e .

FFT Kullanarak Dikkat Edilmesi Gerekenler Bu sorunun özel bir durumu Hızlı Fourier Dönüşümü kullanılarak verimli bir şekilde çözülebilir görünmektedir. Burada, tartılmış toplamları N'ninS katları olarak hesaplıyoruz . Başka bir deyişle, N sayıları alırız ve ancak o zaman karşılık gelen N ağırlıklı toplamları hesaplayabiliriz . Bunu yapmak için, N - 1 geçmiş sayıya (toplamları zaten hesaplanmış olan) ve N yeni sayıya, toplam 2 N - 1 sayıya ihtiyacımız var.N-N-N-N--1N-2N--1

Giriş numaraları bu vektör, ve ağırlık vektörü ise W polinom katsayıları tanımlayan P(x) ve S(x) katsayılı, S ters, ürün görüyoruz P(x)xS(x) bir polinomdur xN--1 ile arasındaki katsayıları x2N--2tam olarak aradığımız ağırlıklı toplamlardır. Bunlar FFT giriş Θ ( N log) kullanılarak hesaplanabilirΘ(N-*günlük(N-)) süresi, bu da bizegirdi sayısı başınaortalamasüresi verir.Θ(günlük(N-))

Ağırlıklı toplam verimli bir şekilde hesaplanır olması gereklidir, çünkü, belirtildiği gibi, ancak sorun çözüm değildir her yeni bir numara alındıktan sonra - hesaplamayı gecikme olamaz.


Burada LaTeX'i kullanabileceğinizi unutmayın .
Raphael

Girdiler bilinen bazı dağıtımlardan mı geliyor? Herhangi bir yararlı matematik özellikleri var mı? Eğer yapmazlarsa, bunun mümkün olması olası değildir (birisi alt doğrusal hesaplanabilir düzgün bir kapalı form bulamazsa - kesinlikle bir tane bulamıyorum). Ayrıca, yaklaşımlar iyi mi? Bu sizin için yararlı olursa gitmek için bir yol olabilir.
RDN

FIR filtreleri bunu yapar, böylece tasarımları alakalı olacaktır.
adrianN

@RDN Bu soruyu bir merak olarak sordum, aklımda pratik bir uygulama yok.
Ambroz Bizjak

Yanıtlar:


6

İşte yaklaşımınızın bir detayı. Her yinelemesinde, sonraki m değerlerinin sıfır olduğu varsayılarak, O ( n log n ) zamanındaki evrişimin m değerlerini hesaplamak için FFT algoritmasını kullanırız . Başka bir deyişle, n - 1 i = 0 w i a t - i + k hesaplıyoruz ,mmO(nlogn)mw ı olan , n ağırlıkları (ya da tersine ağırlık), bir i , giriş dizisidir t , mevcut zaman ve bir t ' = 0 için t ' > t .

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

Aşağıdaki iterasyonlarının her biri için , O ( m ) zamanında gerekli dönüşümü hesaplayabiliriz ( i yinelemesi O ( i ) zamanına ihtiyaç duyar ). Dolayısıyla amortisman süresi O ( m ) + O ( n log n / m ) 'dir . Bu m = seçilerek en aza indirilirmO(m)iO(i)O(m)+O(nlogn/m) ,O'nunamortismanlı çalışma süresini verir(m=nlogn.O(nlogn)

Bunu O'nun en kötü çalışma süresine iyileştirebiliriz ( hesaplamayı parçalara ayırarak. Düzeltmemve tanımlar b , T , P , O = m - 1 Σ i = 0 ağırlık p m + i , bir T m - i + o ,O(nlogn)m Her bir C T , p sadece 2 m girişlerebağlıdır, bu nedenle O zamanında hesaplanabilir ( m log m ) . Aynı zamanda, belirli birt / m - p , p için 0 p n

bT,p,o=i=0m1wpm+iaTmi+o,CT,p=bT,p,0,,bT,p,m1.
CT,p2mÖ(mgünlükm)Ct/m-p,p , O ( n / m + m ) zamanında evrişimi hesaplayabiliriz. Plan Dolayısıyla liste sağlamaktır C t / m - p , s ,0pn/m-1Ö(n/m+m) Her m girişperiyodu için bunların n / m değerini güncellememiz gerekir. Her güncelleme O ( m log m ) süresine sahiptir, bu nedenle bu güncellemeleri eşit olarak dağıtırsak, her giriş O ( ( n / m 2 ) m log m ) = O ( ( n / m ) log m )
Ct/m-p,p,0pn/m-1.
mn/mÖ(mgünlükm)Ö((n/m2)mgünlükm)=Ö((n/m)günlükm). Evrişimin kendisinin hesaplanmasıyla birlikte, girdi başına zaman karmaşıklığı . M = seçimiÖ((n/m)günlükm+m) eskisi gibi, buO(m=ngünlükn.Ö(ngünlükn)

Harika bir çözüm, teşekkürler, yapılabileceğinden gerçekten emin değildim.
Ambroz Bizjak

Ve çalışıyor! C uygulaması: ideone.com/opuoMj
Ambroz Bizjak

Meh, aslında hesaplamayı bozan son kod biraz eksik, burada ideone.com/GRXMAZ sabit .
Ambroz Bizjak

Makinemde bu algoritma, yaklaşık 17000 ağırlıktaki basit algoritmadan daha hızlı olmaya başlıyor. Az sayıda ağırlık için yavaştır. Deney: ideone.com/b7erxu
Ambroz Bizjak

mm=nlognm
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.