我今天正在通过Floyd的循环查找算法并且有疑问。为什么他需要两个指针并以不同的速度移动它们?
他可以改为创建两个指针,保持一个静态,并将它的指针与另一个指针进行比较,然后递增?我的意思是,即使这会导致找到合适的周期吗?
答案 0 :(得分:10)
他们需要移动的原因是循环不一定要循环整个节点列表。
例如,假设我们有4个节点A-> B-> C-> D-> B
如果我们将一个指针指向A,我们就永远不会检测到周期。
答案 1 :(得分:4)
原因是需要增加后面的指针(增加得更慢)以使其脱离循环中的任何分支。
EG。边缘A => B,B => C,C => A,D => B,E => d。
假设两个指针都从E开始。然后,如果你不改变一个指针,另一个将指向E => D => B => C => A => B => C => ......,永远不会去E.
当别人说你不会得到相同的算法复杂度时,他们意味着你必须尝试从每个顶点开始(这是较慢的)。使用快速/慢速指针方法,您只需尝试从图形ONCE的每个“组件”开始。组件是彼此连接的所有顶点。单独的组件意味着顶点不通过边连接。
通过增加慢指针,它也会进入A => B => C循环。
它永远不会错过,因为指针变化的有效差异只有1即。如果快速指针正赶上慢速指针,则它们之间的距离仅在每次迭代时改变1。所以最终距离将达到0。