演算法(algorithm)
評價演算法優劣的依據:複雜度(時間複雜度和空間複雜度)
時間複雜度(time complexity)
eg. 某兩個演算法的時間頻度是t(n) = 100000n2
+10n+
6100000n^2+10n+6
100000
n2+1
0n+6
t (n
)=n2
t(n)=n^2
t(n)=n
2,但是時間複雜度都是t(n)=o(n
2n^2
n2)最壞時間複雜度和平均時間複雜度
時間複雜度計算
根本沒有必要計算時間頻度,即使計算處理還要忽略常量、低次冪和最高次冪的係數,所以可以採用如下簡單方法:
(1)找出演算法中的基本語句
演算法中執行次數最多的那條語句就是基本語句,通常是最內層迴圈的迴圈體
(2)計算基本語句的執行次數的數量級
只需計算基本語句執行次數的數量級,這就意味著只要保證基本語句執行次數的函式中的最高次冪正確即可,可以忽略所有低次冪和高次冪的係數。這樣能夠簡化演算法分析,並且使注意力集中在最重要的一點上:增長率
(3)用大o記號表示演算法的時間效能
將基本語句執行次數的數量級放入大o記號中
eg.
int n=8, count=0;
for(int i=1;i<=n;i++)
t(n) = n
t(n) = o(n)
int n=8,count=0;
for(int i=1;i<=n;i*=2)
log2(n)效率非常高
int n=8,count=0;
for(int i=1;i<=n;i++)
}
int n=8, count=0;
for(int i=1;i<=n;i*2)
}
int n=8,count=0;
for(int i=1;i<=n;i++)
}
當i=1,語句執行1次,i=2,語句執行2次......
需要複雜的數**算:1+2+3+...+n=(n+1)*n/2,這是時間頻度
等於1/2n^2 + 1/2n
時間複雜度是o(n
2n^2
n2)常用的時間複雜度級別
上面各種時間複雜度級別,時間複雜度越來越高,執行效率越來越低
時間複雜度
n=8(2^3)
n=10
n=100
n=1000
o(1)11
11o(logn)
33.322
6.644
9.966
o(n)810
1001000
o(nlogn)
2433.22
664.4
9966
o(n^2)
64100
10000
1000000
空間複雜度(space complexity)
演算法的儲存量包括:
程式本身所佔空間
輸入資料所佔空間
輔助變數所佔空間
輸入資料所佔空間只取決於問題本身,和演算法無關,則只需要分析除輸入和程式之外的輔助變數所佔額外空間。
空間複雜度是對乙個演算法在執行過程中臨時占用的儲存空間大小的量度,一般也作為問題規模n的函式,以數量級形式給出,記作: s(n) = o(g(n))
eg.
int fun(int n)}}
return(s);
}
由於演算法中臨時變數的個數與問題規模n無關,所以空間複雜度均為s(n)=o(1)
void fun(int a, int n, int k)
//陣列a共有n個元素
{ int i;
if(k==n-1){
for(i=0;i注意:
空間複雜度相比時間複雜度分析要少
對於遞迴演算法來說,**一般都比較簡短,演算法本身所占用的儲存空間較少,但執行時需要占用較多的臨時工作單元;若寫成非遞迴演算法,**一般可能比較長,演算法本身占用的儲存空間較多,但執行時將可能需要較少的儲存單元
演算法基本概念
所謂演算法,就是解決問題的一種方法或乙個過程。具體來講,演算法是由若干指令組成的有窮序列。演算法概念並不是計算機學科獨有的概念,生活到到處可見演算法的應用。演算法要滿足4條性質 1.輸入 2.輸出 3.確定性 4.有限性 複雜性 時間複雜度 t 演算法所求解問題規模n的 函式 漸進時間複雜度 o 當...
演算法基本概念
一什麼是演算法 解決問題的策略機制,重要的是思想 求滿足a b c 1000,a 2 b 2 c 2 條件的所有a,b,c 思路 列舉法,以下被注釋掉的語句就是列舉每個滿足條件的a,b,c 但是這段語句的演算法複雜度太大 改進 a,b的值就確定了c的值,故 改進演算法如下 import time s...
演算法 基本概念
排序 氣泡排序 每次比較相鄰兩個元素大小,交換,直到末尾,迴圈執行 穩定 選擇排序 每次從待排序列中找出最大 最小 元素放在起始位置,迴圈執行 穩定 插入排序 不斷將新元素插入到前面已排好序的序列中 穩定,比冒泡和選擇更快 適於基本有序集合 希爾排序 插入排序的改進,將資料按步長分組,每組進行插入排...