算法的时间复杂度


时间复杂度

在计算机科学中,时间复杂性,又称时间复杂度,算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值