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 是固定的