【问题标题】:In tortoise and hare algorithm, Why we make the hare make 2 step forwards and check them在龟兔算法中,为什么我们让兔子向前迈出 2 步并检查它们
【发布时间】:2014-07-17 03:32:00
【问题描述】:

在龟兔算法中,为什么我们总是让兔子向前走两步,兔子向前走1步然后比较它们,我们也可以让兔子向前走1步,然后再次检查是否相等,然后增加乌龟并再次检查它们是否相等!我认为这将有助于更快地找到循环?

例如。这个伪代码

tortoise := firstNode
hare := firstNode

forever:

  if hare == end 
    return 'No Loop Found'

  hare := hare.next

  if hare == end
    return 'No Loop Found'
   if hare==tortoise
return true

  hare = hare.next
  tortoise = tortoise.next

  if hare == tortoise
    return 'Loop Found'

【问题讨论】:

标签: algorithm


【解决方案1】:

路径由尾部和循环组成;兔子和乌龟都必须穿过尾巴才能到达循环。由于兔子一次移动两步,所以它首先到达循环,然后围绕循环运行,直到乌龟到达。直到乌龟到达循环点为止,它们两个不可能占据同一个单元格。

一旦乌龟到达循环的起点,兔子就在循环中的某个位置,实际上k 比乌龟落后了一些k,其中k 肯定小于循环大小。乌龟每走一步,兔子就会走两步,这使兔子离乌龟更近了一步。所以乌龟移动一步后,它们之间的距离是k-1,然后下一步是k-2,以此类推,直到兔子在k步后追上。

兔子永远不会在循环中越过乌龟,因此检查兔子是否在兔子跳过的地方是没有意义的;它不可能在那里。因此,额外的检查总是会失败,包括它只会减慢算法的速度。

【讨论】:

  • 我见过的最好的解释。将兔子描述为循环中乌龟的后面会使一切都到位!
  • 感谢您的精彩回答!!但是@rici 我们确实必须在向前迈出一步后检查空条件(对于野兔)向前迈出一步,然后再次检查 null.ryt?跨度>
  • @user3847425:是的,如果下一个指针可能为空,您必须在野兔的每一步检查。 (但是,如果 end->nextend,则可以推迟检查。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-29
  • 2014-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多