마지막 N 숫자의 가중치 합계


19

스트림에서 숫자를 받고 있다고 가정합니다. 각 숫자를받은 후에는 마지막 숫자 의 가중치 합계를 계산해야합니다. 여기서 가중치는 항상 동일하지만 임의적입니다.N

계산에 도움이되는 데이터 구조를 유지할 수 있다면 얼마나 효율적으로 할 수 있습니까? 우리는 보다 더 잘 할 수 있습니까 ? 즉 숫자를받을 때마다 합계를 다시 계산할 수 있습니까?Θ(N)

예를 들어, 가중치가 이라고 가정하십시오 . 어느 시점에서 우리는 마지막 숫자 의 목록과 가중 합계 입니다.N L 1 = , B , C , D > S (1) = w (1) * + w 2 * B + w 3 * C + w 4 * W=w1,w2,w3,w4NL1=a,b,c,d>에스1=1+2++4

다른 숫자 가 수신되면 을 얻기 위해 목록을 업데이트하고 를 계산해야합니다 .L 2 = B , C는 , (D)는 , E는 S 2 =를 1 * B + w 2 * C + w 3 * D + w 4 * E이자형2=,,,이자형에스2=1+2++4이자형

FFT를 사용한 고려 사항 이 문제의 특별한 경우는 고속 푸리에 변환을 사용하여 효율적으로 해결할 수있는 것으로 보입니다. 여기서 우리 는 N의 배수로 계량 합계 에스 를 계산합니다 . 다시 말해, 우리는 N 개의 숫자를 수신 한 후에 만 ​​해당하는 N 개의 가중치 합계를 계산할 수 있습니다 . 이를 위해서는 총 2N-1 숫자의 N-1 개의 과거 숫자 (이미 합계가 이미 계산 된 숫자 )와 N 개의 새 숫자가 필요 합니다.121

입력 번호의 벡터 및 가중치 벡터 경우 다항식의 계수 정의 (엑스)(엑스) 있는 계수, 반전하여 제품의 볼 (엑스)×(엑스)x ^ {N-1} 앞에서 x ^ {2N-2}엑스1 까지 의 계수 가 정확히 우리가 찾는 가중 합인 다항식입니다 . 이는 \ Theta (N * \ log (N)) 시간에 FFT를 사용하여 계산할 수 있으며 , 이는 입력 번호 당 평균 Θ (\ log (N)) 시간을 제공합니다.엑스22Θ(로그())Θ(로그())

그러나 이것은 새로운 숫자를받을 때 마다 가중 합계를 효율적으로 계산해야하기 때문에 계산 된 문제를 해결할 수 없기 때문에 계산 이 지연 될 수 없습니다.


여기서 LaTeX사용할있습니다 .
Raphael

입력이 알려진 분포에서 나오는가? 유용한 수학적 속성이 있습니까? 그들이 그렇지 않다면, 이것이 가능하지 않을 것입니다 (누군가 하위 선형 계산 가능한 깔끔한 닫힌 형태를 찾을 수 없다면-나는 확실히 찾을 수 없습니다). 또한 근사값은 괜찮습니까? 그것은 당신에게 전혀 유용하다면 갈 수있는 한 가지 방법 일 수 있습니다.
RDN

FIR 필터 가이를 수행하므로 설계가 관련됩니다.
adrianN

@ RDN 호기심 으로이 질문을 제기했는데 실용적인 응용 프로그램을 염두에 두지 않았습니다.
Ambroz Bizjak

답변:


6

다음은 귀하의 접근 방식에 대한 설명입니다. 모든 반복, 우리가 계산하기 위해 FFT 알고리즘을 사용하여 시간에서 컨볼 루션의 값을 후속하는 것으로 가정하면, 값은 제로이다. 즉, 우리는 여기서 는미디엄미디엄영형(로그)미디엄

i=0n1wiati+k,0km1,
wi 가중치입니다 (또는 역방향 가중치) , 입력 시퀀스 인 t는 현재 시간이며, t ' = 0 에 대한 t ' > t .naitat=0t>t

다음의 내용은 각각 반복, 우리는 시간에 필요한 회선 계산할 수 O ( m를 ) 합니다 ( I 반복 시간 요구 번째 O를 ( I ) ). 상각 시간 정도로 O ( m ) + O ( N 로그 N / m ) . m = 를 선택하면 최소화됩니다.mO(m)iO(i)O(m)+O(nlogn/m) , 상각 된 실행 시간O(m=nlogn.O(nlogn)

O 를 최악의 실행 시간으로 개선 할 수 있습니다 ( 계산을 부분으로 나눔으로써 n log n ). m을수정하고 b T , p , o = m 1 i = 0 w p m + i a T m i + o ,O(nlogn)m C T , p 2 m 입력에만 의존하므로 시간 O ( m log m ) 로 계산할 수 있습니다. 또한, 소정의 C t / m - (P) , (P) 에 대해 0 P N

bT,p,o=i=0m1wpm+iaTmi+o,CT,p=bT,p,0,,bT,p,m1.
CT,p2mO(mlogm)/미디엄, , 시간 O ( n / m + m ) 의 컨벌루션을 계산할 수 있습니다. 그러므로 계획은리스트 C t / m - p , p ,0/미디엄1영형(/미디엄+미디엄)m 입력 의 각주기에 대해이들의 n / m 을 업데이트해야합니다. 각각의 갱신 시간 소요 O ( m의 로그 m을 ) 우리가 균일 업데이트를 확산 그렇다면, 각각의 입력 작업이 소요될 것이다 O를 ( ( N / m 2 ) m의 로그 m ) = O ( ( N / m ) 로그 m )
/미디엄,,0/미디엄1.
미디엄/미디엄영형(미디엄로그미디엄)영형((/미디엄2)미디엄로그미디엄)=영형((/미디엄)로그미디엄). 컨볼 루션 자체 계산과 함께 입력 당 시간 복잡도는 입니다. m = 선택O((n/m)logm+m)이전과 같이 n log n , 이것은O(m=nlogn.O(nlogn)

훌륭한 해결책, 고마워, 나는 그것이 가능한지 정말로 확신하지 못했습니다.
Ambroz Bizjak

그리고 작동합니다! C 구현 : ideone.com/opuoMj
Ambroz Bizjak

Meh, 실제로 계산을 중단시키는 마지막 코드가 누락되었습니다 . 여기서 ideone.com/GRXMAZ .
Ambroz Bizjak

내 컴퓨터 에서이 알고리즘은 약 17000 가중치의 간단한 알고리즘보다 빠릅니다. 적은 수의 가중치는 느립니다. 벤치 마크 : ideone.com/b7erxu
Ambroz Bizjak

미디엄미디엄=로그미디엄
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.