開源一個 Python 中文資料結構和演算法教程
課程簡介
資料結構和演算法是每個程式設計師需要掌握的基礎知識之一,也是面試中跨不過的檻。目前關於 Python 演算法和資料結構的中文資料比較欠缺,
筆者嘗試錄製視訊教程幫助 Python 初學者掌握常用演算法和資料結構,提升開發技能。
本教程是付費教程(文字內容和程式碼免費),因為筆者錄製的過程中除了購買軟體、手寫板等硬體之外,業餘需要花費很多時間和精力來錄製視訊、查資料、編寫課件和程式碼,養家餬口不容易,希望大家體諒。
https://github.com/PegasusWang/python_data_structures_and_algorithms
連結
痛點
- 講 Python 資料結構和演算法的資料很少,中文資料更少
- 很多自學 Python 的工程師對基礎不夠重視,面試也發現很多資料結構和演算法不過關,很多人掛在了基礎的資料結構和演算法上
- 缺少工程應用場景下的講解,很多講演算法的資料太『教科書化』。本書實現的程式碼工程上可用
作者簡介
目前就職於知乎,從實習期間接觸 Python 起一直從事 Python 網站後端開發,有一定 Python 的使用和實踐經驗。
知乎專欄:
課程內容
包括我們在業務開發和麵試中常用的演算法和資料結構,希望可以幫助新人快速上手,很多老手寫業務程式碼寫多了很多基礎知識忘記了,
也可以作為回顧。課程儘量用通俗的方式講解,結合 python 語言和日常開發實踐的經驗,讓沒有太多基礎和非科班的同學也能夠理解。
對於每個演算法和用到的資料結構我們需要知道:
- 原理
- Python 實現方式
- 時間、空間複雜度
- 使用場景,什麼時候用
目錄結構
這裡講解的章節我參考了下邊教材中列舉的一些書籍,並且自己設計了大綱,爭取做到循序漸進。因為實現一些高階資料結構的時候會用到
很多底層資料結構,防止跳躍太大導致讀者理解困難。
課程的目錄結構如下,每一章都有配套的文字講義(markdown),示例程式碼,視訊講解,詳細的講解一般會放在視訊裡,使用手寫板來
進行板書,包括文字、圖示、手動模擬演算法過程等。
- 課程介紹
- 課程簡介之笨方法學演算法
- 抽象資料型別 ADT,面向物件程式設計
- 陣列和列表
- 連結串列,高階連結串列。雙鏈表,迴圈雙端連結串列
- 佇列,雙端佇列,迴圈雙端佇列
- 棧,棧溢位
- 演算法分析,時間複雜度 大O 表示法
- 雜湊表,雜湊衝突
- 字典
- 集合
- 遞迴
- 查詢:線性查詢和二分查詢
- 基本排序演算法
- 高階排序演算法: 歸併排序、堆排序、快排
- 樹,二叉樹
- 圖,dfs 和 bfs
- python 內建常用資料結構和演算法的使用。list, dict, set, collections 模組,heapq 模組
- 面試筆試常考演算法
程式語言
我們這裡使用最近很火的Python。Python 入門簡單而且是個多面手,在爬蟲、web 後端、運維、資料分析、AI 方面領域都有 Python 的身影。
知乎、豆瓣、頭條、餓了麼、搜狐等公司都有廣泛使用 Python。筆者日常工作使用也是 Python,有一定實踐經驗,
在知乎上維護了一個專欄《Python 學習之路》。
Python 抽象程度比較高, 我們能用更少的程式碼來實現功能,同時不用像 C/C++ 那樣擔心記憶體管理、指標操作等底層問題,
把主要心思放在演算法邏輯本身而不是語言細節上,Python 也號稱虛擬碼語言。所有程式碼示例使用 Python2/3 相容程式碼,
不過只在 python3.5 下測試過,推薦用相同版本 Python。
受眾
想要學習 Python 演算法和資料結構的初、中級同學,包括自學的同學和本科低年級學生等。需要掌握 Python
的基本語法和麵向物件程式設計的一些概念,我們這裡只使用最基本的 Python 語法,不會再去介紹用到的 Python 語法糖。
預備知識
- 掌握 Python 基本語法,有過使用 Python 的經驗。知道 class、module、yield 等
- 基本的面向物件程式設計知識,會定義和使用 Python 中的類 (class)
- 知道 Python 中的魔術方法,比如
__len__
__contains__
- 無需太多數學基礎,僅在演算法時間複雜度分析的時候會用到一些簡單數學知識。對於學習基礎演算法,邏輯思維可能更重要一些
教材
這裡我參考過三本書:
《演算法圖解》: 圖解的形式很適合新手,示例使用的是 python
《Data Structures and Algorithms in Python》: 適合對 Python
和演算法比較熟悉的同學,或者是有其他語言程式設計經驗的同學。英文版,缺點是書中錯誤真的很多,程式碼有些無法執行
《演算法導論》: 喜歡數學證明和板磚書的同學可以參考,有很多高階主題。使用虛擬碼
講課形式
繪圖演示+手寫板+現場編碼
我將使用繪圖軟體+手寫板進行類似於紙筆形式的講解,邊講邊開個終端分成兩個視窗,一個用 vim
編寫程式碼,另一個視窗用來執行程式碼,所有程式碼我將會現場編寫(還是很有挑戰的),不會像某些大學教師一樣只喜歡念 ppt。
每個視訊我會盡量控制時長,講的內容儘量通俗易懂,擺脫學院派的授課方式。
你可以參考我在知乎發的專欄文章看下:
課程特點
- 每個演算法和資料結構都有講義、視訊(包含講解、圖示、手動模擬)、原始碼。其中只有視訊內容為付費內容
- 講義循序漸進,結合自己的學習和使用經驗講解。github 上實時更新
- 視訊演示更加直觀易懂
- 演示程式碼實現思路,所有程式碼在視訊裡均現場編寫
- 偏向工程應用和程式碼實現。程式碼直接可以用。每個檔案都是自包含的,你可以直接執行和除錯,這是目前大部分書籍做得不到位的地方
- 良好的工程實踐:編碼之前碎碎念(工程實踐)。
這是很多看了幾本書沒有太多業界實踐經驗就敢講課的培訓班老師教不了的。知識廉價,經驗無價 - 每個實現都會有單測來驗證,培養良好的編碼和測試習慣,傳授工程經驗
- 結合 cpython 底層實現講解(比如list 記憶體分配策略等),避免一些使用上的坑。並且會用 python 來模擬內建 dict 等的實現
- 每篇講義後有思考題和延伸閱讀連結,幫助大家加深思考和理解
資料
- 視訊。包含所有講解視訊
- 程式碼示例。所有程式碼我會放到 github 上
- markdown 講義,包含視訊內容的提要等內容
- 延伸閱讀。我會附上一些閱讀資料方便想深入學習的同學
如何學習
筆者講課錄製視訊的過程也是自己再整理和學習的過程,錄製視訊之前需要參考很多資料
希望對所講到的內容,你能夠
- 理解所講的每個資料結構和演算法的
- 原理
- Python 實現方式
- 時間、空間複雜度
- 使用場景,什麼時候用
- 自己嘗試實現,如果拋開視訊自己寫起來有困難可以多看幾次視訊,一定要自己手動實現。很多面試可能會讓手寫
- 每章講義後邊都會有我設計的幾個小問題,最好能夠回答上來。同時還有程式碼練習題,你可以挑戰下自己的掌握程度。
- 最好按照順序循序漸進,每章都會有鋪墊和聯絡
課程目標
掌握基本的演算法和資料結構原理,能獨立使用 Python 語言實現,能在日常開發中靈活選用資料結構。
對於找工作的同學提升面試成功率。
工具
推薦使用以下工具進行開發,如果使用編輯器最好裝對 應 Python 外掛:
- Pycharm
- Sublime
- Atom
- Vscode
- Vim
勘誤
輸出其實也是一種再學習的過程,中途需要檢視大量資料、編寫講義、視訊錄製、程式碼編寫等,難免有疏漏之處。
有出版社找過筆者想讓我出書,一來自己對出書興趣不大,另外感覺書籍相對視訊不夠直觀,有錯誤也不能及時修改,打算直接把所有
文字內容講義放到 github 上,供大家免費查閱。
如果你覺得文字內容或者視訊內容有錯誤,歡迎在 github 上提 issue 討論,我會修正相關內容,防止產生誤導。
本電子書製作和寫作方式
使用 mkdocs 和 markdown 構建,使用 Python-Markdown-Math 完成數學公式
安裝依賴:
pip install mkdocs # 製作電子書
# https://stackoverflow.com/questions/27882261/mkdocs-and-mathjax/31874157
pip install https://github.com/mitya57/python-markdown-math/archive/master.zip
編寫並檢視:
mkdocs serve # 修改自動更新,http://localhost:8000 訪問
# 數學公式參考 https://www.zybuluo.com/codeep/note/163962