마지막 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,w4⟩NL1=⟨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 개의 새 숫자가 필요 합니다.엔엔엔엔−1엔2엔−1

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

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


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

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

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

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

답변:


6

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

∑i=0n−1wiat−i+k,0≤k≤m−1,
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(nlog⁡n/m) , 상각 된 실행 시간O( √m=nlog⁡n.O(nlog⁡n)

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

bT,p,o=∑i=0m−1wpm+iaTm−i+o,CT,p=bT,p,0,…,bT,p,m−1.
CT,p2mO(mlog⁡m)씨⌊티/미디엄⌋−피,피 , 시간 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)log⁡m+m)이전과 같이 n log n , 이것은O( √m=nlog⁡n.O(nlog⁡n)

훌륭한 해결책, 고마워, 나는 그것이 가능한지 정말로 확신하지 못했습니다.
— 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.