周期检测算法:龟兔进入周期有条件吗?



最近我参加了一次面试,遇到了以下问题,我无法弄清楚。

问题1:

根据我读到的证明,移动 1 步,野兔一次移动 2 步。我明白这一点,他们会在某个时候见面,因为野兔的速度是的两倍。他们不能有任何随机值,如 2 和 3 或 3 和 5 或 2 和 4。如果是这样,他们会弄清楚这个周期吗?选择和野兔值的条件是什么?我们可以选择任何随机值吗?

问题2:

龟兔进入圈子有什么条件吗?假设如果和野兔有以下值,例如 2 和 4 或。链表就像

            3   
          /   
    1 -  2     4
             /
            5

如果 Tortoise 在节点 3 进入循环,而 Hare 在节点 2 进入循环,那么它们都不会在循环内相遇。那么龟兔有条件进入循环吗?

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

RE Q1:龟兔速度的最大公约数不能是环长除数(1除外(。因此,例如,如果gcd(vTortoise, vHare)=2,它将检测奇数长度的循环,但对于偶数长度的循环可能会失败。问题 2 与失败的情况有关。

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

假设从编号为 T 的点开始,并采取步骤 St 和 Hare 从 H 开始并采取步骤 Sh

他们满足的必要和充分条件是

|T - H|= k X gcd (St , Sh(

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

两者的运动速率必须相对主要,以便捕捉任何长度的周期。我认为这是一个充分条件。

最新更新