你好,我是公瑾,很高興我們來一起重學數據結構與算法。
工作以來,我一直專注于機器學習、深度學習等計算機領域算法的研發,算得上是國內首批從事 AI 工作的工程師,代碼開發和優化過程讓我不斷加強了對數據結構、算法思想的理解。
想象一下,你在開發一個網站的用戶系統。這個用戶系統的功能之一是,對某個嘗試登錄用戶的ID去核實是否合法,這就需要去存儲著海量數據的數據庫中查找這個ID。假設這個嘗試登錄用戶的ID是lagou,一個可行的辦法是,對數據庫中的每個記錄去匹配是否與lagou一致。然而,效率更高的方法是,預先對數據庫中所有的數據按照字母順序進行排序,接著就可以從有序數據的中間開始查找,去通過二分查找不斷縮小查找范圍。如果這個系統的注冊用戶只有不足16個,兩種查找方式所花費時間的差異也許并不明顯,無非就是16次匹配與log?16 = 4次匹配的區別。但如果注冊用戶的數量達到了1000萬,兩種查找算法的效率可能就是1000萬次和24次的區別了(log?10000000 = 23.25)。
我認為,數據結構與算法至關重要,不僅是優秀工程師思考如何解決業務問題、高效穩定地支撐公司業務、體現自身核心價值的關鍵,而且是入職大廠的必考內容。快手、今日頭條、阿里等大廠面試,一定會考查你的數據結構與算法掌握情況,因為對于大流量應用來說,高效的算法直接影響用戶體驗。
但是數據結構和算法的學習并不輕松,你往往會經歷以下痛苦:
* 從原理到應用,所涵蓋的知識非常多,大而全的通盤學習往往不現實,即使付出大量時間和精力堅持下來,但學得快,忘得也快;
* 為了應試或求職,大量刷題,卻刷不會,即使看著答案也不理解,而且刷題效率低下,耐著性子學一天,也不過刷完了兩道題,同類型問題稍加變動就又束手無策;
* 看了大量圖書和學習資料,掌握了理論知識,但一遇到實際問題仍然無從下手。
其實學習和實踐數據結構與算法,是有方法的。 這正是我和拉勾教育合作設計這個課程的初衷。我希望幫助你擺脫盲目刷題與漫無目的地學習方式,更加高效地掌握數據結構與算法知識,真正掌握程序開發、代碼優化的方法論,完成從掌握理論知識到解決實際問題的轉變。
#### 你為什么需要重學數據結構與算法?
很多軟件工程師都有進大廠的訴求,獲得高薪 Offer,或者體驗大廠的優質文化。但互聯網的紅利期早已過去,競爭也越來越激烈,“僧多粥少”的情況直接提高了面試“門檻”,誕生了“優秀工程師”的概念。
優秀的軟件工程師必須具備過硬的代碼開發能力,而這就體現在你對數據結構、算法思維、代碼效率優化等知識的儲備上,并直接反應在你工作中解決實際問題的好壞上。
比如,你要去開發某個復雜系統,如何才能圍繞系統的復雜性去選擇最合適的解決方案呢?一方面是對所用算法的選型,另一方面是對所用數據結構的選型,這都要求你對數據結構與算法有充分的理解和掌握。
但是 996、007 的互聯網快節奏下,開發者普遍專注當下工作本身,并不追求極致的性能,一直在追語言,學框架,而忽視了數據結構與算法的學習和落地訓練,基礎知識儲備不足,很難順利做出最優的技術選擇,從而導致開發的系統性能、穩定性都存在很多缺陷。
此外,面試中都要重點考察數據結構與算法知識,這是不爭的事實。 一是因為代碼能力不容易評估,而數據結構和算法的掌握情況相對可衡量;二是可以衡量工程師的基本功,以及邏輯思考能力。
我曾經有個海外名校畢業的應屆生同事,他的計算機領域基礎知識,尤其是數據結構和算法、機器學習、深度學習等基本功特別扎實,在面對陌生問題時往往能更快速地鎖定問題,并根據已有知識去尋找解決方法。短短幾個月后,他就從剛入職的小白轉變為某些項目的負責人。所以說,基本功扎實的人潛力會非常大,取得業績結果只不過是時間問題。
而據我所知,為了快速掌握數據結構與算法知識,或者提高代碼能力,絕大多數的學生或候選人一定會通過公開的題庫去刷題,卻常常被那些千變萬化的代碼題搞得暈頭轉向、不明所以,浪費了大量時間和精力,得不償失。
這并不是說刷題本身有錯,而是應該掌握正確的方式方法。而且刷題只是形式,更重要的是掌握算法思維和原理,并用以解決實際的編碼問題。
我經常說,真題實際上是刨除了特定場景和業務問題后,對于我們實際解決問題的方法的提煉。考核真題和刷題不是目標,還是要最終回歸到能力培養上來。這也是這門課中,我要核心傳達給你的內容。
#### 如何學習數據結構與算法?
我想,這可以從課程的特色與設計思路中很好地體現出來。
* [ ] 課程特色
* 重視方法論。我沒有單純去講數據結構與算法,而是從程序優化的通用方法論講起,以此為引子,讓你更深刻地理解數據結構和算法思維在程序優化中的作用。
* 內容精簡、重點突出。市面上的課程,都會主打“大而全”,唯恐某些知識點沒有講到。殊不知,高頻使用的數據結構就那么幾個,其他往往是這些基礎知識點的不同組合與變形,把這些牢牢掌握后,就已經足夠解決你絕大多數的實際問題了。
* 學習收獲快。內容精簡,且重視方法論的建設,可以快速建立程序優化的思想,并牢牢掌握知識體系中最核心、最根本的內容。我希望你快速抓住重點,迅速“所學即所得”地將知識運用到工作中去。
#### 課程設置
總結來說,這門課會從方法論、基礎知識、真題演練、面試技巧這四個方面,為你提供成為優秀工程師的完整路徑,具體包括以下五部分內容。
第一部分:方法論,也就是把“爛”代碼優化為高效率代碼的方法和路徑,是這門課關于代碼開發與優化方法框架的總綱。代碼的目標,除了完成任務,還要求把某項任務高效率地完成。
第二部分,在方法論的指引下,帶你補充必備的數據結構基礎知識。復雜度的降低,要求對數據有更好的組織方式,這正是數據結構需要解決的問題。為了合理選擇數據結構,我們需要全面分析任務對數據處理和計算的基本操作,再根據不同數據結構在這些基本操作中的優劣特點去靈活選用合適的數據結構。
第三部分,在方法論的指引下,帶你掌握必備的算法思維,也就是用算法思考問題的邏輯和程序設計的重要思想。在一些實際問題的解決中,需要運用一些巧妙的方法,它們不會改變數據的組織方式,但可以通過巧妙的計算方式降低代碼復雜度。常見的方法,如遞歸、二分法、排序算法、動態規劃等,會在這一部分介紹。
第四部分,面試真題詳解,帶你用前面的知識體系,去真正地解決問題。前三部分的知識合在一起,就是解決實際問題的工具包。面試題并非單純考核人才的工具,更是實際業務問題高度提煉后的縮影,它能反映一個開發者的知識儲備和問題解決能力。這一部分將深入剖析高頻真題的解題方法和思路。
第五部分,面試現場,給你一些求職時的切實建議。很多工程師有個共性問題,那就是明明有能力,卻說不出來,表現得就像是個初學者一樣。這部分,我通過補充面試經驗,包括現場手寫代碼、問題分析、面試官注重的軟素質等內容,來幫你解決這個問題。

如果你是以下用戶,那么本課程一定適合你:
* 參加校招的應屆生,應屆生需要具備充足的知識儲備,這也是面試官核心考察的內容之一。
* 需要補學數據結構與算法的程序員,以便在工作中更好地支撐和優化業務邏輯(比如搭建在線系統的 Java 后端同學,需要不斷提高和優化系統性能),以及有意轉行 Python 算法或人工智能等方向的程序員。
* 基本功薄弱的軟件工程師求職者,尤其是常年掛在面試手寫代碼的求職者。
#### 講師寄語
數據結構與算法知識雖然龐雜、難懂,但卻是編碼能力的核心體現,不僅是技術面試的高頻考點,更是高級 IT 工程師的必備技能,適用面非常廣泛。在競爭越來越激烈的今天,我們經常說一個人的底層能力,決定了他能走多遠,希望這個課程能夠幫你打好基礎。
最后,我想再說一句,即使你身處中小型企業,如今的精細化管理也在更多地講究效率和質量。成為核心骨干的一個先決條件,就是準確的技術選型和扎實的代碼基礎,而這最基本的條件是要掌握算法思維和數據結構原理,這是代碼開發和優化的方法論,是用以解決實際編碼問題的精髓所在,也是這門課核心要傳達的內容。
另外,被動閱讀只能掌握 50%,我希望你能夠在學習的過程中多動手練習和實踐,真正達成內化吸收的閉環。你也可以尋找一起學習的伙伴,在留言區分享你的學習思考、動手實踐的小成就,通過不同的動作來堅持學習的過程。OK,課程開始了,你準備好了嗎?
- 前言
- 開篇詞
- 數據結構與算法,應該這樣學!
- 模塊一:代碼效率優化方法論
- 01復雜度:如何衡量程序運行的效率?
- 02 數據結構:將“昂貴”的時間復雜度轉換成“廉價”的空間復雜度
- 模塊二:數據結構基礎
- 03 增刪查:掌握數據處理的基本操作,以不變應萬變
- 04 如何完成線性表結構下的增刪查?
- 05 棧:后進先出的線性表,如何實現增刪查?
- 06 隊列:先進先出的線性表,如何實現增刪查?
- 07 數組:如何實現基于索引的查找?
- 08 字符串:如何正確回答面試中高頻考察的字符串匹配算法?
- 09 樹和二叉樹:分支關系與層次結構下,如何有效實現增刪查?
- 10 哈希表:如何利用好高效率查找的“利器”?
- 模塊三:算法思維基礎
- 11 遞歸:如何利用遞歸求解漢諾塔問題?
- 12 分治:如何利用分治法完成數據查找?
- 13 排序:經典排序算法原理解析與優劣對比
- 14 動態規劃:如何通過最優子結構,完成復雜問題求解?
- 模塊四:面試真題 = 實踐問題的“縮影”
- 15 定位問題才能更好地解決問題:開發前的復雜度分析與技術選型
- 16 真題案例(一):算法思維訓練
- 17真題案例(二):數據結構訓練
- 18 真題案例(三):力扣真題訓練
- 19 真題案例(四):大廠真題實戰演練
- 特別放送:面試現場
- 20 代碼之外,技術面試中你應該具備哪些軟素質?
- 21 面試中如何建立全局觀,快速完成優質的手寫代碼?
- 結束語
- 結束語 勤修內功,構建你的核心競爭力