Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 高效矩阵转置算法_Arrays_Algorithm_Matrix_Transpose - Fatal编程技术网

Arrays 高效矩阵转置算法

Arrays 高效矩阵转置算法,arrays,algorithm,matrix,transpose,Arrays,Algorithm,Matrix,Transpose,我需要转置一个由字符数组表示的方阵。 有没有一种方法可以在不到o(n^2)复杂度的情况下执行它? 无论如何,缓存效率最高的方法是什么?这将始终需要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) ]; //字符矩阵[N*M] //字

我需要转置一个由字符数组表示的方阵。 有没有一种方法可以在不到o(n^2)复杂度的情况下执行它? 无论如何,缓存效率最高的方法是什么?

这将始终需要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) ];
//字符矩阵[N*M]
//字符转置[N*M]
对于(int i=0;i

如果使用NxN矩阵进行此操作,则需要O(n^2)来计算转置。如果您不需要存储转置,您可以在反转索引的同时对其进行迭代,并在没有额外内存的情况下有效地执行相同的操作。

不,您不能在少于
O(n^2)
的时间内完成转置,这背后的原因是您需要至少触摸矩阵中的每个元素一次(已经是(n*n)).因此,你不能做得更好

最好的方法是使用
O(1)
额外的内存(而不是时间)进行就地矩阵转置(如中所述)


请注意,您并不总是需要计算转置矩阵。对于许多应用程序,您只需交换坐标(如果需要
a[i][j]
-只需返回
a[j][i]
-第个元素)

您还可以向矩阵类添加一个1位标志,将转置操作简单地转换为该标志O(1)上的异或。如果设置了转置标志,则所有矩阵元素访问运算符都应交换行索引和列索引。

无论数组维度如何(如何索引内存),时间复杂度都是相同的。您应该指定n的含义。萨尔瓦多·达利的回答将n解释为行数。另一个合理的解释是元素数。一个是可能的,一个不是。