算法學習筆記

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

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

學習方法

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

基本數據結構和算法

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

鏈表

  • 鏈表
  • 雙向鏈表

哈希表/散列表 (Hash Table)

  • 散列函數
  • 碰撞解決

字符串算法

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

二叉樹

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

圖的算法

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

排序算法

交換排序算法

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

線性排序算法

  • 桶排序

查找算法

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

15個經典基礎算法

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

海量數據處理

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

算法設計思想

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

算法問題選編

這是一個算法題目合集,題目是我從網絡和書籍之中整理而來,部分題目已經做了思路整理。問題分類包括:

  • 字符串
  • 堆和棧
  • 鏈表
  • 數值問題
  • 數組和數列問題
  • 矩陣問題
  • 二叉樹
  • 海量數據處理
  • 智力思維訓練
  • 系統設計

還有部分來自算法網站和書籍:

  • 九度OJ
  • leetcode
  • 劍指offer

開源項目中的算法

  • YYCache
  • cocos2d-objc
  • ...

推薦閱讀

刷題必備

  • 《劍指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塊一本

參考鏈接和學習網站

July 博客

基本算法演示

http://sjjg.js.zwu.edu.cn/SFXX/sf1/sfys.html
http://www.cs.usfca.edu/~galles/visualization/Algorithms.html

編程網站

其它

高級數據結構和算法 北大教授張銘老師在coursera上的課程。完成這門課之時,你將掌握多維數組、廣義表、Trie樹、AVL樹、伸展樹等高級數據結構,并結合內排序、外排序、檢索、索引有關的算法,高效地解決現實生活中一些比較復雜的應用問題。當然coursera上也還有很多其它算法方面的視頻課程。

算法設計與分析 Design and Analysis of Algorithms 由北大教授Wanling Qu在coursera講授的一門算法課程。首先介紹一些與算法有關的基礎知識,然后闡述經典的算法設計思想和分析技術,主要涉及的算法設計技術是:分治策略、動態規劃、貪心法、回溯與分支限界等。每個視頻都配有相應的講義(pdf文件)以便閱讀和復習。

OI Wiki 主要內容是 OI / ACM-ICPC 相關的知識整理。

原文:
https://github.com/nonstriater/Learn-Algorithms

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容