Tổng trọng số của N số cuối


19

Giả sử chúng ta đang nhận được số trong một luồng. Sau khi mỗi số được nhận, một tổng trọng số của số cuối cùng cần được tính, trong đó các trọng số luôn giống nhau, nhưng tùy ý.N

Làm thế nào hiệu quả có thể được thực hiện nếu chúng ta được phép giữ một cấu trúc dữ liệu để giúp tính toán? Chúng ta có thể làm tốt hơn , tức là tính lại tổng số mỗi khi nhận được một số?Θ(N)

Ví dụ: Giả sử các trọng số là . Tại một thời điểm, chúng tôi có danh sách số cuối và tổng trọng số .W=w1,w2,w3,w4NL1=a,b,c,d>S1=w1a+w2b+w3c+w4d

Khi nhận được một số khác, , chúng tôi cập nhật danh sách để nhận và chúng tôi cần tính .L 2 = b , c , d , e S 2 = w 1 * b + w 2 * c + w 3 * d + w 4 * eeL2=b,c,d,eS2=w1b+w2c+w3d+w4e

Cân nhắc sử dụng FFT Một trường hợp đặc biệt của vấn đề này dường như có thể giải quyết hiệu quả bằng cách sử dụng Biến đổi Fourier nhanh. Ở đây, chúng tôi tính toán số tiền nặng trong bội số của . Nói cách khác, chúng tôi nhận được số và chỉ sau đó chúng tôi mới có thể tính được tổng tương ứng . Để làm điều này, chúng ta cần số quá khứ (trong đó các khoản tiền đã được tính toán) và số mới, trong tổng số .N N N N - 1 N 2 N - 1SNNNN1N2N1

Nếu vectơ này của các số đầu vào và vectơ trọng số xác định các hệ số của đa thức và , với các hệ số trong đảo ngược, chúng ta thấy rằng sản phẩm là một đa thức có hệ số đứng trước cho đến chính xác là các tổng có trọng số mà chúng ta tìm kiếm. Chúng có thể được tính bằng cách sử dụng FFT trong thời gian , cho chúng ta thời gian trung bình Θ (\ log (N)) trên mỗi số đầu vào.P ( x ) Q ( x ) Q P ( x ) × Q ( x ) x N - 1 x 2 N - 2 Θ ( N * log ( N ) ) Θ ( log ( N ) )WP(x)Q(x)QP(x)×Q(x)xN1x2N2Θ(Nlog(N))Θ(log(N))

Tuy nhiên, đây không phải là một giải pháp cho vấn đề như đã nêu, vì yêu cầu tổng trọng số được tính toán hiệu quả mỗi khi nhận được một số mới - chúng tôi không thể trì hoãn việc tính toán.


Lưu ý rằng bạn có thể sử dụng LaTeX tại đây.
Raphael

Là đầu vào đến từ một số phân phối được biết đến? Họ có bất kỳ tính chất toán học hữu ích? Nếu họ không làm như vậy, thì điều đó khó có thể xảy ra (trừ khi ai đó có thể tìm thấy một hình thức đóng gọn gàng có thể tính toán được - tôi chắc chắn không thể tìm thấy). Ngoài ra, gần đúng là OK? Đó có thể là một cách để đi nếu nó hữu ích cho bạn.
RDN

Bộ lọc FIR làm điều này, vì vậy thiết kế của chúng sẽ có liên quan.
adrianN

@RDN Tôi đặt ra câu hỏi này vì tò mò, tôi không có một ứng dụng thực tế nào trong đầu.
Ambroz Bizjak

Câu trả lời:


6

Đây là một công phu của phương pháp của bạn. Mỗi lần lặp , chúng tôi sử dụng thuật toán FFT để tính các giá trị của tích chập trong thời gian , giả sử rằng các giá trị tiếp theo bằng không. Nói cách khác, chúng tôi đang tính toán trong đó là trọng số (hoặc trọng số ngược), là chuỗi đầu vào, là thời gian hiện tại và cho .m O ( n log n ) m n - 1 Σ i = 0 w i một t - i + k ,mmO(nlogn)mw i

i=0n1wiati+k,0km1,
wimột i t một t ' = 0 t ' > tnaitat=0t>t

Đối với mỗi lần lặp sau , chúng ta có thể tính tích chập cần thiết trong thời gian ( lần lặp thứ cần thời gian ). Vậy thời gian khấu hao là . Điều này được giảm thiểu bằng cách chọn , điều này mang lại thời gian chạy được khấu hao của .mO(m)iO(i)O(m)+O(nlogn/m)m=nlognO(nlogn)

Chúng tôi có thể cải thiện điều này thành thời gian chạy trường hợp xấu nhất của bằng cách chia tính toán thành các phần. Khắc phục và xác định Mỗi chỉ phụ thuộc vào đầu vào, do đó, nó có thể được tính trong thời gian . Ngoài ra, với với , chúng ta có thể tính tích chập trong thời gian . Do đó, kế hoạch là duy trì danh sách Đối với mỗi thời kỳ củaO(nlogn)m

bT,p,o=i=0m1wpm+iaTmi+o,CT,p=bT,p,0,,bT,p,m1.
CT,p2mO(mlogm)Ct/mp,p0pn/m1O(n/m+m)m n / m
Ct/mp,p,0pn/m1.
mđầu vào, chúng ta cần cập nhật trong số này. Mỗi bản cập nhật mất thời gian , vì vậy nếu chúng tôi trải đều các bản cập nhật này, mỗi đầu vào sẽ đảm nhận công việc . Cùng với việc tính toán chính tích chập, độ phức tạp thời gian trên mỗi đầu vào là . Chọn như trước đây, điều này mang lại cho .n/mO(mlogm)O((n/m2)mlogm)=O((n/m)logm)O((n/m)logm+m)m=nlognO(nlogn)

Giải pháp tuyệt vời, cảm ơn, tôi không thực sự chắc chắn nếu nó có thể được thực hiện.
Ambroz Bizjak

Và nó hoạt động! Triển khai C: ideone.com/opuoMj
Ambroz Bizjak 21/03/13

Meh, tôi đã bỏ lỡ đoạn mã cuối cùng thực sự khiến nó bị phá vỡ tính toán, được sửa ở đây ideone.com/GRXMAZ .
Ambroz Bizjak

Trên máy của tôi, thuật toán này bắt đầu nhanh hơn thuật toán đơn giản ở khoảng 17000 trọng lượng. Đối với số lượng nhỏ trọng lượng thì chậm. Điểm chuẩn: ideone.com/b7erxu
Ambroz Bizjak

Rất ấn tượng rằng bạn thực sự thực hiện điều này! Bạn có thể muốn tối ưu hóa hơn . Lựa chọn chỉ là một hướng dẫn sơ bộ và có thể không tối ưu. Bạn đã thử chạy thuật toán với các giá trị khác nhau của chưa? m = m mm=nlognm
Yuval Filmus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.