标签:成本 bmc 技巧 while 嵌套 nbu time ++i 等于
算法的执行效率一般来说就是算法代码执行的时间。那么如何得到代码的执行时间?先列出代码
假设每行代码执行时间一样。
int calc(int n)
{
int sum=0;//执行一个time
int i=1;//执行一个time
int j=1;//执行一个time
//循环了n遍 所以是2n*time
//从此整个时间T(n) = (2n2+2n+3)*time
for(;i<=n;++i)
{
j=1;
for(;j<=n;j++)
{
sum=sum+i*j
}
}
}
从这里出现一个重要的规律就是所有代码的执行时间T(n)和每行代码的执行此时n成正比Tn=O(f(n))。上面出现T(n)=2n2+2n+3,我们只需要记录一个最大量级就行。比如T(n)=O(n2).
int calc(int n)
{
int sum=0;
int i=0;
for(;i<=n;++i)
{
sum=sum+i;
}
return sum;
}
????这里直接查看for部分代码,这两行代码被执行了n次,所以总的时间复杂度为O(n)
int calc(int n)
{
int sum=0;//执行一个time
int i=1;//执行一个time
int j=1;//执行一个time
int p = 0;
for(int p=0;p<n;p++)
{
sum=sum+p;
}
sum=0;
//循环了n遍 所以是2n*time
//从此整个时间T(n) = (2n2+2n+3)*time
for(;i<=n;++i)
{
j=1;
for(;j<=n;j++)
{
sum=sum+i*j
}
}
}
????这段代码中第一个循环p循环n次,不管这个n是100,1000等,都是产量级的时间。同理第二个第二段循环代码为O(n2),所以最终结果是O(n2)
int i=2;
int j=3;
int sum=i+j;
一般来说如果代码的执行时间不随着n的增大而增长,那么就是O(1)。小技巧就是程序中没有循环,递归等
int i=1;
while(i<=n)
{
i=i*2;
}
这里的i从1开始每次循环乘以2直到i小于了n结束。也就是20,21.....2x,那么2x=n,x=log2n.这个时候如果i=i*4,那就是x=log4n,那么log4n实际上等于log42*log2n,所以呢O(log4n)=O(C*log2n).之前说过我们的这个C常量,可以忽略。所以O(log4n)=O(log2n).在对数阶时间复杂度表示中,忽略对数的
4 O(m+n)和O(m*n)
int cal(int m, int n)
{
int sum_1 = 0;
int i = 1;
for (; i < m; ++i)
{
sum_1 = sum_1 + i;
}
int sum_2 = 0;
int j = 1;
for (; j < n; ++j)
{
sum_2 = sum_2 + j;
}
return sum_1 + sum_2; }
}
这里的m和n那个量级大不好预判
标签:成本 bmc 技巧 while 嵌套 nbu time ++i 等于
原文地址:https://www.cnblogs.com/lanjianhappy/p/12079310.html