让我们说我有一大堆双打w []从0到n-1索引。
我还有一个m个子集[0; n-1]的列表。对于每个子集S,我试图计算w [i]相对于S的总和。
显然我可以为每个子集单独计算它,它将在O(m * n)中。
但有没有更快的方法呢?我从实际的角度谈论,因为我认为你可以有一个较低的渐近界限。是否可以预处理所有子集并以这样的方式存储它们以便更快地计算所有总和?
谢谢!
编辑: 给出一定数量级,我的n大约是2千万,大约是200左右。
答案 0 :(得分:1)
对于密集(或接近密集)的子集,您可以通过计算元素的运行总和来加速计算。也就是说,创建另一个与w
并行的数组,其中并行数组中的每个元素都包含w
之前的元素之和。
要计算密集子集的总和,请确定并行数组中的起始位置和结束位置,并在结束时从运行总和中减去运行总和。两者之间的差异是(忽略舍入误差)该子集的总和。
对于一个接近密集的子集,首先要做同样的事情,然后减去该范围内不属于该集合的(相对较少的)项的值。
这些可能不会产生与通过天真地对该子集求和得到的完全相同的结果。如果你需要更高的精确度,你可能希望对运行总和数组使用Kahan求和,并可能在每个点保留其误差残差,在进行减法时要考虑。