這裡的複雜度,就是用於衡量程式的執行效率的重要度量因素。
雖然有句俗話「不管是白貓還是黑貓,抓到老鼠就是好貓」,這句話是站在結果導向的,沒錯。但是如果
有個程式要去處理海量資料,乙個程式設計師寫的要執行2天,而另乙個程式設計師只要半小時,那麼第二種顯然更適合我們的實際需求。
複雜度是乙個關於輸入資料量n的函式。
要表示複雜度很簡單,用大寫o
加上括號o()
將複雜度包起來就好了。比如這個**的複雜度是f(n)
,那就可以寫成o(f(n))
。
在計算複雜度的時候,有三點需要我們記住:
舉個例子,將乙個列表反轉,不用reverse()
。
def demo_1():
a = [1, 2, 3, 4, 5]
b = [0 for x in range(0,5)] #第乙個for迴圈
n = len(a)
for i in range(n): # 第二個for迴圈
b[n - i - 1] = a[i]
print(b)
if __name__ == "__main__":
demo_1()
***************執行結果***************===
d:programspythonpython36python.exe d:/練習/leecode/fuzadu.py
[5, 4, 3, 2, 1]
process finished with exit code 0
可以看到我先用了乙個for迴圈建立了乙個跟a列表等長度,元素全是0的列表。
然後再用乙個for迴圈將a裡的元素倒序放入b,最終得到乙個跟a反序的列表。
其中,每乙個for迴圈的時間複雜度都是o(n)
,2個加起來就是o(n)+o(n)
,也等於o(n+n)
,也等於o(2n)
。
也就是相當於一段o(n)
複雜度的**先後執行兩遍,它們的複雜度是一致的。
有了上面的例子,這個也就好理解了。
假設,乙個演算法的複雜度是o(n²)+o(n)
,那麼可以知道,當n越來越大,也就是輸入的資料量越來越大時,n^2
的變化率要比n
大的多,
所以,這時候我們只取變化率更大的n^2
來表示複雜度即可,也就是o(n²)+o(n)
等同於o(n²)
。
還是借助上面的反轉問題,這裡再使用第二種解法。
def demo_2():
a = [1, 2, 3, 4, 5]
tmp = 0
n= len(a)
for i in range(n//2): # // 表示整數除法,返回不大於結果的乙個最大整數
tmp = a[i]
a[i] = a[n -i -1]
a[n -i -1] = tmp
print(a)
if __name__ == "__main__":
demo_2()
**********====執行結果**********====
d:programspythonpython36python.exe d:/練習/leecode/fuzadu.py
[5, 4, 3, 2, 1]
process finished with exit code 0
跟第乙個解法相比,第二個解法少了乙個for迴圈,而且迴圈次數只是到了列表的一半,那麼時間複雜度就是o(n/2)
,
由於複雜度與具體的常係數無關的性質,這段**的時間複雜度還是o(n)
。
但是在空間複雜度上,第二個解法開闢了乙個新的變數tmp
,它與陣列長度無關。
輸入是 5 個元素的陣列,需要乙個tmp
變數輸入是 50 個元素的陣列,同樣只需要乙個tmp
變數。
因此,空間複雜度與輸入陣列長度無關,這就是o(1)
。
趁熱打鐵,分析一下下面**的複雜度:
for (i = 0; i < n; i++)
for (m = 0; m < n; m++) }}
可以先從最裡面看,最內層是2個順序結構的for迴圈,複雜度是o(n)
。
中間這層的又巢狀了乙個for迴圈,所以這時候複雜度就變成了o(n^2)
。
最後,最外層又巢狀了乙個for迴圈,所以最終的複雜度就是o(n^3)
。
雖然測試工程師的**對於複雜度要求不高甚至說非常低,但是我覺得理解複雜度,並且會做一些簡單的分析還是很有必要的。
簡單查詢演算法時間複雜度
寫出兩種檢索演算法 在乙個排好序的陣列t 1 n 中查詢x,如果x在t中,輸出x在 t的下標j 如果x不在t中,輸出j 0.按實驗模板編寫,分析 部分僅給出複雜度 結果即可。順序查詢 順序查詢也稱為線形查詢,屬於無序查詢演算法。從資料結構線形表的一端開始,順序掃瞄,依次將掃瞄到的結點關鍵字與給定值k...
簡單理解演算法時間複雜度
在電腦科學中,演算法的時間複雜度 time complexity 是乙個函式,它定性描述該演算法的執行時間。這是乙個代表演算法輸入值的字串的長度的函式。時間複雜度常用大o符號表述,不包括這個函式的低階項和首項係數。使用這種方式時,時間複雜度可被稱為是漸近的,亦即考察輸入值大小趨近無窮時的情況。我們假...
演算法時間複雜度空間複雜度
演算法 是解決某一類問題的通法,即一系列清晰無歧義的計算指令。每個演算法只能解決具有特定特徵的一類問題,但乙個問題可由多個演算法解決。乙個演算法應該有以下五個方面的特性 比較演算法的優劣我們從兩個維度去進行考量 時間 空間 時間複雜度,空間複雜度 找出基本語句 演算法中執行次數最多的那條語句就是基本...