如何证明Floyd循环检测算法的第一部分?

时间:2017-01-13 16:22:37

标签: algorithm

在弗洛伊德算法的第一部分中,野兔为乌龟的每一步移动两步。如果乌龟和兔子相遇,那就有一个循环,会合点是循环的一部分,但不一定是循环中的第一个节点。

我无法理解为什么如果圆圈存在,两个指针必须满足?用“三步”代替“两步”怎么样?

我希望有人可以向我证明......

2 个答案:

答案 0 :(得分:4)

请注意,当乌龟和兔子都处于循环中时,它们的相对速度变为1,几乎是以这种速度追逐站立的乌龟,因此野兔将以N <= Cycle_Len步骤遇见乌龟。

你可以用“三步”替换“两步”,但你必须检查它们是否在每个野兔子步骤中相遇

答案 1 :(得分:1)

要添加到问题的第二部分,如果野兔在3步移动并且在1步移动,则无法保证检测到包含偶数节点的循环。然而,如果乌龟以2步移动,则可以进行循环检测。

一般情况下,如果野兔以H步移动,而龟移动T步,则可以保证在H = T + 1时检测到一个循环。

考虑野兔相对于乌龟的移动。

  • 相对于乌龟的野兔速度是每次迭代H - T个节点。
  • 给定一个长度为N =(H - T) * k的周期,其中k为正数 整数,野兔会跳过每个H - T - 1个节点(再次,相对 对乌龟来说,如果他们不可能见面 乌龟在任何一个节点中。

  • 保证会议的唯一可能性是H - T - 1 = 0