在图算法中,确定是否访问节点的最佳方法是什么?
In Graph Algorithm, what is the best way to determine if a node is visited?
我最初以两种方式进行。一种方法是将访问的节点存储在列表中并浏览列表以确定之前访问了节点。另一个正在使用布尔数组,该阵列跟踪访问和未访问的节点。它真的很感兴趣,最好的方法是什么?
一种方法,可用于微观优化(更好的缓存行为,避免查找),正在每个节点对象上存储一个标志。显而易见的缺点是图算法不是重新输入的。是否想执行A 不同的图形遍历以在遍历期间做出决定?好吧,你不能。您还必须记住之后要清除所有这些标志。
另一个类别是在每次转化的基础上维护单独的数据结构。尽管列表方法效率非常低 - o(n)每次查找的时间都非常低,但您给出的两种方法都属于此方法。布尔数组(可能被压缩到bitset中;此选项是极其空间有效的)在时间和空间上都是简单有效的,但要求节点具有连续的索引/ID。这并不总是给出的,并且对图形处理的其他部分产生后果。
如果您没有,而是请参考带指针的图形对象,则可以根据此使用映射。在诸如Python之类的高级语言中,这非常简单(并且由于高度调谐的哈希表/设置数据结构,也很有效)。
显而易见的优势是图形遍历是重点的。虽然这听起来不多,但我可以证明有时会出现这种情况的情况。
取决于您的用法为了获得更好的时间性能,您可以使用哈希地图您也可以使用b-tree存储节点o(logn)插入和查找
个人,我将根据每个节点的唯一值使用哈希地图。您可以控制哈希图的大小以反映您的需求,并且通过良好的哈希功能,可以控制碰撞。查看此代码示例https://github.com/himanshujindal/reconstructing-books-from-google-ngrams
相关文章:
- 反向给定链表中的K节点
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- Boost Graph Library,修复节点大小
- 在c代码之间共享数据的最佳方式
- 使用std::source_location报告错误的最佳实践
- C++A*算法并不总是在路径中具有目标节点
- 如何找到2个单链表的公共节点
- 派生类销毁的最佳实践是什么
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 将寄存器设计成可由C和C++访问的外设的最佳实践
- 为什么我的删除节点函数实际上没有删除节点?
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 比较两个节点坐标的最佳方法是什么?
- 从基于矢量的二叉搜索树中删除节点的最佳方法
- 在图算法中,确定是否访问节点的最佳方法是什么?
- 用于存储平铺贴图节点的最佳容器
- 保存图节点的最佳方式