算法复杂度的理解
算法復(fù)雜度的理解
from:http://blog.sina.com.cn/s/blog_4bab8e7f0102vmth.html算法復(fù)雜度分為時(shí)間復(fù)雜度和空間復(fù)雜度。
時(shí)間復(fù)雜度的計(jì)算
?1.一個(gè)算法執(zhí)行所耗費(fèi)的時(shí)間,從理論上是不能算出來(lái)的,必須上機(jī)運(yùn)行測(cè)試才能知道。但我們不可能也沒(méi)有必要對(duì)每個(gè)算法都上機(jī)測(cè)試,只需知道哪個(gè)算法花費(fèi)的時(shí)間多,哪個(gè)算法花費(fèi)的時(shí)間少就可以了。并且一個(gè)算法花費(fèi)的時(shí)間與算法中語(yǔ)句的執(zhí)行次數(shù)成正比例,哪個(gè)算法中語(yǔ)句執(zhí)行次數(shù)多,它花費(fèi)時(shí)間就多。
一個(gè)算法中的語(yǔ)句執(zhí)行次數(shù)稱為語(yǔ)句頻度或時(shí)間頻度。記為T(n)。
2.一般情況下,算法的基本操作重復(fù)執(zhí)行的次數(shù)是模塊n的某一個(gè)函數(shù)f(n),因此,算法的時(shí)間復(fù)雜度記做:T(n)=O(f(n))。隨著模塊n的增大,算法執(zhí)行的時(shí)間的增長(zhǎng)率和f(n)的增長(zhǎng)率成正比,所以f(n)越小,算法的時(shí)間復(fù)雜度越低,算法的效率越高。
在計(jì)算時(shí)間復(fù)雜度的時(shí)候,先找出算法的基本操作,然后根據(jù)相應(yīng)的各語(yǔ)句確定它的執(zhí)行次數(shù),再找出T(n)的同數(shù)量級(jí)(它的同數(shù)量級(jí)有以下:1,Log2n ,n ,nLog2n ,n的平方,n的三次方,2的n次方,n!),找出后,f(n)=該數(shù)量級(jí),若T(n)/f(n)求極限可得到一常數(shù)c,則時(shí)間復(fù)雜度T(n)=O(f(n))。
3.常見的時(shí)間復(fù)雜度
按數(shù)量級(jí)遞增排列,常見的時(shí)間復(fù)雜度有:
常數(shù)階O(1), ?對(duì)數(shù)階O(log2n), ?線性階O(n), ?線性對(duì)數(shù)階O(nlog2n), ?平方階O(n^2), 立方階O(n^3),..., k次方階O(n^k), 指數(shù)階O(2^n) 。
其中,
1.O(n),O(n^2), 立方階O(n^3),..., k次方階O(n^k) 為多項(xiàng)式階時(shí)間復(fù)雜度,分別稱為一階時(shí)間復(fù)雜度,二階時(shí)間復(fù)雜度。。。。
2.O(2^n),指數(shù)階時(shí)間復(fù)雜度,該種不實(shí)用
3.對(duì)數(shù)階O(log2n), ? 線性對(duì)數(shù)階O(nlog2n),除了常數(shù)階以外,該種效率最高
因此效率按照從高到底排序?yàn)?#xff0c;常數(shù)階,對(duì)數(shù)階,線性階??
?空間復(fù)雜度
空間復(fù)雜度(Space Complexity)是對(duì)一個(gè)算法在運(yùn)行過(guò)程中臨時(shí)占用存儲(chǔ)空間大小的量度。一個(gè)算法在計(jì)算機(jī)存儲(chǔ)器上所占用的存儲(chǔ)空間,包括存儲(chǔ)算法本身所占用的存儲(chǔ)空間,算法的輸入輸出數(shù)據(jù)所占用的存儲(chǔ)空間和算法在運(yùn)行過(guò)程中臨時(shí)占用的存儲(chǔ)空間這三個(gè)方面。
我們?cè)趯懘a時(shí),完全可以用空間來(lái)?yè)Q取時(shí)間,比如說(shuō),要判斷某某年是不是閏年,你可能會(huì)花一點(diǎn)心思寫了一個(gè)算法,而且由于是一個(gè)算法,也就意味著,每次給一個(gè)年份,都是要通過(guò)計(jì)算得到是否是閏年的結(jié)果。還有另一個(gè)辦法就是,事先建立一個(gè)有2 050個(gè)元素的數(shù)組(年數(shù)略比現(xiàn)實(shí)多一點(diǎn)),然后把所有的年份按下標(biāo)的數(shù)字對(duì)應(yīng),如果是閏年,此數(shù)組項(xiàng)的值就是1,如果不是值為0。這樣,所謂的判斷某一年是否是閏年,就變成了查找這個(gè)數(shù)組的某一項(xiàng)的值是多少的問(wèn)題。此時(shí),我們的運(yùn)算是最小化了,但是硬盤上或者內(nèi)存中需要存儲(chǔ)這2050個(gè)0和1。
算法的輸入輸出數(shù)據(jù)所占用的存儲(chǔ)空間是由要解決的問(wèn)題決定的,是通過(guò)參數(shù)表由調(diào)用函數(shù)傳遞而來(lái)的,它不隨本算法的不同而改變。存儲(chǔ)算法本身所占用的存儲(chǔ)空間與算法書寫的長(zhǎng)短成正比,要壓縮這方面的存儲(chǔ)空間,就必須編寫出較短的算法。算法在運(yùn)行過(guò)程中臨時(shí)占用的存儲(chǔ)空間隨算法的不同而異,有的算法只需要占用少量的臨時(shí)工作單元,而且不隨問(wèn)題規(guī)模的大小而改變,我們稱這種算法是“就地"進(jìn)行的,是節(jié)省存儲(chǔ)的算法,如這一節(jié)介紹過(guò)的幾個(gè)算法都是如此;有的算法需要占用的臨時(shí)工作單元數(shù)與解決問(wèn)題的規(guī)模n有關(guān),它隨著n的增大而增大,當(dāng)n較大時(shí),將占用較多的存儲(chǔ)單元,例如將快速排序和歸并排序算法就屬于這種情況。
通過(guò)一筆空間上的開銷來(lái)?yè)Q取計(jì)算時(shí)間的小技巧。到底哪一個(gè)好,其實(shí)要看你用在什么地方。
轉(zhuǎn)載于:https://www.cnblogs.com/the-tops/p/6740232.html
總結(jié)
- 上一篇: 西威变频器avo下载调试资料_全程图解变
- 下一篇: 谈谈个人代码对团队合作影响