#感興趣的能夠去訂閱極客時間前谷歌工程師的專欄:數據結構與算法之美,我的以爲寫的很不錯。這裏只是我本身作的一個簡單的筆記算法
(一) 對數階時間複雜度數組
1 def tset(n): 2 i = 1 3 while i <= n: 4 i = i*2
上面這段代碼,i 從1開始,循環一次乘於2,當大於n時,循環結束,咱們能夠獲得2x = n。要計算上面這段代碼的時間複雜度,求解x的值就好了,根據數學基礎中和對數相關的計算,能夠獲得x = log2n = logn,因此這段代碼的時間複雜度就是O(logn)。數據結構
將代碼修改爲下面這樣,很容易計算出,代碼的時間複雜度是O(log3n)。spa
1 def tset(n): 2 i = 1 3 while i <= n: 4 i = i*3
在對數中log3n = log32*log2n,因此O(log3n) = O(log32*log2n) = O(C*log2n),其中C是常量,根據漸進符號的定義,計算時間複雜度時,咱們能夠忽略常量,因此上面這段代碼的時間複雜度也是O(logn),同理,全部對數階時間複雜度的表示中,能夠統一表示爲O(logn)。code
若是一段代碼的時間複雜度是O(logn),若是循環運行n次,那麼時間複雜度就是O(nlogn)。blog
(二) 空間複雜度索引
下面這段代碼,和分析時間複雜度同樣,由於只有第三行代碼建立了一個大小爲n的數組,其餘不是常量就是不佔用內存空間,因此這段代碼的空間複雜度是O(n)內存
1 def test1(n): 2 a = 0 3 arr = numpy.arange(n) 4 for i in range(n): 5 arr[i] = i*i 6 return arr
(三) 最好、最壞、平均時間複雜度數學
這裏咱們用以前線性查找的例子:class
1 import numpy as np 2 3 #找到結果,返回索引,不然返回None 4 def search(array,key): 5 for j in range(len(array)): 6 if array[j] == key: 7 return j 8 return None
最好時間複雜度: 若是第一個元素就是咱們要查找的元素,那麼代碼的時間複雜度就是O(1)
最壞時間複雜度:若是最後一個元素纔是咱們要查找的元素,或者數組中根本就沒有咱們要查找的元素,那麼代碼的時間複雜度就是O(n)
平均時間複雜度:查找元素在是否在數組中有2種狀況,在數組中(0...n-1)和不在數組中,那麼總共就有 n+1種狀況,咱們將須要查找的元素(可能運行的次數,第n個元素和不在數組中運行次數都是n次)相加除以n+1就能夠獲得代碼的時間複雜度。
(1+2+3...+n+n)/ (n+1) = (n*(n+2))/2(n+1),那麼平均時間複雜度爲O(n)。
1+2+3...+n 能夠推導出公式 n(n+1)/2,詳細推導過程不明白的能夠本身網上查查資料。