时间复杂度:基本操作重复执行的次数
常见的算法时间复杂度从小到大依次为:
O(1) < O(log2n) < O(n) < O(nlog2n) < O(n^2) < O(n^3) ......< O(2n) < O(n!)
时间复杂度通常使用大O渐近表示法(括号内就是算法执行的次数)
推到法:
1.若括号内是常数都写成O(1)
2.若括号内是多项式 例如O(n^2+3n+9)则只保留最高次项:n^2
3.若是最高次项的系数不为1则统一写成1
例题:
1.
for(int i=0; i<n; i++){
for(int j=i; j<n; j++){
printf("执行一次");
}
}
解题思路及答案:
先看外层循环:循环n次;再看内部循环:循环n次—1*n*n=O(n^2)
2.
for(int i=0 ; i<n ; ++i){
for(int j=0 ; j<n ; ++j){
printf("数据结构好难")
}
}
for(int i=0 ; i<n; ++i){
printf("数据结构真的好难")
}
解题思路及答案:
第一个是双重循环 ,执行了n*n=n^2,第二个是一重循环,执行了n次;总执行:n^2+n;但是这里必须使用最高次项来表示复杂度:n^2
3.
for(int i=0 ; i<n ; ++i){
for(int j=i ; j<n ; ++j){
printf("数据结构好难")
}
}
解题思路及答案:
当i=0时,里层执行n次;当i=1时,里层执行(n-1)次;当i=2时,里层执行(n-2)次;当i=3时,里层执行(n-3)次以此类推:我们只需要把里层的次数相加—n*(n-1)/2=n^2/2-n/2=O(n^2)
4.
for(int i=1 ; i<n ; i*=2){
printf("数据结构好难")
}
解题思路及答案:
首先我们先设n=8,T(8)=3,2^3=2^T(8)=8
n=16,T(16)=4;2^4=2^T(16)=16
以此类推:2^T(n)=n;T(n)=(log2n)--->T(n)=O(logn)
补充(对数):a^?=b—>?=logab(以a为底b的对数)
5.
int x = 90;
int y = 100;
while (y > 0){
if (x > 100){
x = x - 10;
y--;
}
else
{
x++;
}
}
解题思路及答案:
这段代码里只有常量,所以时间复杂度只有O(1)