C++ 在图算法中,确定节点是否被访问的最佳方法是什么?

C++ 在图算法中,确定节点是否被访问的最佳方法是什么?,c++,algorithm,graph-algorithm,C++,Algorithm,Graph Algorithm,我最初是用两种方式做的。一种方法是将访问的节点存储在一个列表中,并遍历该列表以确定以前是否访问过某个节点。另一种方法是使用一个布尔数组来跟踪访问的和未访问的节点。我真的很感兴趣,最好的方法是什么?取决于您的使用情况, 为了获得更好的时间性能,可以使用哈希映射 您还可以使用b树来存储节点O(logn)插入和查找 就我个人而言,我会根据每个节点的唯一值使用哈希映射。您可以控制hashmap的大小以反映您的需要,并且通过良好的哈希函数,可以控制冲突。查看此代码以获取一个示例一种对微观优化(更好的缓存行

我最初是用两种方式做的。一种方法是将访问的节点存储在一个列表中,并遍历该列表以确定以前是否访问过某个节点。另一种方法是使用一个布尔数组来跟踪访问的和未访问的节点。我真的很感兴趣,最好的方法是什么?

取决于您的使用情况, 为了获得更好的时间性能,可以使用哈希映射 您还可以使用b树来存储节点O(logn)插入和查找


就我个人而言,我会根据每个节点的唯一值使用哈希映射。您可以控制hashmap的大小以反映您的需要,并且通过良好的哈希函数,可以控制冲突。查看此代码以获取一个示例

一种对微观优化(更好的缓存行为,避免查找)非常有用的方法是在每个节点对象上存储一个标志。明显的缺点是图形算法不是可重入的。要在遍历期间执行不同的图遍历以做出决策吗?嗯,你不能。您还必须记住在之后清除所有这些标志

另一类是在每次遍历的基础上维护一个单独的数据结构。您给出的两种方法都属于这种情况,尽管列表方法效率很低——每次查找都需要O(n)时间。布尔数组(可能压缩为一个位集;此选项非常节省空间)在时间和空间上都简单高效,但要求节点具有连续的索引/ID。这并不总是给定的,并且会对图形处理的其他部分产生影响

如果没有,而是使用指针引用图形对象,则可以使用基于该指针的映射。在更高级的语言中,如Python,这非常简单(由于高度调优的哈希表/集数据结构,效率也相当高)


明显的优点是图遍历是可重入的。虽然这听起来可能不多,但我可以证明,有时确实会出现这种有用的情况。

我不确定我是否理解,但如果所有节点都有索引,则可能是布尔数组/位字段。你说的“最佳”是什么意思?使用最少内存或查找最快的解决方案?为什么所有投票都要关闭?这个问题似乎非常适合stackoverflow。为什么关闭?他可能需要具体说明他在寻找什么样的最佳人选。但这个问题对许多人来说仍然是有价值和实用的?我还想提到,一个侵入式的traveral算法似乎是个坏主意。@MooingDuck我也有同感,但我更喜欢给出理由而不是直觉。此外,在某些情况下,这可能更自然,尽管我不知道我的头顶上有什么。