如何用C ++填充0动态矩阵?我的意思是,没有:
for(int i=0;i<n;i++)for(int j=0;j<n;j++)a[i][j]=0;
我需要它在O(n)中,而不是O(n * m)或O(n ^ 2)。 感谢。
答案 0 :(得分:1)
每个嵌套循环都不被视为O(n2) 以下代码是O(n),
否1
for(int i=0;i<n;i++)for(int j=0;j<n;j++)a[i][j]=0;
假设您将矩阵a
中的所有单元格复制到一维平面数组中,并通过一个循环将其所有元素设置为零,那么顺序是什么?你会说那是一个O(n)
否2
for(int i=0;i<n*m;i++) b[i]=0;
现在让我们将 No 2 与 No 1 进行比较,自问以下问题:
两个答案都是否定的。
答案 1 :(得分:0)
对于你的数组要大而且稀疏并且你想在分配时将其归零的特定情况,你可以从使用calloc
获得一些好处 - 在大多数平台上这将导致延迟分配零页面,例如
int **a = malloc(n * sizeof(a[0]); // allocate row pointers
int *b = calloc(n * n, sizeof(b[0]); // allocate n x n array (zeroed)
a[0] = b; // initialise row pointers
for (int i = 1; i < n; ++i)
{
a[i] = a[i - 1] + n;
}
请注意,这当然是过早优化。它也是C风格的编码而不是C ++。如果您已经确定性能是应用程序的瓶颈并且没有更好的解决方案,那么您应该只使用此优化。
答案 2 :(得分:0)
从你的代码:
for(int i=0;i<n;i++)for(int j=0;j<n;j++)a[i][j]=0;
我假设你的矩阵是二维数组,声明为
int matrix[a][b];
或
int** matrix;
在第一种情况下,将此for
循环更改为对memset()的一次调用:
memset(matrix, 0, sizeof(int) * a * b);
在第二种情况下,您将这样做:
for(int n = 0; n < a; ++n)
memset(matrix[n], 0, sizeof(int) * b);
在大多数平台上,对memset()
的调用将被适当的编译器内在替换。