php 算法復雜度 時間復雜度 空間復雜度


算法復雜度分為時間復雜度和空間復雜度。
其作用:
時間復雜度是指執行算法所需要的計算工作量;
而空間復雜度是指執行這個算法所需要的內存空間。
(算法的復雜性體現在運行該算法時的計算機所需資源的多少上,計算機資源最重要的是時間和空間(即寄存器)資源,因此復雜度分為時間和空間復雜度)。

簡單來說,

時間復雜度指的是語句執行次數
空間復雜度指的是算法所占的存儲空間

時間復雜度

執行算法所需的計算工作量。一般來說,計算機算法是問題規模n的函數f(n),算法的時間復雜度也因此記做T(n)=O(f(n));
常見時間復雜度有:常數階、線性階、平方階、立方階、對數階、nlog2n階、指數階
效率:O(1) > O(log2n)> o(n)> o(nlog2n) > o(n^2) > o(n^3) > o(2^n) > o(n!) > o(n^n) 

其他概念

最壞情況:最壞情況時的運行時間,一種保證。如果沒有特別說明,說的時間復雜度即為最壞情況的時間復雜度

時間復雜度計算方式

舉例:計算1+2+3+....+n的和

$sum=0

for($i=1;$i<=$n;$i++){
$sum+=$i
}

可以看到循環了n次,所以時間復雜度就是O(n), 時間復雜度就是程序計算次數
其他說明

1.用常數1來取代所有時間中的所有加法常數

比如上面的例子中,不管n為多少,計算次數都是3,那么時間復雜度為O(1),而不是O(3) 

2.在修改后的運行次數函數中,只保留最高階項

比如運算的次數為n^2+1,那么為時間復雜度為o(n^2) 

3.如果最高階存在且不是1,則去除與這個項相乘的常數

2n^2+3n+1 ->n^2

為什么會去掉這些值,看下圖

當計算量隨着次數原來越大的時候,n和1的區別不是太大,而n2曲線變得越來越大,所以這也是2n2+3n+1 ->n2最后會估量成n2的原因,因為3n+1隨着計算次數變大,基本可以忽略不計,其他都類似
常數階 O(1)

function test($n){
echo $n;
echo $n;
echo $n;
}

不管$n是多少,只運行3次,那么時間復雜度就是O(3),取為O(1)
線性階 O(n)

for($i=1;$i<=$n;$i++){
$sum+=$i
}

平(立)方階:o(n2)/o(n3)

$sum=0;
for($i=1;$i<=$n;$i++){
for($j=1;$j<$n;$j++){
$sum+=$j
}
}

兩次循環,里面循環執行了n次,外層循環也執行了n次,所以時間復雜度為O(n^2),立方階一樣

特殊平方階:O(n2/2+n/2)->O(n2)

for(){
for(){
..... ----------->n^2
}
}
+
for(){
------------> n
}

                              +

echo $a+$b --------------> 1

所以整體上計算次數為n^2+n+1,我們算時間復雜度為O(n^2) 

對數階:O(log2n)

如果a的x次方等於N(a>0,且a不等於1),那么數x叫做以a為底N的對數(logarithm),記作x=logaN。其中,a叫做對數的底數,N叫做真數。 [1]

while($n>=1){
$n=$n/2;
}

n 執行次數
1 1
2 2
3 2

規律:

第一次 第二次 第三次 第四次 第五次
20--------->10---------->5-------->2.5------->1
n n/2 n/2/2 n/2/2/2 n/2/2/...

所有規律:n/(2^m)=1;我們需要算出m, 轉換成n=2^m,得出m=log2n,所以時間復雜度為O(logn)或者O(log2n)
空間復雜度

算法需要消耗的內存空間。即為S(n)=O(f(n));包括程序代碼所占用的空間,輸入數據所占用的空間和輔助變量所占用的空間這三個方面。計算和表達方式與時間復雜度類似,一般用復雜度的漸近性來表示

關於O(1)的問題, O(1)是說數據規模和臨時變量數目無關,並不是說僅僅定義一個臨時變量。舉例:無論數據規模多大,我都定義100個變量,這就叫做數據規模和臨時變量數目無關。就是說空間復雜度是O(1)。

空間復雜度計算方式

舉例:冒泡排序的元素交換,空間復雜度O(1)
冒泡排序就是兩兩交換,中間設置臨時變量存儲交換的值,不管要交換的數據多大,臨時變量始終為固定數量

冒泡排序:把$arr=[1,3,2,4,6,5]排序出來

原理:兩兩相鄰的數進行比較,如果反序就交換,否則不交換
1 3 2 4 6 5

首先1和3比較,不動
1 3 2 4 6 5

再次3和2比較,交換
1 2 3 4 6 5

再次3和4比較,不動
1 2 3 4 6 5

再次4和6比較,不動
1 2 3 4 6 5

再次6和5比較,交換
1 2 3 4 5 6

for($i=0;$i<=$n;$i++){
for($j=0;$j<=$n;$j++){

if($arr[$j]>$arr[$j+1]){
   $tmp=$arr[$j]; 
  $arr[$j]=$arr[$j+1];
  $arr[$j+1]=$tmp;
}
}

}

所以時間復雜度為O(n^2),空間復雜度為O(1)
常見排序算法

冒泡排序、直接插入排序、希爾排序、選擇排序、快速排序、對排序、歸並排序

常見查找算法

二分查找、順序查找

擴展:函數的漸進增長

https://blog.csdn.net/raylee2...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM