我需要转置一个由char数组表示的方阵。 有没有办法以低于o(n ^ 2)的复杂度执行它? 无论如何,什么是最有效的缓存方式呢?
答案 0 :(得分:3)
不,你不能在O(n^2)
之内做到这一点,其背后的原因是你需要至少触摸一次矩阵中的每个元素(已经是(n * n)。因此你可以没有做得更好。
您可以做的最好的事情是使用O(1)
额外的内存(而不是时间)进行就地矩阵转置(wikipedia中很好地概述了这一点)。
请注意,您并不总是需要计算转置矩阵。对于很多应用程序,您只需交换坐标(如果需要A[i][j]
- 只需返回A[j][i]
-th元素)
答案 1 :(得分:1)
您还可以向矩阵类添加1位标志,将转置操作转换为简单地对此标志O(1)进行xor。如果设置了转置标志,则所有矩阵元素访问运算符应该将行索引与列索引交换。
答案 2 :(得分:0)
这将始终采用O(NM),因为您必须为每个元素计算相应的转置坐标:
// char matrix[N * M]
// char transpose[N * M]
for(int i = 0; i < N*M; i++)
transpose[i] = matrix[ (M * (i % N)) + (i / N) ];
如果您使用NxN矩阵进行此操作,则需要O(n ^ 2)来计算转置。如果你不需要存储转置,你可以在反转你的索引时迭代它,并在没有额外内存的情况下有效地做同样的事情。