第一部分

上述代码的最坏时间复杂度是 O(nTlogn)O(nT \log n)

第二部分

为了证明中间的小猪不会出现左右往复移动而使时间复杂度达到 O(n2T)O(n^2T) 的情况,我们考虑把场上所有的小猪从左向右平分成三份,分别记为 A,B,CA,B,C

根据题意,在 A,B,CA,B,C 中都至少有一只小猪还没下桥的情况下,AA 中的小猪总会向左移动,而 CC 中的小猪总会向左移动。T2\dfrac{T}{2} 秒后,AA 中任意一只小猪和 CC 中任意一只小猪之间的距离将不小于 TT,因此它们之间一定有一组全部下桥了。

由上可知,时间每过去 T2\dfrac{T}{2} 秒,桥上小猪的数量都将至少减少 13\dfrac{1}{3},即剩下原来的 23\dfrac{2}{3} 或更少。因此,整个过程最多持续 $\dfrac{T}{2} \cdot \log _{\frac{3}{2}} n=O(T \log n)$ 秒。

阅读程序可知,它 while 循环内程序的时间复杂度为 O(n)O(n),而 while 循环每执行一次相当于时间流逝一秒,因此 while 循环最多会执行 O(Tlogn)O(T \log n) 次。

综上,上述代码的时间复杂度不高于 O(nTlogn)O(nT \log n)

第三部分

只要让 TT 远大于 nn(此时可以忽略 nn 对小猪位置的影响),且 T,nT,n 足够大,将 nn 只小猪都放在 T3\dfrac{T}{3} 位置(时间每过去 T3\dfrac{T}{3} 秒,桥上小猪的数量都将减少 12\dfrac{1}{2}),即可使上述代码的时间复杂度退化到 O(nTlogn)O(nT \log n)

例如:

  • n=106n=10^6
  • T=3×1018T=3 \times 10^{18}
  • ai=1018+ia_i=10^{18}+i