我需要一些帮助才能找到此代码的复杂性或Big-O。如果有人可以解释每个循环的Big-O会是多么好。我认为outter循环只是O(n),但内循环我不确定,* = 2如何影响它?
k = 1;
do
{
j = 1;
do
{
...
j *= 2;
} while (j < n);
k++;
} while (k < n);
答案 0 :(得分:4)
外循环运行O(n)次,因为k从1开始并需要增加n-1次以变为等于1.
内循环运行O(lg(n))次。这是因为在第m次执行循环时,j = 0.5 * 2 ^(m)。
当n = j = 0.5 * 2 ^ m时,循环中断。重新排列,我们得到m = lg(2n)= O(lg(n))。
将两个循环放在一起,总代码复杂度为O(nlg(n))。
对数可能很棘手,但通常情况下,每当您看到某些内容被重复乘以或除以常数因子时,您就可以猜测算法的复杂性涉及对数或指数的项。
这就是为什么binary search重复划分它搜索到的列表大小的原因,也是O(lg(n))。
答案 1 :(得分:0)
内部循环始终从j=1
到j=n
。
为简单起见,我们假设n
是2的幂,内循环运行k
次。
每个j
次迭代的k
值为
j = 1
j = 2
j = 4
j = 8
....
j = n
// breaks from the loop
表示2^k = n
或k = lg(n)
因此,每次都会运行O(lg(n))
次。
现在,外部循环执行O(n)
次,从k=1
开始到k=n
。
因此,每次k
递增时,内循环运行O(lg(n))
次。
k=1 Innerloop runs for : lg(n)
k=2 Innerloop runs for : lg(n)
k=3 Innerloop runs for : lg(n)
...
k=n Innerloop runs for : lg(n)
// breaks from the loop
因此,总时间为n*lg(n)
因此,时间复杂度为O(nlg(n))