【问题标题】:How to prove the first part of Floyd's algorithm for cycle detection?如何证明 Floyd 循环检测算法的第一部分?
【发布时间】:2017-05-29 02:10:03
【问题描述】:

在弗洛伊德算法的第一部分,兔子每走一步,乌龟就走两步。如果龟兔赛跑,就存在一个循环,相遇点是循环的一部分,但不一定是循环中的第一个节点。

如果圆存在,为什么两个指针必须在某个时间相遇?把“两步”换成“三步”怎么样?

我希望有人可以向我证明...

【问题讨论】:

  • @MattTimmermans 实际上没有。
  • @MattTimmermans 我不认为这是重复的。这个问题要求证明 为什么 2 个指针可以保证满足,而另一个问题要求证明一旦 2 个指针满足,就可以找到循环的起点。跨度>

标签: algorithm


【解决方案1】:

补充问题的第二部分,如果野兔以3 步移动,乌龟以1 步移动,则不能保证检测到包含偶数个节点的循环。但是,如果乌龟以2 步长移动,则可以进行循环检测。

一般情况下,如果野兔以H 步长移动,而乌龟以T 步长移动,则可以保证检测到如果H = T + 1 的循环。

假设兔子相对于乌龟移动。

  • 兔子相对于乌龟的速度是H - T 每次迭代的节点。
  • 给定一个长度为N =(H - T) * k 的循环,其中k 是任何正数 整数,野兔会跳过每个 H - T - 1 节点(同样,相对 到乌龟),他们不可能见面,如果 乌龟在这些节点中的任何一个中。

  • 保证会面的唯一可能是H - T - 1 = 0。

【讨论】:

【解决方案2】:

注意,当乌龟和兔子都在循环中时,它们的相对速度变为1,实际上兔子以这个速度追着站立的乌龟,所以兔子会在N <= Cycle_Len步内遇到乌龟。 p>

你可以将“两步”替换为“三步”,但是你必须检查它们是否在每个野兔子步相遇

【讨论】:

  • 哦!我得到了它。非常感谢。
猜你喜欢
  • 2015-07-20
  • 2017-05-28
  • 2016-01-18
  • 2012-07-25
  • 1970-01-01
  • 2014-05-09
  • 2011-09-17
  • 2013-02-09
  • 2015-04-26
相关资源
最近更新 更多