你如何在C++中用 0 填充动态矩阵
How do you fill with 0 a dynamic matrix, in C++?
你如何在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) 阶。
相关文章:
- 在c++中用vector填充一个简单的动态数组
- 使用动态实例化的对象填充矢量的快速方法
- 动态填充的组合框不显示文本,列表未定义
- 动态数组传递给 main 中用随机值填充的函数,返回值3221226356
- 使用指向数组的指针填充动态数组
- 如何正确填充并将动态数组发送到Delphi中C 中的功能
- 在C 中动态分配的数组填充
- 在动态 2-D 数组中填充 0 的更简洁的方式C++
- 如何根据模板类型生成随机数以填充动态数组
- 动态调整大小并填充C++中的矢量
- 使用特征库填充动态向量
- C 填充动态阵列int
- C++部分填充动态数组
- 动态填充 QML 菜单
- 你如何在C++中用 0 填充动态矩阵
- C++动态创建的MFC视觉工作室填充组合框
- 填充动态类模板数组时遇到问题
- 在使用 memcpy 填充动态 2d 数组后删除动态 2D 数组时中止(核心转储)
- 递归填充动态大小向量
- 使用大括号符号C++填充动态数组