【发布时间】:2013-12-02 22:19:14
【问题描述】:
算法要求
输入是大小为N×N 的任意方阵M,正好 适合内存。
算法的输出必须是true,如果是M[i,j] = M[j,i],对于所有j≠i,否则false。
明显的解决方案
检查转置是否等于矩阵本身 (
MT=M)。在许多环境中最容易编程,但(通常)消耗两倍的内存并且需要N²比较最坏的情况。因此,这是 O(N²) 并且具有高峰值内存。检查下三角部分是否等于上三角部分。当然,算法返回找到的第一个不等式。这将使最坏的情况(最坏的情况是,矩阵确实是对称的)需要
N²/2 - N比较,因为不需要检查对角线。所以虽然比选项1好,但这仍然是O(N²)。
问题
虽然很难看出它是怎么可能的(N² 元素都必须以某种方式进行比较),但有没有比 O(N²) 更好的算法来做这个检查?
或者,如果有证据证明不存在这种算法:如何在考虑到缓存友好性、最佳分支预测等因素的情况下最有效地为多核 CPU(Intel 或 AMD)实现这一点编译器特定的特化等?
这个问题主要源于学术兴趣,尽管我认为实际用途可能是确定如果矩阵描述线性系统AX=b...
【问题讨论】:
-
你能有一个稀疏矩阵表示吗?
-
@Leeor: 是的,full 或 sparse 都应该支持
-
我只是说,对于稀疏图,如果元素的数量明显低于 n^2,您可能会获得更好的复杂性
-
对不起,因为我要说的可能很愚蠢。但是这里的 O(N^2) 让我感到困惑。如果您有一个大小为 S 的矩阵 M,其中 s=nxn,并且您的算法正在执行 S 次比较,那不是 O(n) 吗?
-
@Pedrom 这将是 O(S),而不是 O(n),并且 O(S) 是 O(n^2)。
标签: algorithm matrix language-agnostic big-o