迴圈巢狀時間複雜度 簡單演算法 什麼是複雜度?

2021-10-18 07:58:17 字數 2561 閱讀 6384

這裡的複雜度,就是用於衡量程式的執行效率的重要度量因素。

雖然有句俗話「不管是白貓還是黑貓,抓到老鼠就是好貓」,這句話是站在結果導向的,沒錯。但是如果

有個程式要去處理海量資料,乙個程式設計師寫的要執行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符號表述,不包括這個函式的低階項和首項係數。使用這種方式時,時間複雜度可被稱為是漸近的,亦即考察輸入值大小趨近無窮時的情況。我們假...

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

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