队列解法的时间复杂度
查看原帖
队列解法的时间复杂度
290023
369Pai楼主2022/3/26 20:56

YuJiaheAKIOI 那篇队列题解的代码,有一个令我疑惑的地方

while (used[f.st] && f.st <= f.ed) f.st ++; // 如果已经被取了

这意味着某些被取过的元素将会再次遍历到,所以最坏时间复杂度不一定是 Θ(n)\Theta(n) 的。

蒟蒻想出了一种数据:

41
1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 1 0 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1

即形如

t个1 + (t-2)个0 + (t-4)个1 + (t-6)个0 +...+4个1 + 2个0 + 1个1 
+ 2个0 + 4个1+...+ (t-6)个0  + (t-4)个1 + (t-2)个0 + t个1

容易得到 t=2n12t = \left \lfloor \sqrt{\frac{2n-1}{2} } \right \rfloor

对于这种数据,那行代码的运行次数:

0 0 1 0 0 左右两个 0 合并时,运行 22 次;

1 1 1 1 0 0 1 0 0 1 1 1 1 左右两个 1 合并时,运行 88 次;

0 0 0 0 0 0 1 1 1 1 0 0 1 0 0 1 1 1 1 0 0 0 0 0 0 左右两个 0 合并时,运行 1818 次;

1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 1 0 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 左右两个 1 合并时,运行 3232 次;

可以看出,次数为 2×(12+22+32+...+t2)=t(t+1)(2t+1)/32\times(1^2+2^2+3^2+...+t^2) = t(t+1)(2t+1)/3,而 ttn\sqrt n 级的。

所以其最坏时间复杂度应该是 O(nn)O(n \sqrt n)

2022/3/26 20:56
加载中...