c++ - Floyd 的循环查找算法

标签 c++ algorithm floyd-cycle-finding

我试图在 .NET 的 C++ 上找到这个算法,但找不到,我找到了这个:

// Best solution
function boolean hasLoop(Node startNode){
  Node slowNode = Node fastNode1 = Node fastNode2 = startNode;
  while (slowNode && fastNode1 = fastNode2.next() && fastNode2 = fastNode1.next()){
    if (slowNode == fastNode1 || slowNode == fastNode2) return true;
    slowNode = slowNode.next();
  }
  return false;
}

但似乎不对,还是我错了?我怎么才能真正证明我的兔子最终会遇到乌龟呢?预先感谢任何解释它究竟是如何工作的和proof

已编辑

关于这个解决方案,我发现在常规算法中他们只使用一个快速迭代器但在这里他们使用两个,为什么?

最佳答案

您发现的代码中的想法似乎不错。为了方便起见,使用了两个快速迭代器(尽管我很肯定这种“方便”,比如在 while 循环的条件下放置大量“ Action ”,应该避免)。您可以使用一个变量以更具可读性的方式重写它:

while (fastNode && fastNode.next()) {
    if (fastNode.next() == slowNode || fastNode.next().next() == slowNode) {
        return true;
    }
    fastNode = fastNode.next().next();
    slowNode = slowNode.next();
}

关于c++ - Floyd 的循环查找算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3880735/

相关文章:

c++ - BOOST_FOREACH 在模板中不起作用?

c++ - for循环每次计算相同的值

algorithm - 为什么 Floyd 的循环查找算法对于某些指针增量速度会失败?

algorithm - Adaboost在神经网络上的实现

python - 给定一组 3D 点及其相应温度的数组,如何绘制横截面的等高线图?

algorithm - 循环检测算法

c++ - 编译器和负数表示

c++ - 如何声明 std::unique_ptr 以及它的用途是什么?

c++ - 使用 >= 进行元素比较时插入排序比 > 慢,为什么?