图传统上通过邻接列表或邻接矩阵表示(还有其他针对某些图形格式进行优化的方法,例如,如果节点 ID 是按顺序标记的和/或您提前知道节点/边的数量,但我不会进入那个)。
在邻接列表和邻接矩阵之间进行选择取决于您的需要。显然,邻接矩阵将比邻接列表占用更多空间(矩阵将始终占用(节点数)^ 2,而列表将占用(节点数 + 边数),但如果您的图形“小”,那么这并没有什么不同。
另一个问题是你有多少边(你的图是稀疏的还是密集的)?您可以通过获取您拥有的边数并将其除以:
n(n-1) / 2
其中“n”是图的节点数。上面的等式在“n”节点 UNDIRECTED 图中找到总的可能边数。如果图形是有向的,去掉“/2”。
要考虑的其他事情是有效的边缘成员资格是否重要。邻接列表可以轻松检测边缘成员资格(O(1)),因为它只是一个数组查找 - 对于邻接列表,如果“列表”存储为除 a 以外的其他内容,HashSet
它会慢得多,因为您必须查看整个边缘列表。或者也许你保持边缘列表的排序,你可以做一个二进制搜索,但是边缘插入需要更长的时间。也许您的图非常稀疏,并且邻接矩阵使用了太多内存,因此您必须使用邻接列表。很多事情要考虑。
还有很多可能与您的项目有关的问题,我只列出一些。
通常,假设您的图不是很复杂或“大”(在数百万个节点的意义上),HashMap
其中键是节点 ID,值是节点 ID 的一个Set
或其他一些集合,指示键的邻居节点很好,我已经在 8gb 机器上为 400,000 多个节点图完成了此操作。基于的HashMap
实现可能是最容易实现的。