Floyd循环检测的运行时复杂性

时间:2017-11-09 03:07:09

标签: algorithm time-complexity

根据一些在线资料我提到Floyd的周期检测算法的运行时复杂度是O(n)。 说,

p = slow pointer
q = fast pointer
m = the distance from start of linked list to first loop node
k = the distance of the meeting point of fast and slow nodes from the first loop node 
l = length of loop
rp = number of loop rotations by p before meeting q.
rq = number of loop rotations by q before meeting p.

运行时间复杂度应为= m + rp * l + k 该值如何为O(n)?

2 个答案:

答案 0 :(得分:5)

如果有n个节点,则在快速指针遇到慢速指针或找到列表结尾之前,保证慢速指针的行程不超过n步。这意味着你做O(n)工作推进慢速指针,你将快速指针推进大约两倍,这也是O(n)。因此,整个算法是O(n)。

答案 1 :(得分:4)

如果列表中有 N 个节点,那么在< = N 步骤中,快速指针会找到列表的末尾,或者有一个循环,慢指针将在循环中。

让我们说循环长度 M <= N :一旦慢速指针进入循环,快速和慢速指针都将永远卡在循环中。每一步,快速指针和慢速指针之间的距离将增加1.当距离可被 M 整除时,快速和慢速指针将在同一节点上,算法终止。在&lt; = M 步骤中,距离将达到 M 可以分割的数字。

因此,获得指向循环的慢速指针,然后获得快速和慢速指针以满足&lt; = N + M <= 2N 步骤,这就是 O(N)

事实上,如果你注意到当有一个循环时,慢速指针会以 N - M 步进入它,你可以对步数有更严格的约束,所以总步数&lt; = N