是否可以在 64 位系统中使用 c++11 为图形创建位邻接数组

Posted

技术标签:

【中文标题】是否可以在 64 位系统中使用 c++11 为图形创建位邻接数组【英文标题】:is it possible to create a bit adjacency array for a graph with c++11 in 64 bit system 【发布时间】:2018-06-16 10:31:45 【问题描述】:

是否可以在 64 位系统中使用 c++11 为图创建位邻接数组

我需要部署一个大尺寸的图表,比如 N=10000000。但是编译器不允许我定义一个二维的大尺寸数组,比如 Adj[N][N]。我只是部署权重为 0 的图。如果两个节点有链接,则 Adj[N][N] 的对应元素为 1,否则为 0。所以我只需要一位即可。我想知道是否可以使用长位内存来存储位数组来描述二维数组。

例如:

16位数组的4X4邻接矩阵:1010010100110110

所以元素1,1是1,元素1,2是0,......,元素4,4是0

我需要位操作来找到我需要部署的元素。

问题是如何做到这一点?如何在内存中分配一个长的连续位存储? malloc?如何定义指针?空类型?

编辑

假设是 10000000。无符号字符可能需要 90T 内存。我知道有人部署了 10^7 个节点。也许他们正在使用动态分配内存的向量或列表。

【问题讨论】:

如果N=10000000000,您大约需要1e10 千兆字节 来存储N^2 位。 在一个类中包装一个std::bitset<N*N> bits;,并创建一个返回bits[N1 + N2*N]at(N1, N2)函数。如果N 是运行时值,您可以使用std::vector<bool> 假设是 10000000。无符号字符可能需要 90T 内存。我知道有人部署了 10^7 个节点。也许他们正在使用动态分配内存的向量或列表。 @HolyBlackCat 每边一个位,您需要大约。 1,5 TB。你需要一个稀疏矩阵。 有趣的阅读:***.com/questions/50323522/… 【参考方案1】:

您需要一个“稀疏数组”,其中实际上只填充了几个元素。我首先会想到使用std::map,像这样:

#include <map>
class MyNode 
// your stuff here
;
typedef <your node id type> MyNodeId; // must naturally or by overload define an operator <

typedef std::map<MyNodeId, MyNode> ArcsFromNode;

typedef std:map<MyNodeId, ArcsFromNode> MyGraph;

【讨论】:

当然,如果你的节点被分配到别的地方,你可以在 ArcsFromNode 映射中使用 MyNode * 代替“MyNode”【参考方案2】:

您的邻接矩阵中的大多数条目可能为 0,因此您需要一个所谓的“稀疏矩阵”来节省内存。

基本思想是存储元素映射,因此它不存储大矩阵,而是只存储非零条目。

Boost 有一些这样的实现,可以为您节省一些实施时间和测试,请参阅https://www.boost.org/doc/libs/1_45_0/libs/numeric/ublas/doc/matrix_sparse.htm 了解概述。

【讨论】:

以上是关于是否可以在 64 位系统中使用 c++11 为图形创建位邻接数组的主要内容,如果未能解决你的问题,请参考以下文章

将 C 代码转换为 x86-64 位程序集?

是否值得在 spark 数据帧中将 64 位整数转换为 32 位(16 位)整数?

win7,64位怎么恢复系统变量里面的path

是否可以在支持Intel IA-32e模式的操作系统中运行16位代码?

是否可以在 64 位系统 CentOS 上运行 Sonar?

如何在64位windows7上同时使用32位和64位的Eclipse