前言
大家好,我是bigsai,很早就在寫部落格,將文章整理成了一個pdf,並且開源到github上!
自己寫東西斷斷續續也不少時間了,也寫了不少東西(雖然是偏向小白),這個其實花費的時間還是比較多的,這次的話主要將資料結構與演算法中一些文章整理出來,初步整理成一版pdf,先分享給大家。
因為在整理pdf方面沒啥經驗,目前還是md直接匯出的pdf的,看了下有些部分程式碼太長太佔頁面,有些部分圖片太長也很佔地方,有部分文章還嘗試不同風格顯得不那麼條理,有些地方頁面突然分割也很影響視覺體驗……
雖然有很多缺點和問題,這些地方後面也在想辦法考慮一點點最佳化,也歡迎大夥提出寶貴的意見!當然這個倉庫也是開源的,有興趣一起維護的可以維護。
更新會同步到Github倉庫中,也會告知大家。近期會將以前寫的其他資料結構演算法部分(未最佳化)最佳化更新上去。
github地址:https://github.com/javasmall/bigsai-algorithm
主要內容
-
理論基礎搭建:
- 緒論基礎知識:理解資料結構的相關概念,熟悉時間複雜度和空間複雜度。
- 寫給小白硬核遞迴:透過解決經典問題,深入理解遞迴,掌握記憶化遞迴的妙用。
-
線性結構的掌握:
- 圖解線性表:手寫順序表和連結串列,理解帶頭結點和不帶頭結點連結串列的實現區別。
- 圖解雙連結串列:手寫雙連結串列,考慮好節點直接聯絡,特別是考研重點。
-
棧與佇列的熟練使用:
- 棧:掌握後進先出規則,實現上用順序表和連結串列考慮區別。
- 佇列:理解先進先出規則,實現上使用迴圈陣列和連結串列分別實現。
-
更高階的線性結構:
-
跳錶:瞭解跳錶的增刪改查原理和流程,拓寬對連結串列的認識。
-
約瑟夫環問題:透過連結串列法、List模擬、公式法逐步深入這個問題。
-
-
樹的深入學習:
- 二叉樹層序遍歷:學會使用佇列進行層序遍歷,解決二叉樹之字形遍歷。
- 二叉樹前中後遍歷:熟練掌握非遞迴方式遍歷,建立對樹結構的全面理解。
- 二叉搜尋(查詢)樹:學會查詢方式和刪除節點邏輯。
- 二叉平衡(AVL)樹:瞭解平衡二叉樹的旋轉方式,以及不同平衡方式的應用。
-
其他重要資料結構:
- 哈夫曼樹:理解哈夫曼樹的weight計算方式和哈夫曼編碼。
- 字典(Trie)樹:手寫字典樹,熟悉其應用場景和優勢。
- 優先佇列:瞭解藉助堆的執行原理。
- 並查集(不相交集合):手寫並查集,理解路徑壓縮的優勢。
-
問題解決方法的學習:
- 回溯演算法:透過解經典問題如八皇后問題,深刻理解回溯思想。
- 分治演算法:學會先分後合併,解決經典問題如二分搜尋、快排、歸併排序、最近點對等。
- 搜尋演算法:深度優先搜尋、廣度優先搜尋,解決問題如藍橋杯,提高解決實際問題的能力。
- 拓撲排序:理解圖論演算法,得到一個前後的順序序列。
- Dijkstra演算法:瞭解圖論單源最短路徑,佇列+貪心實現。
- Floyd演算法:瞭解圖論多源最短路徑,程式碼簡短但需要深刻理解。
- 最小生成樹演算法:Prim和Kruskal,瞭解不同貪心策略的應用。
-
位運算與數論演算法:
- 位運算:介紹幾種位運算,解決大部分經典位運算問題。
- 求素數:掌握素數篩和尤拉篩的應用。
- 快速冪:數論演算法,掌握非遞迴、遞迴寫法,瞭解矩陣快速冪。
-
大數運算:
-
大數加減乘除:手寫大數運算,瞭解大數除法的思想。
-
-
十大排序演算法:
- 氣泡排序、快速排序:瞭解交換類排序的原理和應用。
- 插入排序、希爾排序:理解插入類排序的方法和優勢。
- 歸併排序:學會歸併類排序的實現。
- 簡單選擇排序、堆排序:掌握選擇類排序的原理。
- 桶排序、計數排序、基數排序:瞭解桶類排序的應用場景和實現。
- 雙軸快排:最佳化快排的方法,深入理解排序演算法的差異。
推薦資料
- 書籍:
- 《演算法導論》:經典之作,系統全面地介紹了演算法和資料結構。
- 《資料結構與演算法分析》:作者Mark Allen Weiss,深入淺出地講解資料結構與演算法。
- 《劍指Offer》:針對面試演算法題的詳盡解析,適合入門和麵試準備。
- 線上教程:
- LeetCode:刷題神器
github地址:https://github.com/javasmall/bigsai-algorithm
持續更新中,歡迎star支援 !