时间复杂度
在计算机科学中,时间复杂性,又称时间复杂度,算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,亦即考察输入值大小趋近无穷时的情况
常数阶
int sum =0; n =100; /执行一次/
sum = (1+n)*n/2; /执行一次/
printf("%d",sum); /执行一次/ 时间复杂度只有O(1)
线性阶
int count =1;
while(count < n){
count = count *2;
/时间复杂度为O(1)的程序/
} 这个循环是2^x = n --> x = log2^n ,即时间复杂度为O(logn)
平方阶
int i;
for(i =0; i < n ; i++){
for(j =0; j < n ; j++){
/时间复杂度为O(1)的程序/
}
}
上面的程序中,对于对于内层循环,它的时间复杂度为O(n),但是它是包含在外层循环中,再循环n次,因此这段代码的时间复杂度为O(n^2)。
int i;for(i =0; i < n ; i++){
for(j =0; j < m ; j++){
/时间复杂度为O(1)的程序/
}
}
但是,如果内层循环改成了m次,时间复杂度就为O(n*m)
int i;
for(i =0; i < n ; i++){
for(j = i ; j < n ; j++){
/时间复杂度为O(1)的程序/
}
}
上面的内层循环j = i ;而不是0,因为i = 0时,内层循环执行了n次,当i=1时,执行了n-1次……当i=n-1时,执行了1次,所以总的执行次数为:n+(n-1)+(n-1)+…+1 = n(n+1)/2 = n^2/2 + n/2
根据大O推导方法,保留最高阶项,n*n/2 ,然后去掉这个项相乘的常数,1/2因此,这段代码的时间复杂度为O(n^2)
实例分析
int i,j;
void function(int count){
print(count);
}
for(i =0; i < n ; i++){
function (i)
} 时间复杂度为O(n)
int i,j;
void function(int count){
int j;
for(j = count ; j < n ;j++){
/时间复杂度为O(1)的程序/
}
}
for(i =0; i < n ; i++){
function (i)
}
和第一个的不同之处在于把嵌套内循环放到了函数中,因此最终的时间复杂度为O(n^2)
void function(int count){
int j;
for(j = count ; j < n ;j++){
/时间复杂度为O(1)的程序/ }
}
n++; /执行次数为1/
function(n); /执行次数为n/
int i,j;
for(i =0; i < n ; i++){ /执行次数为n*n/
function(i);
}
for(i =0; i < n ; i++){ /执行次数为n(n+1)/2/
for(j = i ; j < n ; j++){
/*时间复杂度为O(1)的程序*/
}
}
它的执行次数f(n) = 1 + n +n2 + n(n+1)/2 + 3/2n*n+3/2 n+1,最终它的时间复杂度为:O(n^2)
常见的时间复杂度
常用的时间复杂度所耗费的时间从小到大依次是:
参考 https://www.cnblogs.com/fanchangfa/p/3868696.html