对于int i = 0; i <pow2,n; i ++的复杂度

问题描述

我有问题,如何确定此算法的复杂性?

int pow (int a,int b) {
   int result=1;
   while (b>0) {
     result = result*a;
     b = b-1;
   }
   return result;
}

void bar (int n) {
   for (int i=0; i<pow(2,n); i++)
       printf("%d",i);
}

教授的解决方案是pow(a,b)具有O(n)的复杂度,并且因为for循环的pow具有O(n)O(2^n)的复杂度,因此最后,bar的总复杂度为O(n*2^n)

但是为什么2^n呢?我不明白请帮助我,因为我有考试。

谢谢

解决方法

让我逐步向您解释。
[1] "coltest12" 运行了多少次? for loop次对吗?
因此,pow(2,n)就是2的幂n,因此我们的第一个复杂度是O(2 ^ n)。

谈到pow(2,n)函数的复杂性。
通过查看它,我们可以说循环运行了多少次? “ b”次。因此,pow(a,b)的时间复杂度完全取决于“ b”,因此它是O(b)。

在算法中,b只是n。因此,我们的第二个复杂度为O(n)。

因此,现在我们有一个循环运行pow(2,n)次,每次循环运行O(b)= O(n)次。因此,我们乘以复杂度,因此它变为O(n * 2 ^ n)
希望我有点清楚。

,

函数pow的复杂度为O(n),如您所述。

但是,功能bar可以看成是:

void bar (int n) {
    int m = pow(2,n);   // pow is called only once
    for (int i=0; i<m; i++)
       printf("%d",i);
}

这意味着函数bar的复杂度为 O(n + 2 ^ n),即 O(2 ^ n)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...