是否可以在 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 为图形创建位邻接数组的主要内容,如果未能解决你的问题,请参考以下文章
是否值得在 spark 数据帧中将 64 位整数转换为 32 位(16 位)整数?
是否可以在支持Intel IA-32e模式的操作系统中运行16位代码?