时间复杂度即以最基本的操作重复执行的次数,是一个算法的时间量度。多数情况下是最深层循环内的语句的原操作。通常讨论的时间复杂度指的是最坏情况下的时间复杂度。
算法的时间复杂度记为T(n)=O( ),常见的时间复杂度有:O(1),O(n^-1),O(log 2 n),O(n*log 2 n),O(n^2),O(n^3),O(2n),O(n)等形式。例如冒泡排序的时间复杂的为O(n^2),还有一些算法的时间复杂度为O(log 2 n),比如在有序表上面使用二分查找就为O(log 2 n)的时间复杂度。
关于时间复杂度的判断,一般情况下顺序执行的程序,其时间复杂度为O(1),单层循环且循环变量每次递增1的程序时间复杂度为O(n),多层循环且x层循环的循环变量都每次递增1的程序块时间复杂度为O(n^x),当然一般不会超过三层循环。当循环变量的递增不为1,或者常数时。例如以倍数增加,这时的时间复杂度就会变为log级的。这时的多层循环的时间复杂度为各个层时间复杂度的乘积,就会出现O(n*log 2 n)等形式。
例如:1>
int i=1,j=1,k;
k=i+j;
printf("k=i+j=%d\n",k);
这个代码块顺序执行,时间复杂度为O(1)。
2>
int i,k=0;
for(i=0;i<10;i++){
k+=i;
}
这个代码块中出现了单层循环,且循环变量为递增加1,所以时间复杂度为O(n)。
3>
int i,j,k;
for(i=0;i<10;i++){
for(j=i;j<11;j++){
k+=j;
}
}
这个代码块有两层循环,每层循环变量递增且递增1,时间复杂度为O(n^2).
4>
int i,j,k;
for(i=1;i<10;i++){
for(j=i;j<11;j*=2){
k+=j;
}
}
这个代码块虽然与上一个代码块都是两层循环但是内层循环的循环变量每次递增为上次的2倍,所以时间复杂度为每层循环各自时间复杂度的乘积T(n)=O(n*log 2 n)。
5> 关于递归中的时间复杂度的分析方法与循环的分析方法相同。