今天我正在阅读Floyd的链接列表中检测循环的算法。 我只是想知道如果我们跳过多个节点会不会更好,(比如2) 更快的环路检测?
例如:
fastptr=fastptr->next->next->next.
请注意,更改fastptr
时会考虑副作用。
答案 0 :(得分:4)
你的建议仍然是正确的,但它不会改变算法的速度。如果你看看wiki中的乌龟和野兔算法:
算法的关键见解是,对于任何整数i≥μ和k ≥0,x i = x i +kλ,其中λ是长度 找到循环,μ是循环的起始位置。特别是, 每当i =kλ≥μ时, x i = X <子> 2I 子> 强>
在粗体部分,您还可以说 x i = x 3i ,或任何其他系数,但关键洞察力是找到我,你会发现多少次跳跃并不重要,算法顺序取决于 i 的位置。