在c++中创建大小为66000 X 66000的二维数组
Creating two dimensional array of size 66000 X 66000 in C++
我试图在c++中创建一个大小为66000 X 66000的图邻接表,所以我不能使用c++ 11自动功能来创建数组。此外,当我尝试int *array = new int[66000*66000]时,这是我在另一个堆栈溢出中看到的将其放在堆上的东西,我得到了一个整数溢出错误。我能不能创建一个这么大的数组?谢谢。
假设所有这些66000 * 66000都是int
,那么它将消耗大约66000 * 66000 * 4/2^30 = 16G内存。你真的想这么做吗?
您提到的溢出是由于在我们的情况下66000 * 66000
不适合int
。
拥有如此庞大的数组是否是个好主意值得怀疑。但是如果你愿意,你可以尝试 long long
:
int *array = new int[66000LL * 66000];
,尽管它可能超过系统允许的最大数组大小,参见编译错误C2148。
同样,您可以尝试使用malloc
代替。但即使使用char
而不是int
(这应该足以邻接),也要准备好看到相当无响应的系统。
既然你正在构建一个图邻接表,我猜:
- 每个元素的值将为1(通过边连接的节点)或0(未通过边连接的节点),并且
- 数组将是"稀疏的"(意思是,数组中的大多数值将为0),而
- 数组也将是对称的,除非你正在使用有向图
因此,与其将邻接信息存储为2D数组,不如将数组的"1"存储为节省空间,例如将其存储为(x,y)对的列表。
有关更多信息,请参见:
- https://en.wikipedia.org/wiki/Sparse_matrix
- https://en.wikipedia.org/wiki/Sparse_array
另一种方法是将邻接矩阵存储为位图,因为每个值都是0或1。这样做的优点是节省空间,缺点是使提取关于一对节点的连通性的信息变得更加复杂。
这样的位图将占用66000 * 66000位,即544500000字节,约519.3Mb。您可以将其存储在bitset中(这是c++ STL的一部分)。
相关文章:
- 将值从二维数组输出到文本文件
- 在二维数组中查找最小值和最大值?
- 移动二维数组中的字符
- 如何正确填充在堆上分配的二维数组?
- 传递二维数组时出现问题
- 具有随机数的二维数组不会更改
- 如何在C++中获取二维数组中最少的一列数?
- 如何使用用户输入变量制作二维数组?
- C++ 中动态二维数组的访问冲突
- 遍历二维数组的所有子数组
- 将二维数组的所有元素插入到一维数组中
- 在函数中传递二维数组
- 为什么指针在对二维数组进行排序时无法正常工作?
- 创建 std::string 的二维数组的最佳做法
- 如何将文本文件读取到二维数组中并以 c++ 打印
- 元素在二维数组 c++ 中的出现次数
- 执行 c++ 二维数组
- C++ 中的二维数组初始化为一个值
- 在C++中初始化第一维大小未知的二维数组
- 在c++中创建大小为66000 X 66000的二维数组