演算法複雜度:
-
時間複雜度:執行一個演算法程式,所需要的時間
-
空間複雜度:執行一個演算法程式,所消耗計算機記憶體大小
時間複雜度
o(1):
-
常數階,指的無論資料量如何遞增,時間複雜度保持不變,典型的演算法就是hash演算法
-
n的值不管如何的變動,其演算法執行次數都是3次,故這種時間恆定的就是常數階
<?php
$sum = 0; $n = 3;
$sum = ($n-1)*$n;
echo $sum;
o(n)
-
線性階,指的是時間的複雜度會隨著n的而線性增長。
-
下面的程式碼的時間複雜度是o(n),因為程式碼的執行次數會執行n次,公式 times = n;比例為1;
<?php
for($i = 0; $i < $n; $i++) {
}
o(logn)
-
對數階,如n=256,則算出為o(8),演算法執行的次數為8次。
-
如下所示,2^x= n,推出 x = log2^n,所以當n設定為256的時候,while迴圈執行程式需要8次。
$count = 1;
while ($count < $n) {
$count *= 2;
}
o(n^2)
-
平方階,通常指的都是雙重迴圈
-
如下,時間複雜度就是o(n*n)
for ($i = 0; $i < $n; $i++) {
for($j = 0; $j < $n; $j++) {
}
}
- 如下 時間的複雜度為o(m*n)
for ($i = 0; $i < $m; $i++) {
for($j = 0; $j < $n; $j++) {
}
}
- 如下,涉及到等差數列的計算,演算法執行的總次數 = n + (n-1)+ (n-2)+ .. +1 = n(n+1)/2 = n^2/2+1/2*n。我們在推導o階函式的時候:第一沒有常數不考慮;第二保持最高階的項,故保持n^2/2;第三去除係數;所以最終演算法的複雜度還是o(n^2)
for ($i = 0; $i < $n; $i++) {
for($j = 0; $j < $n-$i; $j++) {
}
}
常見的時間複雜度
階 非正式術語
O(1) 常數階
O(n) 線性階
O(n2) 平方階
O(logn) 對數階
O(nlogn) nlogn階
O(n3) 立方階
O(2n) 指數階
常用的時間複雜度所耗費的時間從小到大依次是:
O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n) < O(n!) < O(nn)
演算法空間複雜度
- 演算法的空間複雜度透過計算演算法所需的儲存空間實現
- 演算法空間複雜度的計算公式:S(n) = O(f(n)),其中 n 為問題的規模,f(n)為語句關於 n 所佔儲存空間的函式。
總結
- 演算法是解決特定問題求解步驟的描述,在計算機中為指令的有限序列,並且每條指令表示一個或多個操作。
- 演算法的特性:有窮性、確定性、可行性、輸入、輸出。
- 演算法的設計要求:正確性、可讀性、健壯性、高效率和低儲存量需求。
本作品採用《CC 協議》,轉載必須註明作者和本文連結