请看这张照片:
是否可以比O(n ^ 2)更快地找到所有列的每列总和?
首先我认为有可能使它成为n * log(n),如果我们重新组合这样的求和(在时间上加2行,然后剩下2行,然后剩下2行......):
然后我计算了加号的数量,它在两种情况下都是相同的 - 两张照片中7 = 7。
所以有可能在n * log(n)时间内组合这样一个总和,或者我自欺欺人(我知道有FHT或FFT之类的变换,所以可能就是这种情况)?
答案 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
)并且元素之间没有特殊关系。