algorithm - 不同步长的Floyd环路检测算法

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

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

最佳答案

无论速度或循环大小如何,两个指针始终会相遇。

使用以下值:

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

经过i次迭代后,两个指针将采取aibi步。如果 i 足够大以至于两个指针都在循环内,则它们将位于同一节点,并且:

ai = bi (mod m)

这与:

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

对于 i 的值来说,这是正确的,它是 m 的倍数,并且足够大。这样的值将始终存在,因此指针将始终相交。

较大的 ab 值将增加每次迭代所采取的步数,但如果它们都是常数,则复杂度仍将是线性的。

关于algorithm - 不同步长的Floyd环路检测算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11669082/

相关文章:

python - 在 Django 框架中匹配两个配置文件

java - 在java中使用ListIterator作为LinkedList时遇到问题

c - 链表 C 中的段错误(核心转储)

algorithm - 计算 C 函数的空间复杂度?

java - Android OnClickListener 复杂性

c++ - Project Euler #1 测试扩展

algorithm - 在国际象棋中检查将死

c++ - 存储在 vector C++ 中的聚类点

c++ - 如何将元素 append 到链表的末尾?

algorithm - 给定循环的时间复杂度 O(logn) 或 O(n)