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

How do you fill with 0 a dynamic matrix, in C++?

本文关键字:填充 动态 中用 C++      更新时间:2023-10-16

你如何在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)。谢谢。

对于数组将要大而稀疏的特定情况,并且您希望在分配时将其归零,那么您可以使用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++。仅当您已确定性能是应用程序中的瓶颈并且没有更好的解决方案时,才应使用此优化。

从你的代码:

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()的调用将被替换为适当的编译器内部函数。

每个嵌套循环都不被视为 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;

现在让我们比较一下,2号1号,问自己以下问题:

  • 此代码是否多次遍历矩阵单元格?
  • 如果我能测量时间会有所不同吗?

两个答案都是否定的。

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