演算法複雜度分為時間複雜度和空間複雜度,乙個好的演算法應該具體執行時間短,所需空間少的特點。
隨著計算機硬體和軟體的提公升,乙個演算法的執行時間是算不太精確的。只能依據統計方法對演算法進行估算。我們拋開硬體和軟體的因素,演算法的好壞直接影響程式的執行時間。
我們看一下小例子:
int value = 0; // 執行了1次
for (int i = 0; i < n; i++)
這個演算法執行了 1 + n 次,如果n無限大,我們可以把前邊的1忽略,也就是說這個演算法執行了n次
時間複雜度常用大o符號表示,這個演算法的時間複雜度就是o(n).
概念: 一般情況下,演算法的基本操作重複執行的次數是模組n的某一函式f(n),因此,演算法的時間複雜度記做 t(n) = o(f(n))。 隨著模組n的增大,演算法執行的時間增長率f(n)的增長率成正比,所以f(n)越小,演算法 的時間複雜度越低,演算法的效率越高。
計算時間複雜度
1.去掉執行時間中的所有加法常數。
2.只保留最高端項。
3.如果最高端項存在且不是1,去掉與這個最高端相乘的常數得到時間複雜度
我們看乙個例子
for (int i = 0; i < n; i++)
}當 i = 0 時 裡面的fo迴圈執行了n次,當i等待1時裡面的for迴圈執行了n - 1次,當i 等於2裡裡面的fro執行了n - 2次........所以執行的次數是
根據我們上邊的時間複雜度演算法
1.去掉執行時間中的所有加法常數: 沒有加法常數不用考慮
2.只保留最高端項: 只保留
3. 去掉與這個最高端相乘的常數: 去掉
最終這個演算法的時間複雜度為
再看乙個線性的
for ( int i = 0; i < n; i++)
因為迴圈要執行n次所以時間複雜度為o(n)
其它的我也就不乙個乙個算了,下面給出了常用的時間複雜度
排序法最差時間分析
平均時間複雜度
穩定度空間複雜度
氣泡排序
o(n2)
o(n2)
穩定o(1)
快速排序
o(n2)
o(n*log2n)
不穩定o(log2n)~o(n)
選擇排序
o(n2)
o(n2)
穩定o(1)
二叉樹排序
o(n2)
o(n*log2n)
不一頂o(n)
插入排序
o(n2)
o(n2)
穩定o(1)
堆排序o(n*log2n)
o(n*log2n)
不穩定o(1)
希爾排序oo
不穩定o(1)
類似於時間複雜度的討論,乙個演算法的空間複雜度(space complexity)s(n)定義為該演算法所耗費的儲存空間,它也是問題規模n的函式。漸近空間複雜度也常常簡稱為空間複雜度。
我們在寫**時,完全可以用空間來換取時間,比如說,要判斷某某年是不是閏年,你可能會花一點心思寫了乙個演算法,而且由於是乙個演算法,也就意味著,每次給乙個年份,都是要通過計算得到是否是閏年的結果。還有另乙個辦法就是,事先建立乙個有2 050個元素的陣列(年數略比現實多一點),然後把所有的年份按下標的數字對應,如果是閏年,此陣列項的值就是1,如果不是值為0。這樣,所謂的判斷某一年是否是閏年,就變成了查詢這個陣列的某一項的值是多少的問題。此時,我們的運算是最小化了,但是硬碟上或者記憶體中需要儲存這2050個0和1。
演算法的輸入輸出資料所占用的儲存空間是由要解決的問題決定的,是通過參數列由呼叫函式傳遞而來的,它不隨本演算法的不同而改變。儲存演算法本身所占用的儲存空間與演算法書寫的長短成正比,要壓縮這方面的儲存空間,就必須編寫出較短的演算法。演算法在執行過程中臨時占用的儲存空間隨演算法的不同而異,有的演算法只需要占用少量的臨時工作單元,而且不隨問題規模的大小而改變,我們稱這種演算法是「就地"進行的,是節省儲存的演算法,如這一節介紹過的幾個演算法都是如此;有的演算法需要占用的臨時工作單元數與解決問題的規模n有關,它隨著n的增大而增大,當n較大時,將占用較多的儲存單元,例如將快速排序和歸併排序演算法就屬於這種情況。
通過一筆空間上的開銷來換取計算時間的小技巧。到底哪乙個好,其實要看你用在什麼地方。
演算法的空間複雜度通過計算演算法所需的儲存空間實現,演算法空間複雜度的計算公式記作:s(n)= o(f(n)),其中,n為問題的規模,f(n)為語句關於n所佔儲存空間的函式。
一般情況下,乙個程式在機器上執行時,除了需要儲存程式本身的指令、常數、變數和輸入資料外,還需要儲存對資料操作的儲存單元。若輸入資料所佔空間只取決於問題本身,和演算法無關,這樣只需要分析該演算法在實現時所需的輔助單元即可。若演算法執行時所需的輔助空間相對於輸入資料量而言是個常數,則稱此演算法為原地工作,空間複雜度為o(1)。
當乙個演算法的空間複雜度為乙個常量,即不隨被處理資料量n的大小而改變時,可表示為o(1);當乙個演算法的空間複雜度與以2為底的n的對數成正比時,可表示為0(10g2n);當乙個演算法的空i司複雜度與n成線性比例關係時,可表示為0(n).若形參為陣列,則只需要為它分配乙個儲存由實參傳送來的乙個位址指標的空間,即乙個機器字長空間;若形參為引用方式,則也只需要為其分配儲存乙個位址的空間,用它來儲存對應實參變數的位址,以便由系統自動引用實參變數。
對於乙個演算法,其時間複雜度和空間複雜度往往是相互影響的。當追求乙個較好的時間複雜度時,可能會使空間複雜度的效能變差,即可能導致占用較多的儲存空間;反之,求乙個較好的空間複雜度時,可能會使時間複雜度的效能變差,即可能導致占用較長的執行時間。另外,演算法的所有效能之間都存在著或多或少的相互影響。因此,當設計乙個演算法(特別是大型演算法)時,要綜合考慮演算法的各項效能,演算法的使用頻率,演算法處理的資料量的大小,演算法描述語言的特性,演算法執行的機器系統環境等各方面因素,才能夠設計出比較好的演算法。
資料結構之時間複雜度和空間複雜度
準備系統性的記錄一下資料結構與演算法的知識點,今天就先從時間複雜度與空間複雜度開始咯 時間複雜度的定義 在電腦科學中,演算法的時間複雜度是乙個函式,它定量描述了該演算法的執行時間。乙個演算法執行所耗費的時間,從理論上說,是不能算出來的,只有你把你的程式放在機器上跑起來,才能知道。並且在測試過程中還需...
資料結構之時間 空間複雜度分析
在很多資料結構的面試題中看似簡單,但是對題目的要求卻挺高,主要就體現在複雜度分析方面。複雜度又分為時間複雜度和空間複雜度。1.時間複雜度 時間複雜度實際就是函式,函式計算執行的基本操作次數 在進行時間複雜度分析時需注意 1 時間複雜度強調的是函式執行的操作次數,這裡的函式是指數學裡面的函式,而不是c...
演算法之 時間複雜度和空間複雜度
平時用的少,經常忘記,這裡記錄下時間複雜度的概念 複雜度是演算法的一種標記方法。用o表示,通常讀為big o o的包含了時間複雜和空間複雜度 這裡就只說時間複雜度。時間複雜度的概念,個人總結,可能不太準確。時間複雜度,即標記乙個問題,隨著問題規模的變化,所需要花費時間的關係。時間複雜度就是問題規模和...