【发布时间】:2021-06-13 04:00:15
【问题描述】:
我需要你的专业知识:
我即将在 C++ 中实现一个图形类并考虑正确的表示。这些图简单且无向。顶点的数量现在最多可达 1000 个,但将来可能会更高。边数高达 200k 甚至更高。每个顶点都有一个颜色(int)和一个id(int)。边传输的信息不比连接到顶点的信息多。
我存储图表,只需要访问 x 和 y 是否连接 - 这是我经常需要的。 初始化后,我永远不会删除或添加新的顶点或边(N = 顶点数,M = 从一开始就给出的边数)!
我已经可以使用的一种表示形式:
一个邻接列表展开成一个长列表。除了这个表示之外,还有一个数组,其中包含每个顶点的起始索引。存储 O(2M) 并检查 x 和 y 之间的边缘是否平均 O(n/m)
我想到的一个表示:
这个想法是,而不是将邻接列表展开到一个数组中,而是使用邻接矩阵来完成。那么存储 O(N^2)?是的,但我想在一位中存储一个边缘,除了一个字节。(实际上是对称的 2 位)
示例:假设 N=8,然后创建一个长度为 8(64 位)的向量
您如何看待第二种解决方案 - 它可能已经为人所知并正在使用中? 考虑 O(1) 的访问我错了吗? 没有真正的性能提升是不是付出了很多努力?
将两种表示加载到一个大列表中的原因是我被告知缓存改进。
我很高兴收到有关此想法的一些反馈。我可能会走得很远 - 在这种情况下请善待:D
【问题讨论】:
-
只是想说你可以实现一个邻接列表,这样你就可以回答以下形式的查询:u 和 v 是否在 O(1) 中连接。例如,对于每个顶点 u,您可以拥有 u 的所有邻居的哈希集。
标签: c++ data-structures graph discrete-mathematics