c – 在图算法中,确定节点是否被访问的最佳方法是什么?
作者:互联网
我最初是以两种方式做到的.一种方法是将访问的节点存储在列表中并遍历列表以确定之前是否已访问过节点.另一个是使用布尔数组,它跟踪访问和未访问的节点.它真的让我感兴趣,最好的方法是什么?
解决方法:
一种可用于微优化(更好的缓存行为,避免查找)的方法是在每个节点对象上存储标志.明显的缺点是图算法不是可重入的.想要在遍历期间做一个不同的图遍历来做出决定吗?好吧,你做不到.您还必须记住之后清除所有这些标志.
另一类是在每个遍历的基础上维护一个单独的数据结构.您提供的两种方法都属于这种方法,尽管列表方法效率非常低 – 每次查找都需要O(n)时间.布尔数组(可能压缩为位集;此选项非常节省空间)在时间和空间上都是简单而有效的,但要求节点具有连续的索引/ ID.这并不总是给出,并且对图处理的其他部分有影响.
如果你没有,而是用指针引用图形对象,你可以使用基于它的映射.在更高级的语言中,例如Python,这非常简单(并且由于高度调整的哈希表/集数据结构,也非常有效).
显而易见的优点是图遍历是可重入的.虽然这听起来可能不是很多,但我可以证明有时会出现这种情况有用的情况.
标签:c,algorithm,graph-algorithm 来源: https://codeday.me/bug/20190826/1726058.html