算法學習筆記

算法虐我千百遍,我待算法如初戀

這裡的內容是我學習算法過程的一些記錄,希望能一直堅持下去。

學習方法

把所有經典算法寫一遍看算法有關源碼加入算法學習社區,相互鼓勵學習看經典書籍刷題

基本數據結構和算法

這些算法全部自己敲一遍:

鏈表

鏈表雙向鏈表

二叉樹

二叉樹二叉查找樹伸展樹(splay tree 分裂樹)平衡二叉樹AVL紅黑樹B樹,B+,B*R樹Trie樹(前綴樹)後綴樹最優二叉樹(赫夫曼樹)二叉堆 (大根堆,小根堆)二項樹二項堆斐波那契堆(Fibonacci Heap)

哈希表/散列表 (Hash Table)

散列函數碰撞解決

字符串算法

排序查找BF算法KMP算法BM算法正則表達式數據壓縮

圖的算法

圖的存儲結構和基本操作(建立,遍歷,刪除節點,添加節點)最小生成樹拓撲排序關鍵路徑最短路徑: Floyd,Dijkstra,bellman-ford,spfa

排序算法

交換排序算法

冒泡排序插入排序選擇排序希爾排序快排歸併排序堆排序

線性排序算法

桶排序

查找算法

順序表查找:順序查找有序表查找:二分查找分塊查找: 塊內無序,塊之間有序;可以先二分查找定位到塊,然後再到塊中順序查找動態查找: 二叉排序樹,AVL樹,B- ,B+ (這裡之所以叫 動態查找表,是因為表結構是查找的過程中動態生成的)哈希表: O(1)

15個經典基礎算法

Hash快速排序快遞選擇SELECTBFS/DFS (廣度/深度優先遍歷)紅黑樹 (一種自平衡的二叉查找樹)KMP 字符串匹配算法DP (動態規劃 dynamic programming)A*尋路算法: 求解最短路徑Dijkstra:最短路徑算法 (八卦下:Dijkstra是荷蘭的計算機科學家,提出”信號量和PV原語“,"解決哲學家就餐問題",”死鎖“也是它提出來的)遺傳算法啟發式搜索圖像特徵提取之SIFT算法傅立葉變換SPFA(shortest path faster algorithm) 單元最短路徑算法

海量數據處理

Hash映射/分而治之BitmapBloom filter(布隆過濾器)Trie樹數據庫索引倒排索引(Inverted Index)雙層桶劃分外排序simhash算法分佈處理之Mapreduce

算法設計思想

迭代法窮舉搜索法遞推法動態規劃貪心算法回溯分治算法

刷題必備

《劍指offer》

《編程之美》

《結構之法:面試和算法心得》

《算法謎題》 都是思維題

基礎

《編程珠璣》Programming Pearls

《編程珠璣(續)》

《數據結構與算法分析》

《Algorithms》 這本近千頁的書只有6章,其中四章分別是排序,查找,圖,字符串,足見介紹細緻

算法設計

《算法設計與分析基礎》

《算法引論》 告訴你如何創造算法 斷貨

《Algorithm Design Manual》算法設計手冊 紅皮書

《算法導論》 是一本對算法介紹比較全面的經典書籍

《Algorithms on Strings,Trees and Sequences》

《Advanced Data Structures》 各種詭異高級的數據結構和算法 如元胞自動機、斐波納契堆、線段樹 600塊

延伸閱讀

《深入理解計算機系統》

《TCP/IP詳解三卷》

《UNIX網絡編程二卷》

《UNIX環境高級編程:第2版》

《The practice of programming》 Brian Kernighan和Rob Pike

《writing efficient programs》 優化

《The science of programming》 證明代碼段的正確性 800塊一本

鏈接:http://www.imooc.com/article/3669