高效的矩阵转置算法

时间:2015-01-18 21:25:27

标签: arrays algorithm matrix transpose

我需要转置一个由char数组表示的方阵。 有没有办法以低于o(n ^ 2)的复杂度执行它? 无论如何,什么是最有效的缓存方式呢?

3 个答案:

答案 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)来计算转置。如果你不需要存储转置,你可以在反转你的索引时迭代它,并在没有额外内存的情况下有效地做同样的事情。