fun()的时间复杂度是多少?

时间:2018-12-31 10:24:22

标签: c runtime

函数exe:log(n)中的运行时间是什么

int fun(int n) {
    int count = 0;
    for (int i = n; i > 0; i /= 2)
        for (int j = 0; j < i; j++)
            count += 1;
    return count;
}

3 个答案:

答案 0 :(得分:3)

不是O(log n),而是O(n)。您可以这样考虑:外循环的每次运行都会将其余数据(最初为n)发送到内循环进行处理,然后将其删除一半。内循环在处理的数据中显然是线性的。

在第一次迭代中,外循环将整个n发送到内循环,内循环“付” n步骤来处理它。

在第二次迭代中,剩下n / 2数据,因此innter循环为此支付了n / 2;它总共支付了1.5n

在下一次迭代中,剩下n / 2 / 2 == n/4数据,为此内部循环要多付n/4,因此总计1.75n

依此类推,直到整个n支付了两次,因此费用为2n,即O(n),实际上甚至是ϴ(n)。

答案 1 :(得分:1)

复杂度为

  

O(n)

例如,假设我们取n = 32 因此,对于各种迭代,循环将运行的次数为 32,16,8,4,2,1

因此添加后将为63,这是循环运行的总次数 就是 2 * n-1

在数学上,对于任何G.P和的值,其级数类似于n,n / 2,n / 4,n / 8 ...... 1

假设我们再次取n = 32 然后

sum = a *(1-r ^ nof)/(1-r)= 32 *(1-(1/2)^ 5)/(1-(1/2))= 63

其中nof(外循环运行的次数)= 5为log2n,a = 32,r =(1/2)

  

对于任何数字,它将小于2 * n

答案 2 :(得分:0)

您的代码的时间复杂度仅为 O(n)