程序员数学基础【二、时间复杂度】(Python版本)
測(cè)試使用語(yǔ)言:【Python】
由于此類(lèi)語(yǔ)言入門(mén)非常容易,哪怕初中生亦可以,并且本科/研究生寫(xiě)論文、做實(shí)驗(yàn)多數(shù)所用語(yǔ)言都是【Python】故而選擇此語(yǔ)言。
代碼運(yùn)行平臺(tái):【win10 x64】
代碼環(huán)境安裝:【https://blog.csdn.net/feng8403000/article/details/113784766】
代碼編碼格式:【https://blog.csdn.net/feng8403000/article/details/113785344】
完整的vs搭建并使用【Python】,非常簡(jiǎn)單,基礎(chǔ)部分無(wú)需任何環(huán)境配置,工具自帶即可。
一、時(shí)間頻度:
一個(gè)算法花費(fèi)的時(shí)間與算法中語(yǔ)句的執(zhí)行次數(shù)成比例,哪個(gè)算法中語(yǔ)句執(zhí)行的次數(shù)多,它花費(fèi)時(shí)間就多。
一個(gè)算法中的語(yǔ)句執(zhí)行次數(shù)稱(chēng)為語(yǔ)句頻度或時(shí)間頻度。記為T(mén)(n)。
在計(jì)算時(shí)間頻度時(shí),常數(shù)項(xiàng)和低次項(xiàng)可以忽略,因?yàn)殡S著n變大,時(shí)間頻度會(huì)無(wú)限接近。
例如:從1++++++100的結(jié)果5050,利用等差數(shù)列公式計(jì)算的會(huì)飛快
import time #累計(jì)1至1億的總和 start=1 end=100000000 #暴力運(yùn)算 starttime = time.time()#開(kāi)始 result=0 for x in range(start,end+1):result+=x endtime = time.time()#結(jié)束 print("暴力運(yùn)算結(jié)果:{0},消耗時(shí)間:{1}".format(result,(endtime - starttime)))#等差數(shù)列 starttime1 = time.time()#開(kāi)始 result1=end*(end+1)//2 endtime1 = time.time()#結(jié)束 print("等差數(shù)列求和公式結(jié)果:{0},消耗時(shí)間:{1}".format(result1,(endtime1 - starttime1)))分析:
循環(huán)從1-1億一共1億次,需要再判斷一回才能退出。
算法2:result=(1+end)*end/2(這個(gè)是等差數(shù)列求和公式:(a1+an)*n/2)一步到位?T(n)=1
二、時(shí)間復(fù)雜度
1.時(shí)間復(fù)雜度:
1)一般情況下,算法中的基本操作語(yǔ)句的重復(fù)執(zhí)行次數(shù)是時(shí)間規(guī)模n的某個(gè)函數(shù),用T(n)表示,若有某個(gè)輔助函數(shù)f(n),使得當(dāng)n趨于無(wú)窮大時(shí),T(n)/f(n)的極限值是一個(gè)不等于0的常數(shù),則稱(chēng)f(n)是T(n)的同量級(jí)函數(shù),記做T(n)=O(f(n)),稱(chēng)O(f(n))為算法的漸進(jìn)時(shí)間復(fù)雜度,簡(jiǎn)稱(chēng)時(shí)間復(fù)雜度。
2)T(n)不同,但時(shí)間復(fù)雜度可能相同,如T(n)=n2+7n+6與T(n)=3n2+2n+2,他們的T(n)不同,但時(shí)間復(fù)雜度相同,都為O(f(n))。
3)計(jì)算時(shí)間復(fù)雜度的方法
√ 常用常數(shù)1代替運(yùn)行時(shí)間中的加法常數(shù) 如?T(n)=n2+7n+6==>?T(n)=n2+7n+1
√ 修改后的運(yùn)行次數(shù)函數(shù)中,只保留最高階項(xiàng)??T(n)=n2+7n+1==>?T(n)=n2
√ 去除最高階項(xiàng)的系數(shù) ?T(n)=n2==>?T(n)=n2==>O(n2)
2.常見(jiàn)的時(shí)間復(fù)雜度:
1)無(wú)循環(huán)條件下常數(shù)階 O(1) 最穩(wěn)定
2)對(duì)數(shù)階 如O(log2n)
3)線(xiàn)性階 O(n)
4)線(xiàn)性對(duì)數(shù)階 O(nlog2n) —線(xiàn)性階*對(duì)數(shù)階
5)平方階 O(n2)?? 線(xiàn)性階*線(xiàn)性階? ?兩層n循環(huán)
6)立方階 O(n3) 三層n循環(huán)
7)k次方階 O(nk)
8)指數(shù)階 O(2n) 執(zhí)行慢(指數(shù)爆炸)
說(shuō)明:
○常見(jiàn)的時(shí)間算法時(shí)間復(fù)雜度從(1)到(8)越來(lái)越復(fù)雜,隨著n的增大,時(shí)間復(fù)雜度不斷增大,算法的執(zhí)行效率越來(lái)越低(O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2) <O(n3)?<O(nk)<O(2n)<O(n)!<O(nn))—簡(jiǎn)單記法:長(zhǎng)對(duì)冪指階
○我們應(yīng)該盡可能避免(8)指數(shù)階的算法
3.時(shí)間復(fù)雜度的規(guī)則
1)加法規(guī)則? T(n)=T1(n)+T2(n)=O(f(n)+O(g(n)=O(max(O(f(n),O(g(n)) 多項(xiàng)式相加,只保留最高的階,且系數(shù)變?yōu)?
2)乘法規(guī)則? T(n)=T1(n)*T2(n)=O(f(n))*O(g(n))=O(f(n)*g(n))? 多項(xiàng)相乘,都保留
三、平均時(shí)間復(fù)雜度與最壞時(shí)間復(fù)雜度
1)平均時(shí)間復(fù)雜度是指所有有可能的輸入實(shí)例均以等概率出現(xiàn)的情況下,該算法的運(yùn)行時(shí)間
2)最壞情況下的時(shí)間復(fù)雜度是在算法在任何輸入實(shí)例上運(yùn)行的界限,就保證了算法的運(yùn)行時(shí)間 不會(huì)比最壞情況更長(zhǎng)
?
4、總結(jié):
a)、通過(guò)時(shí)間復(fù)雜度我們就可以計(jì)算出我們的代碼效率如何,在后期代碼優(yōu)化上起到證明的作用。
下篇內(nèi)容:
程序員數(shù)學(xué)基礎(chǔ)【三、取模運(yùn)算(取余運(yùn)算功能重疊部分)】(Python版本)
【https://blog.csdn.net/feng8403000/article/details/114194267】
萬(wàn)丈高樓平地起,程序員數(shù)學(xué)基礎(chǔ),從小學(xué)的【什么是數(shù)學(xué)】至【離散數(shù)學(xué)】(主要是圖論)咱們一步步成長(zhǎng),共同加油。
總結(jié)
以上是生活随笔為你收集整理的程序员数学基础【二、时间复杂度】(Python版本)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 程序员数学基础【一、基础运算符号(整数、
- 下一篇: 程序员数学基础【三、取模运算(取余运算功