# 第三部分:數據結構
> 原文:[Part III: Data Structures](https://learncodethehardway.org/more-python-book/part2.html)
> 譯者:[飛龍](https://github.com/wizardforcel)
> 協議:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
> 自豪地采用[谷歌翻譯](https://translate.google.cn/)
你正在以你的方式構建個人流程,它讓你以有限的阻礙快速起步。擁有良好的起步流程,以及培養一種盡管去做的能力,就是創造力的基礎。創造力是一種流動性和放松的心態。如果你的起步充滿阻礙和沮喪,那么很難進入這個流程。學習“點擊”你的大腦,使其進入具有創造力的、松散的 Hack 模式,可以幫助你使用創造力解決問題,并提高生產力。
如果你做的是垃圾,那就沒有意義了。首先,是的,顯然,你所做的絕大多數都是垃圾,但你不想在你的余生中制造糟糕的軟件。你需要平衡創造性的黑客心態和嚴謹的質量心態。我提倡人們在創??造性表達和批判性思維模式之間切換。通過放松和創造力,你想出你的想法并實現它,然后通過批評自己的工作來使他們可靠和品質高。
在第二部分中,當你跟蹤 45 分鐘內實現的功能數,并尋找可以改進你的啟動流程的地方時,實際上就做到了它。但是,由于批判性思維模式是創造力的殺手,因此你無法同時 Hack 和分析你的流程。這個建議幾乎涵蓋了我所知道的每一個創造性規律,并幫助你在工作時不使用自己的方式。
> 注
> 創造過程中的批評會扼殺你的想象力。沒有批評的創造只會產生垃圾。你需要這兩個,但不是同時。
在第三部分中,你將切換到專注于質量和開發個人流程,從而提高你的質量。為了使其變得簡單,我只會將質量定義為:
> 低缺陷率和可理解的代碼。
大多數程序員在這兩個方面絕對是糟糕的。絕大多數開發人員認為,當編譯完成時,他們的工作就完成了,就是這樣。他們運行了測試套件,所以就完成了!我稱這個“程序員風格的完成”,其中它們對自己的作品沒有自我批評的評價,因為他們完全相信他們的電腦來找出所有的缺陷。他們似乎從來不在乎,別人是否可以理解他們的代碼,只關注它是否運行良好來滿足最低限度。如果你曾問過他們每天的缺陷率,他們會瞪著你,說這并不重要。代碼覆蓋?呸。他們的測試套件有 10 萬行代碼!它肯定測試了一切東西!
為了成為一名更好的程序員,你必須開始開始做一些殘酷的事情,觀察自己的質量指標和實踐。我說這項工作是殘酷的,因為它清晰并明確地展示出你是多么糟糕,對于那些開心地認為他們很棒的人來說,這可能是個悲劇。那些具有騙子綜合癥的人,會發現這種質量分析令人耳目一新,因為它會給你一個合理的想法,你的工作有多好,以及一個改進計劃。
## 通過數據結構測試質量
數據結構是一個簡單的概念。你的計算機擁有內存和放入內存的數據。你可以隨意填充它,也可以提供一種使數據更容易處理的結構。自從“計算機科學”開始以來,人們一直在分析如何為不同目的構建數據,然后這些結構有多好。由于數據結構定義好了,我們可以使用它們來研究你的質量實踐。你將實現每個數據結構并進行測試,然后通過兩個步驟來確定實現的質量。
你進行數據結構練習的流程如下:
+ 每個練習都將描述數據結構,以及你可以做什么。這個描述是中文,圖表和示例代碼。我將給出一個沒有代碼的結構的完整描述,因為你需要實現它,并使其正確。
+ 你可能還需要一套必須通過的測試,但是這些測試也可能用文本寫成,因此你還將編寫自動測試。
+ 你將在 45 分鐘內持續進行訓練來做一些東西,然后休息一陣子,但你可以在每次實現中花費更多時間。我建議你做一些簡單的黑魔法,然后“認真起來”,并在更多的時間段中優化你的實現。
+ 當你相信你“完成”時,你會切換到批評模式,并開始了解你的實際情況。你將遵循一個審計流程,讓你仔細閱讀你的代碼,并查找錯誤,跟蹤你的代碼。
+ 最后,你將修復在審計階段發現的缺陷,并繼續處理這個練習,直到完成。
這就是相關的流程,所以這部分的前兩個練習(練習 13 和 14)將由我完成,現場制作,所有的缺陷都是我做的,所有的代碼都是我寫的。你可以在視頻中看到這個流程的工作原理,并在練習中閱讀我的代碼,以便你了解預期的東西。我會遵循我上面所述的嚴格流程,盡可能接近,所以你需要仔細觀看視頻。
## 如何學習數據結構
有一種正式的數學方法,用于研究算法和數據結構,但我不會設計過多背后的理論。如果你對這個微小的簡介感興趣,那么你可以閱讀幾本這個主題的書,并花幾年研究這個計算機科學分支。在這本書中,我將向你提供練習,以便你學習如何從記憶中實現它們,并了解它們的工作原理。你不需要正式的證明,只需要簡單的 Python 代碼和反復嘗試。
通過這些練習,我希望你遵循一種具體的方式來研究它們,以便你可以從記憶中實現它們。當我學習音樂,和嘗試畫出我看到的東西時,我使用這個相同的流程。它適用于任何東西,其中你需要記住一個概念,但也可以通過創造力應用于不同的情況,所以你不能只是記住它。相反,你執行我所說的“記憶,嘗試,檢查”:
+ 構建一切信息和材料,它描述你必須記住的所有事情。盡你所能來記憶并記住它,即使它只是信息的一小部分。
+ 把所有的信息拿走,所以你看不到它。我喜歡把它放在不同的房間,所以如果我需要再次查找,我必須離開我的作品。
+ 嘗試從記憶中創建所需的東西。嘗試放下任何東西,無論是對的或錯的。
+ 當你用盡了你記住的東西后,把你所做的一切拿過來,然后返回你的信息并進行比較。標記所有你做錯了的東西,然后再試一次。
+ 使用你的錯誤列表,專注于記憶,以便你在下次嘗試時更正錯誤,并重新做一遍。
我喜歡進行 2~15 分鐘的記憶,然后進行 10~45 分鐘的嘗試,但你會知道你什么時候用完所有知識,需要去獲得更多。我將給出一個具體的例子,解釋我如何根據我的記憶來畫畫:
+ 我要畫一朵花,所以我把花放在我房子的一個房間里,我的畫在另一個房間里。
+ 我坐在花的房間里,盯著花。我畫出那朵花。我用手指跟蹤它,試著在我的腦海里想象它。我想象自己畫每個花瓣,莖,和一切東西。我記得比例。我甚至可以使用筆記記錄顏色,并嘗試在花的房間中混合顏色。
+ 我把所有東西都放在花的房間里。我很快回到畫室,試著喚醒花的記憶,找出下一步要畫的東西。也許葉子是我最終熟悉的東西。我畫出它。也許現在花盆很清楚,我畫了一些。我繼續閉上眼??睛,試圖想起圖像,然后嘗試畫出來。
+ 當我被卡住或者我用完時間的時候,我站起來,把我的小畫板帶入花的房子,并將其與我看到的比較。然后我會記錄我的錯誤。一只花瓣太長嗎?花盆的角度錯了嗎?土壤太暗了嗎?我記下筆記,弄清楚我錯了什么。
+ 然后我把畫帶回畫室,并回到花的房間,在下一個回合中,用這個錯誤列表繼續從記憶中學習。
我從這個流程中畫出的畫,通常相當奇怪,但接近于原件,這取決于我用了多少回合,而且我多長時間練習一次。最終這幫助我變得更好,并快速捕捉到我看到的東西,因為我可以在我的記憶中將更多的視覺信息保存更長時間。
當你進行這些算法練習時,你可以使用相同的流程,來發展你在面試中根據需要回憶它們的能力。你應該首先坐下來,使用你可以使用的所有信息來實現它們,并了解它們的工作原理。記住你不明白的東西很難記住。你有一個好的實現后,你可以開始訓練你的記憶。
+ 將所有書籍,筆記,圖表和關于該算法的信息放在一個房間中,將計算機放在另一個房間中。如果需要,打印出你的代碼。
+ 花費 15 分鐘的時間來學習算法房間中的信息,記下筆記,繪制更多的圖表,可視化數據的流動方式,并且做任何其他可以想到的事情來學習。
+ 將所有信息留在算法房間,走進筆記本電腦的房間,坐下來嘗試從記憶中實現它們。在檢查你的作品之前,不要花費超過 45 分鐘。
+ 帶著你的筆記本電腦進入算法房間,并記錄你的錯誤。
+ 把你的筆記本電腦放回去,然后再回到算法房間,再進行一遍記憶和學習。專注于所有你做錯了的事情,這將使它更容易。
最初的幾次中,這樣做會令人沮喪,但很快,你會發現它變得更加容易,而且在許多情況下,你可以冥想來使其生效。
- 笨辦法學 Python · 續 中文版
- 引言
- 第一部分:預備知識
- 練習 0:起步
- 練習 1:流程
- 練習 2:創造力
- 練習 3:質量
- 第二部分:簡單的黑魔法
- 練習 4:處理命令行參數
- 練習 5:cat
- 練習 6:find
- 練習 7:grep
- 練習 8:cut
- 練習 9:sed
- 練習 10:sort
- 練習 11:uniq
- 練習 12:復習
- 第三部分:數據結構
- 練習 13:單鏈表
- 練習 14:雙鏈表
- 練習 15:棧和隊列
- 練習 16:冒泡、快速和歸并排序
- 練習 17:字典
- 練習 18:性能測量
- 練習 19:改善性能
- 練習 20:二叉搜索樹
- 練習 21:二分搜索
- 練習 22:后綴數組
- 練習 23:三叉搜索樹
- 練習 24:URL 快速路由
- 第四部分:進階項目
- 練習 25:xargs
- 練習 26:hexdump
- 練習 27:tr
- 練習 28:sh
- 練習 29:diff和patch
- 第五部分:文本解析
- 練習 30:有限狀態機
- 練習 31:正則表達式
- 練習 32:掃描器
- 練習 33:解析器
- 練習 34:分析器
- 練習 35:解釋器
- 練習 36:簡單的計算器
- 練習 37:小型 BASIC
- 第六部分:SQL 和對象關系映射
- 練習 38:SQL 簡介
- 練習 39:SQL 創建
- 練習 40:SQL 讀取
- 練習 41:SQL 更新
- 練習 42:SQL 刪除
- 練習 43:SQL 管理
- 練習 44:使用 Python 的數據庫 API
- 練習 45:創建 ORM
- 第七部分:大作業
- 練習 46:blog
- 練習 47:bc
- 練習 48:ed
- 練習 49:sed
- 練習 50:vi
- 練習 51:lessweb
- 練習 52:moreweb