我最初是以两种方式做的。一种方法是将访问的节点存储在列表中并遍历列表以确定之前是否已访问过节点。另一个是使用布尔数组,它跟踪访问和未访问的节点。它真的让我感兴趣,最好的方法是什么?
答案 0 :(得分:6)
一种可用于微优化(更好的缓存行为,避免查找)的方法是在每个节点对象上存储一个标志。明显的缺点是图算法不是可重入的。想要进行不同的图表遍历以在遍历期间做出决定吗?好吧,你做不到。您还必须记住之后清除所有这些标志。
另一类是在每个遍历的基础上维护一个单独的数据结构。您提供的两种方法都属于这种方法,尽管列表方法效率非常低 - 每次查找都需要O(n)时间。布尔数组(可能压缩为位集;此选项极空间有效)在时间和空间上都是简单而有效的,但要求节点具有连续的索引/ ID。这并不总是给出,并且会对图处理的其他部分产生影响。
如果你没有,而是用指针引用图形对象,你可以使用基于它的映射。在更高级的语言中,例如Python,这非常简单(并且由于高度调整的哈希表/集数据结构,也非常有效)。
明显的优势是图遍历是可重入的。虽然这听起来可能不是很多,但我可以证明有时会出现这种情况。
答案 1 :(得分:0)
取决于您的使用情况, 为了获得更好的时间性能,您可以使用哈希映射 您还可以使用b树来存储节点O(logn)插入和查找
就个人而言,我会根据每个节点的唯一值使用哈希映射。您可以控制散列映射的大小以反映您的需求,并且通过良好的散列函数,可以控制冲突。请查看此代码以获取示例https://github.com/himanshujindal/Reconstructing-Books-from-Google-Ngrams