C++中的大型图表示

Large Graph Representation in C++

本文关键字:型图 表示 C++      更新时间:2023-10-16

可能会有类似的问题,但我仍然有一些部分无法理解。我试图表示一个没有权重的无向图,但只有1表示连通,0代表不连通。我试图表示一个具有80500个节点和550多万条边的图(从文件中读取)。我在想;

  1. 如果我把邻接矩阵(我目前正在使用的那个)改为邻接列表,这会产生巨大的影响吗。我对实现没有问题,只是问是否值得花时间将其转换为列表
  2. 由于我只存储10,是否有一种特殊的数据类型不存储此数据。我在中使用,我想字节数据类型会节省很多时间
  3. 除了邻接矩阵或列表之外,还有其他结构可以更好地解决这个典型问题吗

相邻列表在空间方面更好。因为这样你只需要保存550万*2个数字=11 000 000个整数。假设您保存短整数(2个字节),那么您需要2200000个字节。

如果使用邻接矩阵表示,则需要保存80500*80500=6480 250 000个元素。即使你把它们保存为字节,拥有2200万字节也比拥有60多亿字节要好得多。

编辑:如果您将eges保存为两个4字节的整数,那么您就有44 000 000个字节。如果你用比特篡改非常有效地保存矩阵,那么你可以在一个字节中保存8个元素。但这意味着您仍然需要810 031 250字节。现在差别不大,但仍然是原来的20倍。

如果数据不是稀疏的,那么使用邻接列表可能无法节省那么多空间。您可以使用带有压缩或编码行(或列,但您的图是单向的,因此压缩行对于查找来说可能更自然)的邻接矩阵。通过压缩,您将减少空间,而在查找时解压缩行的时间成本。