1. 程式人生 > >算法筆記(七):復雜度分析(一)

算法筆記(七):復雜度分析(一)

n+1 增長 角度 復雜 判斷 and 就是 ret 執行時間

(一)漸進符號(這裏暫時只考慮大O)

以輸入規模n為自變量建立的時間復雜度實際上還是較復雜的,例如an2+bn+c+1,不僅與輸入規模有關,還與系統a、b和c有關。此時對該函數進一步抽象,僅考慮運行時間的增長率或稱為增長的量級,如忽略上式中的常量、低階項、高階項的系數,僅考慮n2。當輸入規模大到只有與運行時間的增長量級有關的時,就是在研究算法的漸進效率。也就是說,從極限角度看,只關心算法運行時間如何隨著輸入規模的無限增長而增長。

大O記號的定義為:給定一個函數g(n),O(g(n)) = {f(n):存在正常數c和n0,使得對所有n>=n0,有0<=f(n)<=cg(n)}.O(g(n))表示一個函數集合,往往用該記號給出一個算法運行時間的漸進上屆。

判斷下面各式是否成立:

10n2+4n+2 = O(n2) -------- 成立

10n2+4n+2 = O(n) -------- 不成立

(二)示例

1、下面這段代碼

1 def F(n):
2     sum = 0
3     i = 0
4     j = 1
5     sun = i + j
6     return sum

上面這段代碼的時間復雜度就是O(1),O(1)表示算法的執行時間總是常量(即1、2、3、4、5....10000行代碼的的執行時間都是 O(1),只要代碼的執行次數是常量,它的復雜度就是 O(1))

2、下面這段代碼

1 def F(n):
2 sum = 0 3 for i in range(1,n+1): 4 sum = sum+i 5 return sum

假設第2行代碼的執行時間是1,那麽3、4行代碼都執行了N遍(1、2、3....n),所以代碼的執行時間是2n,代碼的總執行時間就是2n+1,根據前面的說明,在大O表示法中,我們可以忽略掉公式中的常量、低階項、高階項的系數,所以代碼的復雜度就是O(n)

3、 再看下面這段代碼:

1 def F(n):
2     sum = 0
3     for i in range(1,n+1):
4         for j in range(1,n+1):
5 sum = sum+i*j 6 return sum

假設第二行代碼執行時間是1,第3行執行時間是n,第4、5行的執行次數都是n2,所以執行時間是2n2。所以代碼總的執行時間是T(N) = 1+n+2n2,同理,這段代碼的時間復雜度是O(n2)

(三)總結下

總結一下,我們這裏遇到下面三種情況

1、O(1) -----常量階

O(1)表示算法的執行時間總是常量(即1、2、3、4、5....10000行代碼的的執行時間都是 O(1),只要代碼的執行次數是確定的,它的執行次數就是 O(1))

2、O(n) -----線性階

O(n)表示一個算法的性能會隨著輸入數據n的大小變化而線性變化

3、O(n2) ----平方階

O(n2)表示一個算法的性能將會隨著輸入數據n的增長而呈現出二次增長

另外還有2個沒有說的就是對數(O(logN))和非多項式,非多項式這裏不考慮,對數階算法復雜度分析,下篇說明。

(四)分析插入排序、簡單選擇排序的算法復雜度

1、插入排序

 1 #插入排序
 2 def insertSort(A):
 3     for i in range(len(A)):
 4         key = A[i]
 5         j = i -1
 6         while A[j] > key and j >=0:
 7             A[j+1] = A[j]
 8             j -= 1
 9         A[j+1] = key
10     return A

(1)假設第3行代碼的執行次數是n,那麽4、5、9行代碼的執行次數也是n,總共4n。

(2)第6、7、8行的執行次數就是n2(最壞的情況),總共是3n2

(3)所以算法的執行次數為 4n+3n2,即時間復雜度為O(n2)

2、簡單選擇排序

 1 def selectSort(A):
 2     #叠代列表的前n-1個元素
 3     for i in range(len(A)-1):
 4         k = i
 5         for j in range(i+1,len(A)):
 6             if A[k] > A[j]:
 7                 k = j  #更新最小值的索引
 8         #如果A[i]不是最小值,交換A[i],A[k]的值
 9         if k != i:
10             A[k],A[i] = A[i],A[k]
11     return A

一樣的道理,我們只需要關註代碼執行次數最多的那段代碼就行了,即第5行代碼(n2),所以算法的時間復雜度也是O(n2)

算法筆記(七):復雜度分析(一)