考虑以下代码段。
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
}
该代码段的最坏情况时间复杂度是多少?`
考虑以下代码段。
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
}
该代码段的最坏情况时间复杂度是多少?`
我们可以对这段代码做出的一个重要观察是,在执行任意两个步骤之后,n 的大小将减少(大约)2/3 倍。这就是为什么。考虑 n 的任何初始值并查看余数模三。
因此,我们知道这将在 O(log n) 步后终止,因为每次迭代都会将 n 减少某个常数因子。
希望这可以帮助!
它是 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)),只是常数不同。
所以无论 n 是什么,你都将采取 O(log(n)) 步骤来达到 1 或 0。