開篇詞 | 從今天起,跨過“資料結構與算法”這道坎

作者是王争,畢業于西安交通大學計算機專業。現在回想起來,大學畢業的時候,我的程式設計水準其實是很差的。直到讀研究所學生的時候,一個師兄給了我一本《算法導論》,說你可以看看,對你的程式設計會很有幫助。
沒想到,從此我對算法的“迷戀”便一發不可收拾。之後,我如饑似渴地把圖書館裡幾乎所有資料結構和算法書籍都讀了一遍。
我常常邊讀邊練。沒多久,我就發現,寫代碼的時候,我會不由自主考慮很多性能方面的問題。我寫出時間複雜度高、複雜度高的垃圾代碼越來越少了,算法能力提升了很多,程式設計能力也有了質的飛躍。得益于此,研究所學生畢業後,我直接進入 Google,從事 Google 翻譯相關的開發工作。
這是我自己學習資料結構與算法的經曆,現在,你可以想想你的情況。
-
- 是不是從學校開始,你就覺得資料結構難學,然後一直沒認真學?
- 工作中,一遇到資料結構這個坑,你又發自本能地迅速避讓,因為你覺得自己不懂,是以也不想深究,反正看起來無關大局?
- 當你想換工作面試,或者研究某個開源項目源碼,亦或者和團隊讨論某個非架構層面的高可用難題的時候,你又發現,自己的基礎跟不上别人的節奏?
如果你是這種情況,其實你并不孤獨,這不是你一個人遇到的問題。工作十年間,我見過許多程式員。他們有着各種各樣的背景,有很多既有潛力又非常努力,但始終無法在自己現有水準上更進一步。
在技術圈裡,我們經常喜歡談論高大上的架構,比如高可用、微服務、服務治理等等。鮮有人關注代碼層面的程式設計能力,而願意沉下心來,花幾個月時間啃一啃計算機基礎知識、認認真真夯實基礎的人,簡直就是鳳毛麟角。
我認識一位原來騰訊 T4 的技術大牛。在區塊鍊大潮之前,他在騰訊工作了 10 多年,長期負責手機 QQ 背景整體建設。他經曆了手機 QQ 從誕生到億級使用者線上的整個過程。後來他去了微衆銀行,有一天老闆讓他去做區塊鍊。**他用了不到半年時間,就把區塊鍊的整個技術脈絡摸清楚了。**現在,他是微衆銀行的區塊鍊負責人,微衆科技創新産品部的老總。你說厲害不?你可以花半年時間就能精通一個新的領域嗎?為什麼他就可以做到?
我覺得這其中最重要的就是基礎足夠紮實。他曾經跟我說,像區塊鍊、人工智能這些看似很新的技術,其實一點兒都不“新”。最初學程式設計的時候,他就把那些基礎的知識都學透了。當面臨行業變動、新技術更疊的時候,他不斷發現,那些所謂的新技術,核心和本質的東西其實就是當初學的那些知識。掌握了這個“規律”之後,他學任何東西都很快,任何新技術都能快速迎頭趕上。這就是他快速學習并且獲得成功的秘訣。
是以說,基礎知識就像是一座大樓的地基,它決定了我們的技術高度。而要想快速做出點事情,前提條件一定是基礎能力過硬,“内功”要到位。
那技術人究竟都需要修煉哪些“内功”呢?我覺得,無外乎就是大學裡的那些基礎課程,作業系統、計算機網絡、編譯原理等等,當然還有資料結構和算法。
可是,我們都知道,像《算法導論》這些經典書籍,雖然很全面,但是過于理論,學起來非常枯燥;而市面很多課程大多缺失真實的開發場景,費勁學完感覺好像還是用不上,過不了幾天就忘了。
是以,我嘗試做一個讓你能真正受用的資料結構與算法課程,希望給你指明一個簡潔、高效的學習路徑,教你一個學習基礎知識的通用方法 。那麼,關于專欄内容,我是怎樣設計的呢?
-
- 我根據自己研讀數十本算法書籍和多年項目開發的經驗,在衆多的資料結構和算法中,精選了最實用的内容進行講解。
- 我不隻會教你怎麼用,還會告訴你,我們為什麼需要這種資料結構和算法,一點點幫你捋清它們背後的設計思想,培養你舉一反三的能力。
- 對于每種資料結構和算法,我都會結合真實的軟體開發案例來講解,讓你知道,資料結構和算法,究竟應該如何應用到實際的編碼中。
為了由淺入深地帶你學習,我把專欄分成四個遞進的子產品。
入門篇
時間、空間複雜度分析是資料結構和算法中非常重要的知識點,貫穿整個專欄的學習過程。但同時也是比較難掌握的,是以我用了 2 節課來講這部分内容,而且還舉了大量的執行個體,讓你一邊學一邊練,真正能掌握複雜度分析,為後面的學習鋪路。
我希望通過這一子產品,你能掌握時間、空間複雜度的概念,大 O 表示法的由來,各種複雜度分析技巧,以及最好、最壞、平均、均攤複雜度分析方法。之後,面對任何代碼的複雜度分析,你都能遊刃有餘、毫不畏懼!
基礎篇
這部分是專欄中篇幅最大的内容,也是我們學習的重點,共有 26 節内容,涵蓋了最基礎、最常用的資料結構和算法。針對每種資料結構和算法,我都會結合具體的軟體開發執行個體,由淺入深進行講解,并适時總結一些實用“寶典”,保證你印象深刻、學有所用。
比如遞歸這一節,我會講到,為什麼遞歸代碼比較難寫?如何避免堆棧溢出?如何避免遞歸備援計算?如何将遞歸代碼轉化為非遞歸代碼?
進階篇
這部分我會講一些不是那麼常用的資料結構和算法。雖然不常用,但是這些内容你也需要知道。設定這一部分的目的,是為了讓你開拓視野,強化訓練算法思維、邏輯思維。如果說學完基礎部分可以考 80 分,那掌握這一部分就能讓你成為尖子生!
實戰篇
我們整個專欄都是圍繞資料結構和算法在具體軟體實踐中的應用來講的,是以最後我會通過實戰部分串講一下前面講到的資料結構和算法。我會拿一些開源項目、架構或者系統設計問題,剖析它們背後的資料結構和算法,讓你有一個更加直覺的感受。
人生路上,我們會遇到很多的坎。跨過去,你就可以成長,跨不過去就是困難和停滞。而在後面很長的一段時間裡,你都需要為這個困難買單。對于我們技術人來說,更是這樣。既然資料結構和算法這個坎,我們總歸是要跨過去,為什麼不是現在呢?
我很感激師兄當年給我的那本《算法導論》,這是我人生中為數不多的轉折點之一。沒有那本書,也可能就沒有今天的我。我希望這個專欄也能成為你的一個人生轉折點。
- source code : https://github.com/wangzheng0822/algo