具有不同步长的Floyd环路检测算法

时间:2012-07-26 12:15:47

标签: algorithm linked-list complexity-theory floyd-cycle-finding

链表中的 Floyd循环检测算法中,我们通常将慢指针增加1个单位,将快速指针增加2个单位。我们可以使用哪些其他值来递增慢速和快速指针,以及它们如何改变算法的复杂性?

3 个答案:

答案 0 :(得分:1)

无论速度或循环大小如何,两个指针始终相遇。

使用以下值:

  • ab:每次迭代每个指针所采取的步数。
  • m:循环中的节点数。

i次迭代后,两个指针将采用aibi步骤。如果i足够大以使两个指针都在循环内,它们将位于同一节点,并且:

ai = bi (mod m)

与:

相同
(a-b)i = 0 (mod m)

对于i的值,这是m的倍数,并且足够大。这样的值将始终存在,因此指针将始终相遇。

ab的较大值将增加每次迭代所采取的步骤数,但如果它们都是常量,那么复杂性仍然是线性的。

答案 1 :(得分:0)

我认为步长并不重要。只要缓慢<如果列表中有一个循环,那么两个人会相遇。

唯一的区别是,在每次迭代中,每个指针所采取的步数会有所不同。

答案 2 :(得分:0)

我用一些基础数学以一种议论的方式理解它。想象一个带有循环的链表,慢指针和快速指针都开始移动。 设T为循环开始的点或列表连接自身的节点。 当慢指针到达此节点时,快速指针现在将在循环内。所以现在想象这个循环就像时钟一样有一只时针和一只手,这两个指针无论速度如何都会在它们的速度的常见倍数上相遇。