【问题标题】:When will Floyd's cycle-finding algorithm fail?弗洛伊德的寻环算法何时会失败?
【发布时间】:2013-03-28 15:59:07
【问题描述】:

我收到一个关于Floyd's cycle-finding algorithm 的面试问题:

弗洛伊德的寻环算法何时会失败?

我的意思是,在快速指针和慢速指针之间找到步长是否有规则?

【问题讨论】:

  • 也许当它实施不好的时候?
  • 正如 Wiki 所描述的,当没有循环时,它将无法检测到循环(这是一个巨大的 duh,可以肯定的是,但同样重要)。
  • @NPE 面试问题是否被提出为“假设在一个序列中存在一个循环,在什么情况下弗洛伊德的算法会找不到它?”我同意。 linked 算法失败的幌子是兔子最终会用完房地产并且永远不会考虑无周期。如果你或我实施它,我们会认为这是一个成功的空值。如果链接算法中的 f(x) 在传递 null 时返回 null,那么它将不会失败,但该工件似乎被遗漏了(或者我没有看到它,很有可能)。

标签: c++ algorithm floyd-cycle-finding


【解决方案1】:

在合理的假设下,它不会失败。它要么找到一个循环,要么断定没有循环。

我能想到的唯一失败场景如下:

  • 实现中存在错误;
  • 正在遍历的结构在算法进行时被修改。

【讨论】:

  • 有什么规则可以找到快指针和慢指针之间的步长吗?
  • @MrROY:慢一步,快两步。这与算法的假设失败有什么关系(这就是您的问题似乎是关于)?
  • +1 动态列表肯定会导致一般算法失败。
  • 这些是每个算法都会失败的场景。
  • @SChepurin:这正是我所说的在合理的假设下,它不会失败时的意思。我认为整个问题充其量是神秘的,尤其是在它被编辑之后。
【解决方案2】:

弗洛伊德的循环查找算法可能不会出现任何故障情况。

当在动态变化的链表中找到下一个节点在计算上很困难时,唯一可能发生的故障情况发生。

【讨论】:

    【解决方案3】:

    好的,我现在正在解决这个问题,我也遇到了同样的问题。
    Floyd 算法指出,快指针可以比慢指针快 m 倍。人们通常将 m 视为 2,即在每次迭代中快速前进 2 步,而慢速前进仅 1 步。此特定值适用于所有结构和循环长度。
    但是,如果我们要找到循环的开始并且我们取 m>2,那么在存在长度为 m-1 的循环的情况下算法会失败。在这种情况下,将检测到循环,但它在查找初始循环节点时失败。
    这是我注意到的,但不确定如何以及为什么会这样。一些见解会有所帮助。谢谢!

    【讨论】:

    • 这不是答案,但可能是评论。答案应该回答问题。
    • 这并不能真正回答问题。如果您有其他问题,可以点击 提问。要在此问题有新答案时收到通知,您可以follow this question。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。 - From Review
    猜你喜欢
    • 2011-04-22
    • 1970-01-01
    • 2018-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 2013-02-06
    相关资源
    最近更新 更多