一、算法要满足的重要特征
1、 有穷性
2、确定性
3、可行性
4、输入
5、输出
二、程序运行的总时间
执行每条语句的耗时(与硬件相关)+每条语句执行的频率
cpp
for(int i = 1;i <= n;i ++) //频度为n+1次
{
for(int j = 1;j <= n;j ++) //频度为n*(n+1)次
{
c[i][j] = 0; //频度为n*n
for(int k = 1;k <= n;k ++)//频度为n*n*(n+1)次
{
c[k][j] = 0; //频度为n*n*n
}
}
}
在计算算法时间复杂度时,可以忽略所有低次幂和最高次幂的系数,这样可以简化算法分析
比如上面代码的时间复杂度就是:
f(n) = 2n^3+3n^2+2n+1 即:O(n^3)
注:(1)对算法时间复杂度的度量,通常只讨论算法在最坏情况下的时间复杂度
(2)只要可以得出确切的数字,不管是一万还是一亿,时间复杂度都是O(1)
三、例子
x++;
s=0;
时间复杂度为O(1)
for(int i = 1;i <= 1000000;i ++) //频度为n+1次{
}
时间复杂度为O(1)
for(int i = 1;i <= n;i ++) //频度为n+1次{
}
时间复杂度为O(n)
x++;s=0;
for(int i = 1;i <= n;i ++) //频度为n+1次
{
for(int j = 1;j <= n;j ++) //频度为n*(n+1)次
{
}
}
for(int i = 1;i <= n;i ++) //频度为n+1次
{
}
时间复杂度为O(n^2)
for(int i = 1;i <= n;i ++) //频度为n+1次{
for(int j = 1;j <= i;j ++) //频度为n*(n+1)/2次
{
for(int k = 1;k <= j;k ++)
{
}
}
}
时间复杂度为O(n^3)
for(int i = 1;i <= n;i = i*2){
x ++;
s = 0;
}
时间复杂度为O(log2(n))
计算:
次数 1 2 3 4 t
i 1 2 4 8 ?
i 2^0 2^1 2^2 2^3 2^(t-1)
2^(t-1) = n 就可以算出来t = log2(n)
**总结:**计算复杂的时间复杂度时,要列表