你如何用C ++填充0动态矩阵?

时间:2015-04-21 21:39:09

标签: c++ dynamic matrix

如何用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)。 感谢。

3 个答案:

答案 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 进行比较,自问以下问题:

  • 此代码是否多次遍历矩阵一个单元格?
  • 如果我能测量时间会有区别吗?

两个答案都是否定的。

两个代码都是O(n),多维数组上的多层嵌套循环产生O(n)顺序。

答案 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()的调用将被适当的编译器内在替换。

相关问题