1. 程式人生 > >MIT 6.001X 2016 (11)演算法複雜度 big O()

MIT 6.001X 2016 (11)演算法複雜度 big O()




用  O( ) 來描述最壞的情況  表示的是 程式的step 關於 輸入的size 的增長率 


e.g.


抓住主要矛盾,忽略次要矛盾


具體主次矛盾順序:


(這個c 要指明)

具體計算的小tips: 

加法法則和乘法法則




總的來說   就是把一個大塊的程式,分成一個個小塊 ,然後分別計算他們的 O( )  然後加起來,取主要矛盾

如果遇見 巢狀的 那就兩個乘起來

加法取主要矛盾 ,乘法忽略 常數係數







從上面這個例子我們可以看出 當一次stage  呼叫 兩個及多個的時候 其實是O(n^c)  複雜度  


要注意 這個這個複雜度 是指 輸入的什麼size  假如是數字 一般預設大小  假如序列一般預設 是length

  


O(1):(a)複雜度與輸入無關

       (b)只有很少的演算法滿足條件,但是很多演算法的 部分程式碼 是這個複雜度

       (c)迴圈和遞迴也可能是這個複雜度的,但迴圈或者呼叫的 次數跟輸入無關


O(logn):

(1)二分法查詢,(任何每一步把搜尋的空間分為一半(一半是泛指))

  (2)  每一次迴圈  輸入n都要除以某個常數c, 然後迴圈的條件是 輸入滿足某個條件 (大於等於0 etc)就是O(logn)  (在具體一點  log以c為底) 

reducing the size of  problem by a constant factor on each stage 


e.g.






O(n):

(1) 最典型的例子是迴圈 然後每次迴圈, 那個條件變數都 用加減 一個常數







O(nlogn):





O(n^c):

(1) 大部分n的c次方複雜度的演算法都是n的二次方

(2) 比較典型的有內嵌迴圈和遞迴





O(c^n):






總結:


對於list 來說 index store len  append  這些操作都是O(1)  因為  python  知道怎麼找到那個點 然後 乾點啥事

但是對於字典來說  基本都是O(n)  因為字典是 無序的,排序不固定 而list 是固定的