找到这段代码的大O.

时间:2015-10-09 03:54:01

标签: algorithm big-o complexity-theory

我需要一些帮助才能找到此代码的复杂性或Big-O。如果有人可以解释每个循环的Big-O会是多么好。我认为outter循环只是O(n),但内循环我不确定,* = 2如何影响它?

k = 1;

do
{
   j = 1;
   do
   {
      ...
      j *= 2;
   } while (j < n);

   k++;
} while (k < n);

2 个答案:

答案 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=1j=n

为简单起见,我们假设n是2的幂,内循环运行k次。

每个j次迭代的k值为

j = 1
j = 2
j = 4
j = 8
.... 
j = n
// breaks from the loop 

表示2^k = nk = 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))