在讀《算法圖解》這本書,這本書有兩個優勢:python
關於算法的學習有兩點心得:算法
好了,開始。數組
算法是一組完成任務的指令。任何代碼片斷均可視爲算法。
[注意:該書對算法的定義與通行的定義不一樣,通行的定義要求算法應該具備有窮性,即算法必須能在執行有限個步驟以後終止,不然算法是沒有意義的。]數據結構
在本書中,你將學習比較不一樣算法的優缺點:該使用合併排序算法仍是快速排序算法,或者該使用數組仍是鏈表。僅僅改用不一樣的數據結構就可能讓結果大不相同。學習
其輸入是一個有序的元素列表;查找的元素包含在列表中,二分查找返回其位置;不然返回 Nothing。
通常而言,對於包含n個元素的列表,用二分查找最多須要log2n步。優化
Python版本:spa
def binary_search(list, item): low = 0 high = len(list)—1 while low <= high: mid = low + (high-low) / 2 guess = list[mid] if guess == item: return mid if guess > item: high = mid - 1 else: low = mid + 1 return None
Haskell版本:使用了Vector
,由於標準庫的列表是單鏈表,不支持隨機訪問。code
import qualified Data.Vector as V binarySearch :: (Ord a)=> V.Vector a -> Int -> Int -> a -> Maybe Int binarySearch vec low high e | low > high = Nothing | vec V.! mid < e = binarySearch vec (mid+1) high e | vec V.! mid > e = binarySearch vec low (mid-1) e | otherwise = Just mid where mid = low + (high-low) `div` 2
僅知道算法須要多長時間才能運行完畢還不夠,還需知道運行時間如何隨列表增加而增長。blog
算法的速度指的並不是時間,而是操做數的增速。談論算法的速度時,咱們說的是隨着輸入的增長,其運行時間將以什麼樣的速度增長。大 O 表示法讓你可以比較操做數,它指出了算法運行時間的增速。
排序
這是一個保證——如,簡單查找的運行時間不可能超過O(n)。
O(log n),也叫對數時間,這樣的算法包括二分查找。
O(n),也叫線性時間,這樣的算法包括簡單查找。
O(n * log n),這樣的算法包括快速排序——一種速度較快的排序算法。
O(n2),這樣的算法包括選擇排序——一種速度較慢的排序算法。
O(n!),這樣的算法包括旅行商問題的解決方案——一種很是慢的算法
旅行商要前往n個城市,同時要確保旅程最短,時間複雜度:O(n!)。
請關注個人公衆號哦。