在链表中的 Floyd循环检测算法中,我们通常将慢指针增加1个单位,将快速指针增加2个单位。我们可以使用哪些其他值来递增慢速和快速指针,以及它们如何改变算法的复杂性?
答案 0 :(得分:1)
无论速度或循环大小如何,两个指针始终相遇。
使用以下值:
a
和b
:每次迭代每个指针所采取的步数。m
:循环中的节点数。在i
次迭代后,两个指针将采用ai
和bi
步骤。如果i
足够大以使两个指针都在循环内,它们将位于同一节点,并且:
ai = bi (mod m)
与:
相同(a-b)i = 0 (mod m)
对于i
的值,这是m
的倍数,并且足够大。这样的值将始终存在,因此指针将始终相遇。
a
和b
的较大值将增加每次迭代所采取的步骤数,但如果它们都是常量,那么复杂性仍然是线性的。
答案 1 :(得分:0)
我认为步长并不重要。只要缓慢<如果列表中有一个循环,那么两个人会相遇。
唯一的区别是,在每次迭代中,每个指针所采取的步数会有所不同。
答案 2 :(得分:0)
我用一些基础数学以一种议论的方式理解它。想象一个带有循环的链表,慢指针和快速指针都开始移动。 设T为循环开始的点或列表连接自身的节点。 当慢指针到达此节点时,快速指针现在将在循环内。所以现在想象这个循环就像时钟一样有一只时针和一只手,这两个指针无论速度如何都会在它们的速度的常见倍数上相遇。