循环链表检测算法



所以我的问题是,在和兔子/继承人算法中检测循环链表,为什么只需要将第二个更快的指针增加 2 ??我无法弄清楚,我在这里也没有找到任何答案。

将第一个慢指针递增 1 是有意义的,因此我们正在迭代我们将与第二个指针进行比较的所有元素 但是为什么更快的指针只需要递增 2。为什么我们可以将其增加 3 或 4 或更多????

并且有没有办法计算相对于列表???中元素数量的更快指针的跳数(如果不是 2)应该是多少

您可以使用

3、4 或任何您想要的东西,但使用 2 是最快的方法,因为假设您在循环中以 2 的步长第一次:(D 是要走 2 步的指针,S 是普通指针。
案例 1)

step 1 :x - D - x - S - x - x ...
step 2 :x - x - x - D - S - x ...
step 3 :x - x - x - x - x - SD ( match)

案例2)

step 1: x - D - S - x this is the step 2 from case 1 and we can see that this is step 2 and we also have a match

但是如果你有,假设一个 3 步(D 应该是一次走 3 步的指针。

案例 1)

   step 1 : x - D - x - x - S ...
   step 2 : x - x - x - x - D - S ...
   step 3 : x - x - x - x - x - x - S - D ... ( D is passing S and it needs at least another loop to meet S)

案例2)

step 1 : x - D - x - S -..
step 2 : x - x - x - x - SD ( match)

案例 3)

step 1: x - D - S - ..
step 2: x - x - x - S - D ... ( D is passing S and it needs at least another loop to meet S)

正因为如此,2 比 3、4 或任何你想要的都好,因为所有大于 2 的数字都有机会 1/(N-1) 第一次见面。另一种解释方式是:对于 D 和 S 以及 N 的步长,如果 S 和 D 之间的距离是 N - 1,我们有一个匹配(D 去 N 步,S
去 1 步,而不是 D = S),另一种方式 D 通过 S,所以我们有 1/(N-1) 的机会第一次遇到 S 和 D, 正因为如此,如果 N = 2,我们有 1/1 = 100% ,如果 N = 3,我们有 1/2 = 50%。
希望它有帮助。

如果使用 3 或 4 作为步长,则需要添加对所有特殊情况的检查,因为前进 3 可能会导致第一个或第二个节点为 null。

此外,在一个周期的情况下,您有可能从慢速与较快的位置重合的 3 个位置中的任何一个。

它只是更多的代码,更多的条件要处理,容易出错,并且使用超过2个而没有任何性能提升而看起来不那么优雅 大O方面没有任何性能提升

相关内容

  • 没有找到相关文章

最新更新