考虑以下代码段。
Looping(n)
{
while (true) {
if (n <= 1) then return;
else if (n mod 3 = 0) then n = n * 5 + 1;
else n = n/9; // integer division
}
此代码段的最坏情况时间复杂度是多少? `
答案 0 :(得分:3)
我们可以对此代码做出的一个重要观察是,在采取任何两个步骤之后,n的大小将减少(大致)2/3。这就是原因。考虑n的任何初始值,并查看模3的余数。
因此,我们得到它将在O(log n)步骤之后终止,因为每次迭代都会使n减少某个常数因子。
希望这有帮助!
答案 1 :(得分:1)
是O(log(n))。每次你做5n + 1时你用9除以(因为5n + 1 = 1 mod 3,如果n = 0 mod 3),所以最糟糕的是你每两步做一次(5n + 1)/ 9 ,每两步少于2n / 3。这是O(log(n))。如果n mod 3从不为0,那么你每步除以9,也就是O(log(n)),只是用不同的常数。
所以无论你是什么,你都要采取O(log(n))步骤来得到1或0。