在c++中创建大小为66000 X 66000的二维数组

Creating two dimensional array of size 66000 X 66000 in C++

本文关键字:66000 二维数组 小为 c++ 创建      更新时间:2023-10-16

我试图在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. 每个元素的值将为1(通过边连接的节点)或0(未通过边连接的节点),并且
  2. 数组将是"稀疏的"(意思是,数组中的大多数值将为0),而
  3. 数组也将是对称的,除非你正在使用有向图

因此,与其将邻接信息存储为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的一部分)。