【问题标题】:Tortoise and hare algorithm龟兔赛跑算法
【发布时间】:2014-11-16 04:03:52
【问题描述】:

我正在阅读 wikipedia 的龟兔算法。我想知道python伪代码是否错误。数组似乎失败了:[1, 2, 2, 3, 4, 5, 6, 7, 8, 9, ....] 一开始,这两个值相遇,算法继续寻找注定失败的循环的开始。
我知道有i ≥ μ 的条件,是否应该将此约束添加到代码中以查找循环的开始?
如果添加了这个约束,算法应该终止并在失败时返回未找到循环还是继续进行另一次迭代?因为如果输入是 [1, 2, 2, 3, 4, 5, 3, 4, 5, 3, 4, 5, ....] 怎么办?
这个算法如何保证在第一个交汇点,两个指针都在某个循环内?

【问题讨论】:

  • 那么当你运行代码时会发生什么?
  • 我没有实现它,但我相信它会是无限循环。
  • 那么如何实现它。或者你真的认为一个超过 50 年的算法是错误的并且没有被忽视?此外,它适用于任何乘数。选择 2 是因为它将允许以最快的方式检测循环。
  • 该算法不适用于数组,而是迭代序列。您的反例不是迭代序列,因为您有 f(2) = 2 和 f(2) = 3。

标签: algorithm


【解决方案1】:

龟兔算法运行两个指针,一个在偏移量i,另一个在偏移量2i,都是基于1的,所以最初是12,旨在检测链接中的循环-list 样式的数据结构。

而且,为了清楚起见,它比较的是 指针 而不是它们指向的数据值,我不确定你是否理解这一点,如果你没有理解,我只是想我会提到它。

最初的起点是让乌龟在第一个元素上,兔子在第二个元素上(假设它们当然存在 - 如果它们不存在,则不可能有循环),所以说它们是不正确的一开始就相等。只有当兔子循环并因此从后面抓住乌龟时,指针值才能变得相等。

【讨论】:

  • 我错过了指针比较部分。我误解了它的价值比较。至于在 cmets 上提到的有人说它不适用于数组但迭代序列。这是真的吗?
  • @Ra1nWarden:是的,至少在“不适用于阵列”方面。根据定义,普通数组不能有循环,因为它包含N 连续的事物(我说普通是因为您可以通过将数据和下一个索引编码到每个元素,但这不是正常的用例)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-17
  • 1970-01-01
  • 2016-05-12
  • 2021-04-20
  • 1970-01-01
  • 2021-02-10
  • 1970-01-01
相关资源
最近更新 更多