Floyd判定环的方法,也称为Floyd's Tortoise and Hare Algorithm,是一种有效地检测循环(或环)的算法。它的证明主要基于数学归纳法和反证法。
我们假设存在一个链表(或数组),其中包含着一个循环。慢指针(乌龟)每次移动一步,快指针(兔子)每次移动两步。如果存在循环,那么两者最终会在循环中相遇。
这里给出Floyd判定环的严格证明:
步骤:
-
定位相遇点:
设起始点到环的起点距离为 (d),环的起点到相遇点距离为 (m),环的长度为 (l)。当慢指针和快指针第一次相遇时,慢指针走了 (d+m) 步,而快指针走了 (d+m+k \cdot l) 步,其中 (k) 是快指针在环内转了的圈数。由于快指针的速度是慢指针的两倍,因此 (2(d+m) = d+m+k \cdot l)。 -
重置慢指针:
现在,将慢指针重新移动到起始点,即 (d) 处,而快指针则停留在相遇点 (d+m) 处。 -
相遇点即为循环起点:
接下来,我们让慢指针和快指针同时以每次一步的速度前进。由于快指针已经在相遇点停留了 (k) 圈,当慢指针移动到环的起点时,快指针也会恰好移动 (k) 圈。两者最终会在环的起点相遇,这个点就是循环的起点。
证明:
-
存在循环时:
如果存在循环,那么慢指针和快指针必定会相遇,因为快指针会绕圈追赶慢指针。 -
循环的起点:
一旦相遇,将慢指针移到起点,同时移动慢指针和快指针,它们会在循环的起点相遇。这是因为慢指针从起点到循环起点的距离与相遇点到循环起点的距离相等,所以它们会同时到达循环起点。
这样,Floyd判定环的方法在数学上得到了严格的证明。