快速的每列求和。可能?

时间:2012-03-28 10:35:22

标签: c++ arrays performance math sum

请看这张照片:

enter image description here

是否可以比O(n ^ 2)更快地找到所有列的每列总和?

首先我认为有可能使它成为n * log(n),如果我们重新组合这样的求和(在时间上加2行,然后剩下2行,然后剩下2行......):

enter image description here

然后我计算了加号的数量,它在两种情况下都是相同的 - 两张照片中7 = 7。

所以有可能在n * log(n)时间内组合这样一个总和,或者我自欺欺人(我知道有FHT或FFT之类的变换,所以可能就是这种情况)?

3 个答案:

答案 0 :(得分:2)

没有。你需要从内存中读取(至少)n ^ 2个项目,这需要(至少)O(n ^ 2)时间。 1

<小时/> <子> 1。假设n是列数(或行数)。

答案 1 :(得分:2)

除非你对矩阵有更多的了解,否则它不能比O(n^2)更好。

您需要读取矩阵中的每个元素以获得每列的正确总和,因此您得到Omega(n^2)的下限

另请注意,您的想法是O(n^2),因为即使在第一次迭代中,您总结了n * (n/2)和操作,即O(n^2)

答案 2 :(得分:2)

不,我们的输入大小为O(n^2),因此我们的算法不能比这快(因为我们使用的是所有输入值)。

这假设n是行数,矩阵是正方形(给出n^2)并且元素之间没有特殊关系。