循环检测算法:Tortoise和Hare是否有进入循环的条件?

时间:2016-02-03 07:43:11

标签: algorithm data-structures linked-list cycle-detection

最近我参加了一次面试,并且遇到了以下问题,我无法弄明白。

问题-1:

根据我读过的证据,Tortoise移动1步,Hare一次移动2步。我理解这一点,他们会在某些时候见面,因为Hare的速度是Tortoise的两倍。他们不能有任何随机值,如2和3或3和5或2和4.如果是这样,他们会想出循环吗?选择乌龟和野兔价值的条件是什么?我们可以选择任何随机值吗?

问题-2:

Tortoise和Hare有没有进入循环的条件? 假设Tortoise和Hare有以下值,分别为2和4。链表就像

            3   
          /   \
    1 -  2     4
          \   /
            5

如果Tortoise在节点3进入循环并且Hare在节点2进入循环,那么它们在循环内都不会相互见面。那么Tortoise和Hare是否有条件进入循环?

是否有任何限制值应该被选择以便彼此相遇?

3 个答案:

答案 0 :(得分:3)

RE Q1:乌龟和兔子速度的最大公约数不能是循环长度的除数(除1之外)。所以例如如果gcd(vTortoise, vHare)=2,它将检测奇数长度的循环,但对于偶数长度的循环可能会失败。 Q2涉及失败的情况。

RE Q2:当上述限制不成立时检测循环,即当循环长度可被M = gcd(vTortoise, vHare)整除时,如果乌龟和野兔在具有不同模数的位置进入循环,则不会检测到循环{ {1}}从循环开始。因此,在上面的例子中,如果野兔和乌龟都进入具有相等模数M的位置,则将检测到M和循环,例如, 0和2,0和4,2和4,1和3等。但是如果它们进入环路,则不会检测到环(因此龟和野兔将无限地行进)。位置0和1,或0和3,1和2等

答案 1 :(得分:2)

说乌龟从编号为T的点开始并采取步骤S t 并且Hare从H开始并采取步骤S h

他们见面的必要和充分条件是

  

| T - H | = k X gcd(S t ,S h

即。他们的起始位置的差异应该是他们步骤gcd的倍数。

答案 2 :(得分:1)

为了捕捉任何长度的周期,两者的移动速率必须相对较高。我认为这是一个充分条件。