【问题标题】:Floyd loop detection algorithm with different step size不同步长的 Floyd 环路检测算法
【发布时间】:2012-07-25 00:38:46
【问题描述】:

在链表中的Floyd循环检测算法中,我们一般将慢指针加1个单位,快指针加2个单位。我们可以使用哪些其他值来增加慢速和快速指针以及它们如何改变算法的复杂性?

【问题讨论】:

  • 好问题,当我看到这个算法时,第一个问题进入了我的脑海。会不会有一个循环大小和快指针步长会导致快指针和慢指针总是互相丢失?
  • 例如Loop = 6,Fast = 3,Slow 1。在 Fast 指针后面启动 Slow 指针。

标签: algorithm linked-list complexity-theory floyd-cycle-finding


【解决方案1】:

无论速度或环路大小如何,这两个指针总会相遇。

使用以下值:

  • a 和 b:每个指针每次迭代所采取的步数。
  • m:循环中的节点数。

在i 迭代之后,两个指针将执行ai 和bi 步骤。如果i 足够大以至于两个指针都在循环内,它们将位于同一个节点,并且:

ai = bi (mod m)

等同于:

(a-b)i = 0 (mod m)

这对于i 的值是正确的,它是m 的倍数,并且足够大。这样的值会一直存在,所以指针会一直相遇。

a 和 b 的值越大,每次迭代的步数就越多,但如果它们都是常数,那么复杂度仍然是线性的。

【讨论】:

    【解决方案2】:

    我认为步长无关紧要。只要慢

    唯一的区别是在每次迭代中,每个指针所采取的步数会有所不同。

    【讨论】:

      【解决方案3】:

      好吧,我通过使用一些基础数学以一种争论的方式理解了它。想象一个带有循环的链表,慢指针和快指针都开始移动。 令 T 为循环开始的点或列表连接自身的节点。 当慢速指针到达该节点时,快速指针现在将位于循环内。所以现在想象一下这个像时钟一样的循环,有一个时针和一个分针,这两个指针会在它们速度的公倍数上相遇,而不管它们的速度如何。

      【讨论】:

        猜你喜欢
        • 2015-07-20
        • 2017-05-29
        • 2016-01-18
        • 1970-01-01
        • 1970-01-01
        • 2014-06-19
        • 2014-05-12
        • 1970-01-01
        • 2017-09-12
        相关资源
        最近更新 更多