如何解决对于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)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。