Suponha que estamos recebendo números em um fluxo. Depois que cada número é recebido, uma soma ponderada dos últimos números precisa ser calculada, onde os pesos são sempre os mesmos, mas arbitrários.
Com que eficiência isso pode ser feito se tivermos permissão para manter uma estrutura de dados para ajudar no cálculo? Podemos fazer algo melhor que , ou seja, recalcular a soma cada vez que um número é recebido?
Por exemplo: Suponhamos que os pesos são . Em um ponto que tem a lista dos últimos números , e a soma ponderada .
Quando um outro número, , é recebida, que actualizar a lista para obter e é preciso calcular .
Consideração sobre o uso da FFT Um caso especial desse problema parece ser solucionável com eficiência, empregando a Transformada rápida de Fourier. Aqui, nós calcular as somas ponderadas em múltiplos de N . Em outras palavras, nós recebemos N números e só então podemos calcular as N somas ponderadas correspondentes . Para fazer isso, precisamos de números anteriores N - 1 (para os quais as somas já foram computadas) e N novos números, no total de 2 números N - 1 .
Se esse vetor de números de entrada e o vetor de peso definem os coeficientes dos polinômios P ( x ) e Q ( x ) , com os coeficientes em Q invertidos, vemos que o produto P ( x ) × Q ( x ) é um polinômio cujos coeficientes na frente de x N - 1 até x 2 N - 2 são exatamente as somas ponderadas que buscamos. Estes podem ser calculados usando FFT em Θ ( N ∗ log , que nos dá uma média de Θ ( log ( N ) ) por número de entrada.
No entanto, essa não é uma solução para o problema, conforme declarado, porque é necessário que a soma ponderada seja computada com eficiência cada vez que um novo número for recebido - não podemos atrasar o cálculo.
fonte
Respostas:
Aqui está uma elaboração da sua abordagem. A cada iteração, usamos o algoritmo FFT para calcular m valores da convolução no tempo O ( n log n ) , assumindo que os valores m subsequentes sejam zero. Em outras palavras, estamos computando n - 1 ∑ i = 0 w i a t - i + k ,m m O(nlogn) m
onde w i são os n pesos (ou os pesos reversos), a i é a sequência de entrada, t é o tempo atual e a t ' =
Para cada um dos seguintes iterações, que são capazes de calcular a convolução necessário em tempo O ( m ) (o i th iteração precisa de tempo S ( i ) ). Portanto, o tempo amortizado é O ( m ) + O ( n log n / m ) . Isso é minimizado escolhendo m = √m O(m) i O(i) O(m)+O(nlogn/m) , que fornece um tempo de execução amortizado deO( √m=nlogn−−−−−√ .O(nlogn−−−−−√)
Podemos melhorar isso para o pior caso de tempo de execução de dividindo o cálculo em partes. Fixm, e definir b T , P , o = m - 1 Σ i = 0 W p m + i uma T m - i + o ,O(nlogn−−−−−√) m
Cada C T , p depende apenas de 2 m de entradas, portanto pode ser calculada no tempo O ( m log m ) . Além disso, dado C ⌊ t / m ⌋ - p , p para 0 ≤ p ≤ n
fonte