演算法的時間複雜度反應了程式執行時間隨輸入的規模增長而增長的量級,在很大程度上反映出演算法的優劣與否
1,時間複雜度
時間頻度:乙個演算法中語句執行的次數稱為語句頻度或者時間頻度記為t(n)
時間複雜度:在剛才提到的時間頻度中,n稱為問題的規模,當n不斷變化的時間,時間頻度t(n)也會不斷地變化,但有時候我們想知道它變化時呈現什麼規律,為此引入時間複雜度的概念
一般情況下,演算法中的基本操作重複的次數是問題規模n的某個函式,用t(n)表示,若有某個輔助函式f(n),使得當n趨近於無窮大的時候,t(n)/f(n)的極限值為不等於0的常數,則稱f(n)是t(n)的同量級函式,記為t(n)=o(f(n)),稱o(f(n))為演算法的漸進時間複雜度,簡稱為時間複雜度
t(n)=o(f(n))表示存在乙個常數c,使得當n趨於正無窮的時候總有t(n) < c*f(n),簡單來說,就是t(n)在趨於正無窮的時最大也就跟f(n)差不對大,也就是說當n趨於正無窮的時候t(n)的上屆是c*f(n)。
常見的是時間複雜度:常數介o(1),對數階o(log2n),線性階o(n),線性對數階o(nlog2n),平方階o(n2),立方階o(n3),......, k次方階o(nk),指數階o(2n)。隨著問題規模的不斷增大,上述時間複雜度不斷地增大,執行效率不斷降低
常見的演算法時間複雜度由小到大依次為:ο(1)<ο(log2n)<ο(n)<ο(nlog2n)<ο(n2)<ο(n3)<…<ο(2n)<ο(n!)
2,求解演算法時間複雜度的具體步驟:
(1)找出演算法中的基本語句(演算法中執行最多的那條語句是基本語句,通常是最內層迴圈的迴圈體)
(2)計算基本語句的執行次數和量級(只需要保證基本語句執行次數的數量級,這意味著只要保證基本語句執行次數的函式的最高次冪正確即可,可以忽略所有最低次冪和最高次冪的係數,簡化演算法分析,主要集中在增長率上)
(3)用大o表示演算法的時間效能(將基本語句執行次數的數量級放入大o中)
如果演算法中包含巢狀的迴圈,則基本語句通常是內層巢狀的迴圈體,如果演算法中包含並列的迴圈,則將並列迴圈的時間複雜度相加:
for (i=1; i<=n; i++)
x++;
for (i=1; i<=n; i++)
for (j=1; j<=n; j++)
x++;
第乙個for迴圈的時間複雜度為ο(n),第二個for迴圈的時間複雜度為ο(n2),則整個演算法的時間複雜度為ο(n+n2)=ο(n2)ο(1)表示基本語句的執行次數是乙個常數,一般來說,只要演算法中不存在迴圈語句,其時間複雜度就是ο(1)其中ο(log2n)、ο(n)、 ο(nlog2n)、ο(n2)和ο(n3)稱為多項式時間,而ο(2n)和ο(n!)稱為指數時間。
3,常見時間複雜度示例說明:
(1)o(1)
$a = $b; $b = $c; $c = $a;
以上三條單據頻度都是1,該程式段的執行時間是乙個與問題規模n無關的常數,演算法的時間複雜度wie常數階,記做t(n)=o(1)
演算法的執行時間不隨問題規模n增長而增長,即使演算法中有n條語句,其執行時間也不過是乙個較大的常數該類演算法時間複雜度是o(1)。
(2)o(n2)
$num = 0;
for ($i=0; $i < $n; $i++)
}
(3)o(n)
$a = 0;
$b = 1;
for ($i=1;$i<=n;$i++)
(4)o(log2n)
$i = 1;
while ($i <= $n)
$i = $i * 2;
語句1的頻度是1, 設語句2的頻度是f(n), 則:2^f(n)<=n;f(n)<=log2n取最大值f(n)=log2nt(n)=o(log2n)
(5)o(n3)
for($i=0;$i
}
4,常用演算法的時間複雜度和空間複雜度排序法平均時間
最差情形
穩定度額外空間
備註冒泡
o(n²)
o(n²)
穩定o(1)
n小時較好
交換o(n²)
o(n²)
不穩定o(1)
n小時較好
選擇o(n²)
o(n²)
不穩定o(1)
n小時較好
插入o(n²)
o(n²)
穩定o(1)
大部分已排序時候好
基數o(logrb)
o(logrb)
穩定o(n)
b是真數(0-9)r是基數(個十百)
shell
o(nlogn)
o(nⁿ
)1不穩定
o(1)
s是所選分組
快速o(nlogn)
o(n2)
不穩定o(nlogn)
n大時較好
歸併o(nlogn)
o(nlogn)
穩定o(1)
n大時較好
堆o(nlogn)
o(nlogn)
不穩定o(1)
n大時較好
乙個演算法的空間複雜度(space complexity)s(n)定義為該演算法所耗費的儲存空間,它也是問題規模n的函式。漸近空間複雜度也常常簡稱為空間複雜度。
空間複雜度(space complexity)是對乙個演算法在執行過程中臨時占用儲存空間大小的量度。乙個演算法在計算機儲存器上所占用的儲存空間,包括儲存演算法本身所占用的儲存空間,演算法的輸入輸出資料所占用的儲存空間和演算法在執行過程中臨時占用的儲存空間這三個方面。演算法的輸入輸出資料所占用的儲存空間是由要解決的問題決定的,是通過參數列由呼叫函式傳遞而來的,它不隨本演算法的不同而改變。儲存演算法本身所占用的儲存空間與演算法書寫的長短成正比,要壓縮這方面的儲存空間,就必須編寫出較短的演算法。演算法在執行過程中臨時占用的儲存空間隨演算法的不同而異,有的演算法只需要占用少量的臨時工作單元,而且不隨問題規模的大小而改變,我們稱這種演算法是「就地\"進行的,是節省儲存的演算法。
當乙個演算法的空間複雜度為乙個常量,即不隨被處理資料量n的大小而改變時,可表示為o(1);當乙個演算法的空間複雜度與以2為底的n的對數成正比時,可表示為0(10g2n);當乙個演算法的空i司複雜度與n成線性比例關係時,可表示為0(n).若形參為陣列,則只需要為它分配乙個儲存由實參傳送來的乙個位址指標的空間,即乙個機器字長空間;若形參為引用方式,則也只需要為其分配儲存乙個位址的空間,用它來儲存對應實參變數的位址,以便由系統自動引用實參變數。
演算法時間複雜度和空間複雜度
在進行演算法分析時,語句總的執行次數t n 是關於問題規模n的函式,進行分析t n 隨著n的變化情況並確定t n 的數量級。演算法的時間複雜度,也就是演算法的時間度量,記作 t n o f n 它表示隨著問題規模n的增大,演算法執行時間的增長率和f n 的增長率相同,稱作演算法的漸近時間複雜度,簡稱...
演算法時間複雜度和空間複雜度
執行演算法所需要的時間 空間複雜度 執行演算法所需要的記憶體空間 常見時間複雜度 例如 常數階o 1 線性階o n 平方階o n 2 立方階o n 3 對數階o log2n nlog2n階o nlog2n 指數階o n n 效率從大到小 o 1 o log2n o n o nlog2n o n 2 ...
演算法時間複雜度和空間複雜度
為了在函式之間建立一種相對的級別,我們通過比較其相對增長率有以下兩個定義 如果存在正常數c和n0使得當n n0時t n cf n 則記為t n o f n 即f n 增長率大於等於t n f n 是其上界 如果存在正常數c和n0使得當n n0時t n cf n 則記為t n f n 即f n 增長率...