我使用向量向量方法实现邻接列表,向量向量的第n个元素指向节点n的朋友列表。
我想知道哈希映射数据结构是否更有用。我仍然有犹豫,因为我根本无法识别它们之间的区别,例如,如果我想检查并在第n个元素邻居(搜索,删除)中进行操作,它怎么能比向量方法的向量更有效。
答案 0 :(得分:2)
如果节点集是固定的,则vector<vector<ID>>
是一种很好的方法。但是,如果您突然决定删除节点,那么您会感到恼火。你不能缩小向量,因为它会取代存储在节点之后的元素,你会丢失引用。另一方面,如果您保留一侧的免费(可重用)ID列表,您可以“忽略”该插槽,然后再重复使用。很有效率。
使用unordered_map<ID, vector<ID>>
可以更轻松地删除节点。您可以继续为新创建的节点分配新ID,并且不会丢失空插槽。它不是那么紧凑,特别是在碰撞时,但也不是那么糟糕。当需要使用较旧的编译器移动向量时,重新散列可能会有一些减速。
最后,unordered_multimap<ID, ID>
可能是最容易管理的问题之一。它也将记忆分散到风中,但是嘿:)
就个人而言,我会开始使用unordered_multimap<ID, ID>
进行原型设计,并且只有在证明对我的需求太慢的情况下才会切换到另一种表示形式。
注意:如果通过建立对称关系是对称的,那么您可以减少一半的节点数量,而不是仅为(x, y)
存储关系min(x, y)
。
答案 1 :(得分:0)
当您不需要删除边时,矢量矢量是很好的解决方案。
您可以在O(1)中添加边,您可以在O(N)中迭代邻居。
您可以按vector[node].erase(edge)
删除边缘,但它会很慢,复杂度只有O(顶点数)。
我不确定你想如何使用哈希映射。如果插入边缘意味着设置hash_map[edge] = 1
,那么请注意您无法迭代节点的邻居。