1
最後のN個の数値の加重合計
ストリームで数値を受け取っているとします。各数値を受信した後、最後の数値の加重合計を計算する必要があります。加重は常に同じですが、任意です。NNN 計算を支援するためにデータ構造を保持することが許可されている場合、これはどの程度効率的に実行できますか?よりも良いこと、つまり数字を受け取るたびに合計を再計算することはできますか?Θ(N)Θ(N)\Theta(N) 例:重みがます。ある時点で、最後の数値のリストと、加重和ます。W=⟨w1,w2,w3,w4⟩W=⟨w1,w2,w3,w4⟩W= \langle w_1, w_2, w_3, w_4\rangleNNNL1=⟨a,b,c,d⟩>L1=⟨a,b,c,d⟩>L_1= \langle a, b, c, d \rangle>S1=w1∗a+w2∗b+w3∗c+w4∗dS1=w1∗a+w2∗b+w3∗c+w4∗dS_1=w_1*a+w_2*b+w_3*c+w_4*d 別の番号を受け取ったら、リストを更新してをし、を計算する必要があります。eeeL2=⟨b,c,d,e⟩L2=⟨b,c,d,e⟩L_2= \langle b,c,d,e\rangleS2=w1∗b+w2∗c+w3∗d+w4∗eS2=w1∗b+w2∗c+w3∗d+w4∗eS_2=w_1*b+w_2*c+w_3*d+w_4*e FFTを使用した検討 この問題の特殊なケースは、高速フーリエ変換を使用することで効率的に解決できるようです。ここでは、倍数で加重和を計算します。言い換えれば、数値を受け取り、対応する加重和を計算することができます。これを行うには、過去の数(合計が既に計算されている)と、合計個の新しい数が必要です。SSSNNNNNNNNNN−1N−1N-1NNN2N−12N−12N-1 この入力数のベクトルと重みベクトル、係数を逆にして多項式との係数を定義する場合、積はaからまでの係数を持つ多項式が、求める重み付き和になります。これらは、時間でFFTを使用して計算できます。これにより、入力数ごとのΘ(\ log(N))時間の平均が得られます。WWWP(x)P(x)P(x)Q(x)Q(x)Q(x)QQQP(x)×Q(x)P(x)×Q(x)P(x)\times Q(x)xN−1xN−1x^{N-1}x2N−2x2N−2x^{2N-2}Θ(N∗log(N))Θ(N∗log(N))\Theta(N*\log (N))Θ(log(N))Θ(log(N))Θ(\log (N)) ただし、新しい数値が受信されるたびに加重和を効率的に計算する必要があるため、これは前述の問題の解決策ではありません。計算を遅らせることはできません。