資料結構與演算法之美01 開篇詞

2022-06-16 10:24:07 字數 2500 閱讀 9189

​ 作者是王爭,畢業於西安交通大學計算機專業。現在回想起來,本科畢業的時候,我的程式設計水平其實是很差的。直到讀研究生的時候,乙個師兄給了我一本《演算法導論》,說你可以看看,對你的程式設計會很有幫助。

​ 沒想到,從此我對演算法的「迷戀」便一發不可收拾。之後,我如飢似渴地把圖書館裡幾乎所有資料結構和演算法書籍都讀了一遍。

​ 我常常邊讀邊練。沒多久,我就發現,寫**的時候,我會不由自主考慮很多效能方面的問題。我寫出時間複雜度高、複雜度高的垃圾**越來越少了,演算法能力提公升了很多,程式設計能力也有了質的飛躍。得益於此,研究生畢業後,我直接進入 google,從事 google 翻譯相關的開發工作。

​ 這是我自己學習資料結構與演算法的經歷,現在,你可以想想你的情況。

​ 如果你是這種情況,其實你並不孤獨,這不是你乙個人遇到的問題。工作十年間,我見過許多程式設計師。他們有著各種各樣的背景,有很多既有潛力又非常努力,但始終無法在自己現有水平上更進一步。

​ 在技術圈裡,我們經常喜歡談論高大上的架構,比如高可用、微服務、服務治理等等。鮮有人關注**層面的程式設計能力,而願意沉下心來,花幾個月時間啃一啃計算機基礎知識、認認真真夯實基礎的人,簡直就是鳳毛麟角。

​ 我覺得這其中最重要的就是基礎足夠紮實。他曾經跟我說,像區塊鏈、人工智慧這些看似很新的技術,其實一點兒都不「新」。最初學程式設計的時候,他就把那些基礎的知識都學透了。當面臨行業變動、新技術更迭的時候,他不斷發現,那些所謂的新技術,核心和本質的東西其實就是當初學的那些知識。掌握了這個「規律」之後,他學任何東西都很快,任何新技術都能快速迎頭趕上。這就是他快速學習並且獲得成功的秘訣。

​ 所以說,基礎知識就像是一座大樓的地基,它決定了我們的技術高度。而要想快速做出點事情,前提條件一定是基礎能力過硬,「內功」要到位。

​ 那技術人究竟都需要修煉哪些「內功」呢?我覺得,無外乎就是大學裡的那些基礎課程,作業系統、計算機網路、編譯原理等等,當然還有資料結構和演算法

​ 可是,我們都知道,像《演算法導論》這些經典書籍,雖然很全面,但是過於理論,學起來非常枯燥;而市面很多課程大多缺失真實的開發場景,費勁學完感覺好像還是用不上,過不了幾天就忘了。

​ 所以,我嘗試做乙個讓你能真正受用的資料結構與演算法課程,希望給你指明乙個簡潔、高效的學習路徑,教你乙個學習基礎知識的通用方法 。那麼,關於專欄內容,我是怎樣設計的呢?

我根據自己研讀數十本演算法書籍和多年專案開發的經驗,在眾多的資料結構和演算法中,精選了最實用的內容進行講解。

我不只會教你怎麼用,還會告訴你,我們為什麼需要這種資料結構和演算法,一點點幫你捋清它們背後的設計思想,培養你舉一反三的能力。

3)對於每種資料結構和演算法,我都會結合真實的軟體開發案例來講解,讓你知道,資料結構和演算法,究竟應該如何應用到實際的編碼中。

為了由淺入深地帶你學習,我把專欄分成四個遞進的模組。

入門篇

時間、空間複雜度分析是資料結構和演算法中非常重要的知識點,貫穿整個專欄的學習過程。但同時也是比較難掌握的,所以我用了 2 節課來講這部分內容,而且還舉了大量的例項,讓你一邊學一邊練,真正能掌握複雜度分析,為後面的學習鋪路。

我希望通過這一模組,你能掌握時間、空間複雜度的概念,大 o 表示法的由來,各種複雜度分析技巧,以及最好、最壞、平均、均攤複雜度分析方法。之後,面對任何**的複雜度分析,你都能游刃有餘、毫不畏懼!

基礎篇

這部分是專欄中篇幅最大的內容,也是我們學習的重點,共有 26 節內容,涵蓋了最基礎、最常用的資料結構和演算法。針對每種資料結構和演算法,我都會結合具體的軟體開發例項,由淺入深進行講解,並適時總結一些實用「寶典」,保證你印象深刻、學有所用。

比如遞迴這一節,我會講到,為什麼遞迴**比較難寫?如何避免堆疊溢位?如何避免遞迴冗餘計算?如何將遞迴**轉化為非遞迴**?

高階篇

這部分我會講一些不是那麼常用的資料結構和演算法。雖然不常用,但是這些內容你也需要知道。設定這一部分的目的,是為了讓你開拓視野,強化訓練演算法思維、邏輯思維。如果說學完基礎部分可以考 80 分,那掌握這一部分就能讓你成為尖子生!

實戰篇

我們整個專欄都是圍繞資料結構和演算法在具體軟體實踐中的應用來講的,所以最後我會通過實戰部分串講一下前面講到的資料結構和演算法。我會拿一些開源專案、框架或者系統設計問題,剖析它們背後的資料結構和演算法,讓你有乙個更加直觀的感受。

人生路上,我們會遇到很多的坎。跨過去,你就可以成長,跨不過去就是困難和停滯。而在後面很長的一段時間裡,你都需要為這個困難買單。對於我們技術人來說,更是這樣。既然資料結構和演算法這個坎,我們總歸是要跨過去,為什麼不是現在呢?

我很感激師兄當年給我的那本《演算法導論》,這是我人生中為數不多的轉折點之一。沒有那本書,也可能就沒有今天的我。我希望這個專欄也能成為你的乙個人生轉折點。

我希望,通過這個專欄,不僅能幫你跨過資料結構與演算法這個坎,還能幫你掌握一種學習知識和技能的方法,幫你度過職場甚至人生的重要時刻!一起加油吧!

資料結構與演算法之美 開篇

資料結構與演算法,是計算機的核心課程之一,是程式設計師武功體系的內功,想成為武林高手必須內功過硬,作為乙個非科班碼農,面試時因為內功不強而碰壁數次,使我真實的體驗到學好資料結構與演算法的重要性,為了不在這個方面繼續碰壁,也為了能在軟體開發工程師的道路上走的更遠更快,我決心集中精力學習突破這道關口 以...

資料結構與演算法之美

什麼是資料結構?什麼是演算法 狹義重點 複雜度分析 方法 邊學邊練,適度刷題 複雜度分析 時間複雜度 常見時間複雜度 非多項式量級 非常低效的演算法 空間複雜度 漸進空間複雜度,表示演算法的儲存空間和資料規模的增長關係 最好情況時間複雜度 理想情況的時間複雜度 最壞情況時間複雜度 最糟糕的情況下的時...

資料結構與演算法之美06

個人學習筆記總結,詳見資料結構與演算法之美 度娘 線性表 非線性表 陣列 1 儲存結構 鏈式儲存,前驅後繼關聯 2 操作 crud 前後索引關聯,涉及最優最糟問題 特點 非常低效 查詢操作 了解其儲存方式,即查詢就是通過陣列下標進行。插入操作 假設陣列的長度為n,現在,如果我們需要將乙個資料插入到陣...