php 演算法複雜度 時間複雜度 空間複雜度

2022-09-15 15:00:28 字數 3019 閱讀 6692

演算法複雜度分為時間複雜度和空間複雜度。

其作用:

時間複雜度是指執行演算法所需要的計算工作量;

而空間複雜度是指執行這個演算法所需要的記憶體空間。

(演算法的複雜性體現在執行該演算法時的計算機所需資源的多少上,計算機資源最重要的是時間和空間(即暫存器)資源,因此複雜度分為時間和空間複雜度)。

時間複雜度

執行演算法所需的計算工作量。一般來說,計算機演算法是問題規模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++)

可以看到迴圈了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)

不管$n是多少,只執行3次,那麼時間複雜度就是o(3),取為o(1)

線性階 o(n)

for($i=1;$i<=$n;$i++)

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

$sum=0;

for($i=1;$i<=$n;$i++)

}

兩次迴圈,裡面迴圈執行了n次,外層迴圈也執行了n次,所以時間複雜度為o(n^2),立方階一樣
特殊平方階:o(n2/2+n/2)->o(n2)

for()}+

for()

+
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 執行次數

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++)

}所以時間複雜度為o(n^2),空間複雜度為o(1)

常見排序演算法

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

常見查詢演算法

二分查詢、順序查詢
擴充套件:函式的漸進增長

演算法時間複雜度空間複雜度

演算法 是解決某一類問題的通法,即一系列清晰無歧義的計算指令。每個演算法只能解決具有特定特徵的一類問題,但乙個問題可由多個演算法解決。乙個演算法應該有以下五個方面的特性 比較演算法的優劣我們從兩個維度去進行考量 時間 空間 時間複雜度,空間複雜度 找出基本語句 演算法中執行次數最多的那條語句就是基本...

演算法 時間複雜度 空間複雜度

1 if i 1 2 a 1 result 3 4 result n 2 result 1000 1000 3 array.push a array.pop 4 map.set 1,1 map.get 1,1 在計算複雜度的時候,o 1 一般會被忽略。1 for let i 0 i n i 2 wh...

演算法複雜度 時間複雜度和空間複雜度

1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數...