簡體   English   中英

加速計算幾個子集的總和

[英]speed-up computation of sum over several subsets

假設我有一個巨大的雙打數組 w[] 索引從 0 到 n-1。

我還有一個包含 [0;n-1] 的 m 個子集的列表。 對於每個子集 S,我試圖計算 w[i] 在 S 上的總和。

顯然我可以為每個子集單獨計算這個,這將是 O(m * n)。

但是,有沒有更快的方法來做到這一點? 我是從實際的角度說話,因為我認為你不能有一個下漸近界。 是否可以對所有子集進行預處理並以更快的速度計算所有和的方式存儲它們?

謝謝!

編輯:為了給出一些數量級,我的 n 大約為 2000 萬,m 大約為 200。

對於密集(或接近密集)的子集,您可以通過計算元素的運行總和來加速計算。 也就是說,創建另一個與w並行的數組,其中並行數組中的每個元素都包含w到該點為止的元素之和。

要計算密集子集的總和,您需要計算並行數組中的起始和結束位置,然后從末尾的運行總和中減去開始時的運行總和。 兩者之間的區別是(忽略舍入誤差)該子集的總和。

對於接近密集的子集,您首先執行相同的操作,然后減去該范圍內不屬於該集合的(相對較少)項目的值。

但是,這些可能不會產生與通過天真地對子集求和得到的結果完全相同的結果。 如果您需要更高的准確性,您可能希望對您的運行總和數組使用 Kahan 求和,並可能在每個點保留其誤差殘差,以便在進行減法時予以考慮。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM