Facebook工程师告诉你,如何正确的阅读《算法导论》(CLRS)?
第一章
挺有趣的,不過你可以跳過。
第二章
2.1 插入排序——老實說,你應該知道所有主要的排序算法,而不僅僅是插入排序。這只是基本的知識,你永遠不知道什么時候有用。
2.2 算法分析——你可以跳過簡短的介紹,但其他的要做一個了解。
2.3 算法設計——包含歸并排序及其分析,以及分治法的概述,非常重要,值得一讀。
第三章
All of it。必須學會大O表示法和時間復雜度分析。
第四章
4.1 最大子數組問題 - 可能有點值得你花時間。對于這個問題,有比“分而治之”更好的解決方案,但這是很好的實踐,邏輯思考可以拓展你的思維方式。
4.2 Strassen的算法——我真的很喜歡這個算法,當我第一次看到它的時候,我被它的酷炫驚呆了,但是你可以在面試的時候跳過它。它不會出現。
4.3 代換法——你不會在面試中使用這種方法,但是你應該了解一下,因為它是一個基本的工具,用來找出遞歸算法的時間復雜度。
4.4 遞歸樹法-與4.3相同
4.5 掌握方法-基本知識。你應該知道并練習它,能夠在3秒內使用它。如果分析符合該表單的遞歸算法,您將在面試中使用這種方法。
4.6 主定理的證明——你可以跳過這個,不過至少去讀一遍,這樣你就能理解你在用主方法做什么。
第五章
老實說,我從來沒有讀過這一章,但我知道你需要在面試中對概率有一個基本的把握,因為很有可能他們會出現。也就是說,只要你知道與概率相關的面試問題的基本概率概念和實踐(在我推薦的準備面試的書《編程面試的要素》中有解決方案解釋方面的問題),你可能可以跳過這一章。粗略地看一下,它更像是數學而不是算法。
第六章
6.1、6.2、6.3、6.4、6.5 -堆和堆排序。
第七章
7.1、7.2、7.3 -快速排序及其隨機化版本。“需要了解”之類的概念。我還推薦7.4(我曾在一次面試中被要求對隨機算法進行高級分析),不過我想,你在面試中必須處理7.4這樣的問題的概率相當低。
第八章
排序的下界,基本知識。可能會在谷歌的面試中被問到(雖然不太可能,但我知道以前發生過這樣的情況)。
8.2 -計數排序-需要知道的細節。它以隱含的形式出現。
8.3 -基數排序-這是一個簡單的算法。
8.4 -桶排序-可以跳過。
第九章
9.1 -值得一讀。
9.2 -預期線性時間內的選擇-非常重要,因為它不像快速排序那樣是常識,但它在面試中經常出現。在一次面試中,我不得不對整個問題進行編碼。
9.3 -在最壞情況下線性時間的選擇-可以跳過。只要知道在最壞情況下線性時間是可能的,因為這可能會有所幫助。
第十章
10.1 -堆棧和隊列——基本知識,絕對非常重要。
10.2 -鏈表-與10.1相同
10.3 -實現指針和對象-如果你使用c++或Java,跳過這個。否則我就不確定了。
10.4 -有根樹的表示一值得快速閱讀。
第十一章
對于哈希,我想說的是實現并不像鏈表那樣重要,但是您應該對它有一定的了解,并且最重要的是了解搜索/插入/刪除等的(預期和最壞情況)時間復雜性。還要知道,在實際中,它們是非常重要的數據結構,而且在實際中,預期的時間復雜度才是真正重要的。
11.1 -直接尋址-理解這個概念。
11.2 -哈希表-重要。
11.3 -哈希函數-有一個關于它們的想法是值得的,但我不會在這里太深入。只要知道幾個好哈希函數和壞哈希函數的例子(以及它們為什么好/壞)。
11.4 -開放尋址法-值得了解的思想,但不太可能出現在面試中。
11.5 -完全哈希-跳過。
第十二章
12.1 -什么是二叉搜索樹?必須知道。
12.2 -查詢BST -必須知道。
12.3 -插入/刪除-與12.2相同
12.4 -隨機構建的BST -只知道定理12.4(隨機BST的期望高度為O(lgn))
第十三章
這個很簡單。了解紅黑樹是什么,以及它的最壞情況高度/插入/刪除/查找是什么。閱讀13.1和13.2,跳過其余部分。除非面試官“做錯了”,或者面試官想看看你是否可以重新推導這些案例,否則你永遠不會被要求插入/刪除rb樹(我懷疑這種情況無論如何也不會發生)。還要知道,rb樹非常節省空間,一些c++ STL容器通常構建為rb樹(例如map/set)。
第14章
可能值得略讀14.2,只為了知道您可以增強數據結構,以及為什么它可能有用。否則,做一兩個簡單的關于擴充數據結構的問題,就可以在這里做。我會跳過14.1和14.3。
第15章
DP(dynamic programming動態規劃) !必須學會!
15.1 - 鋼條切割。標準DP問題,必須知道。
15.2 -矩陣-鏈乘法-和15.1一樣,雖然我不是特別喜歡這部分的寫法(我很少這樣說CLRS)。
15.3 - DP的要素-值得一讀,以便你正確地理解DP,但我想說的是,它比知道DP是什么(通過章節介紹)和實踐它(通過這本書和面試準備書中的問題)更重要。
15.4 - 最長公共子序列 -與15.1相同
15.5 -最優二叉搜索樹-我不能證明這部分的重要性,雖然我沒有讀過這一部分,但是我做的很好。
第十六章
您一定要知道什么是貪婪算法,所以請閱讀本章的介紹。
16.1 -活動選擇問題-還沒有詳細閱讀這篇文章,但我想說,檢查一下,如果不深入的話。
貪婪策略的元素-與16.1相同
16.3 -霍夫曼編碼-我想說的是閱讀問題和算法,但這就足夠了。我見過一些面試問題,答案是霍夫曼編碼(但問題會以“偽裝”的形式出現,所以不會很明顯)。
16.4 -擬陣和貪婪的方法-我從來沒有讀過這部分,但我在面試準備過程中做了很多貪婪的問題,這些東西從來沒有出現過,所以我想說這部分與面試無關。
任務調度問題作為一個矩陣-與16.4相同。
第十七章
你們應該知道什么是均攤分析,但是我從來沒有在書上讀過,我覺得這是一個非常簡單的概念,你們google一下,然后看幾個例子,或者通過17.1節來理解它。所以:
17.1 -綜合分析-閱讀這篇文章,它解釋了重要的東西。
17.2、17.3、17.4 -跳過。
第十八章
你應該知道什么是B樹(和B+樹),我聽說過一些例子,候選人被問到一般意義上的B樹(關于他們是什么以及為什么他們很棒的高層次問題)。但除此之外,我將跳過這一章。
第十九章
斐波那契堆-nope。
第20章
van Emde Boas樹-直接跳過,看都不要看一眼。
21章
不相交集合的數據結構。
更新:我最初建議跳過這一節,但經過重新考慮,我發現它實際上比我最初認為的更重要。因此,我建議閱讀21.1和21.2節,跳過其余部分。
Union-find有點重要,我已經看到至少有一個使用它的問題,不過這個問題也可以使用DFS和連接組件來解決。盡管如此,我也認為這并不是嚴格必要的,因為出于面試的目的,在不了解本章內容的情況下,一個人可能很容易就能想出一個足夠類似的結構來解決一個需要union-find的問題。但是,我認為值得一讀,這樣,如果出現了一個問題,其預期解決方案是union-find數據結構,那么您就不會花時間在面試中提出它,而是提前了解它,這可能是一個很好的優勢。盡管如此,我可能會把它列為不那么重要的其他材料在這個列表中,甚至比其他材料,甚至沒有在CLRS(如嘗試,例如)。
好了,現在來看圖形算法。首先看一下介紹。現在,下面有很多需要學習的知識點,注意了!敲黑板!。
22章
22.1 -圖形表示-需要學習。
22.2 - BFS -需要學習。然后,解決這個問題:ACM-ICPC Live Archive—Kermit the Frog。整個“使用BFS的狀態空間搜索”是一個重要的概念,可以用來解決幾個面試問題。
22.3 - DFS -需要學習。
22.4 -拓撲排序-需要學習。
22.5 -強連接組件-比上述4個組件出現的可能性小得多,但仍然是可能的,所以:需要學習。
23章
最小生成樹——可能是最不重要的圖形算法,除了max flow(當然,我的意思是以面試為目的)。我仍然認為你應該閱讀它,因為這是一個眾所周知的問題,但絕對要優先考慮其他事情。
23.1 - MST的增長-需要學習。
23.2 - Prim和Kruskal的算法-需要學習。
24章
最短路徑算法很重要,盡管可能沒有BFS/DFS重要。
讀了介紹。總之,你應該通讀所有的介紹,但是這篇很重要(而且很長),所以值得特別注意。
24.1 Bellman-Ford -了解算法及其正確性證明。
24.2 DAGs中的最短路徑——絕對值得知道,可能會出現,甚至比Bellman-Ford還要多。
24.3 Dijkstra算法-需要學習。當然可以。我已經看到這個出現了很多次(有一些細微的變化),我甚至看到了一個*出現。 ( *代表研究生課程,需要使用更多的數學知識。)
24.4差分約束和最短路徑-跳過。
第25章
也請閱讀簡介。
25.1 -矩陣乘法-我想跳過。這可能會出現(雖然可能性很小),但在我看來,這種可能性非常低,可能不值得這么做。不過,如果你有多余的時間,不妨讀一讀。
25.2 - Floyd-Warshall -是的,值得了解該算法及其時間復雜度和工作時間(這適用于所有加權圖,除了具有負權循環的圖)。它的代碼大約有5行,所以沒有理由不知道它。不過,這種分析可能有點言過其實。
25.3 - Johnson算法- Skip。
26章
最大流量——我從來沒有在面試中聽說過這個問題,我不知道為什么會這樣,所以跳過吧。
27章 ~30章
這些東西大部分永遠不會出現,所以對我來說,告訴你該讀什么比不讀什么更容易,所以這里有一些書中選定的主題。
31章
您應該從本章學到的大部分內容都可以從編程面試的實踐中學習到(您的時間最好花在這方面),所以我建議跳過所有內容,除了第31.2節中的歐幾里德GCD算法。
32章
32.1 -樸素字符串匹配算法-快速閱讀。
我想說,你應該知道這一點,滾動哈希的概念是非常重要的,可以在許多字符串或搜索相關的面試問題有用。
附錄
一個合計
了解時間復雜度分析的重要總結。
計數和概率
如果你不知道材料,閱讀C.4,伯努利試驗可能會出現在問題中(不是明確的,但你可能會使用它們,特別是在涉及概率/拋硬幣的問題的時間分析中)。
一旦你涵蓋了所有這些,我想說的是,從編程面試中汲取一些元素,為面試中的問題做大量準備。我在這里概述了我自己的面試準備過程——這可能會有所幫助。
注意:請記住,僅憑CLRS提供的上述知識是不夠的。有許多話題不在CLRS中,但在面試中可能是相關的,其中許多是實際的(如特定于語言的問題),還有許多是理論性的,但在CLRS中沒有明確涉及。例如,前綴樹和tournament樹是重要的數據結構(前者比后者更重要),它們在CLRS中沒有專門的部分,而且已知還會詢問跳表,等等。此外,上面包含的部分是詳盡的,因為它們都是極有可能來自CLRS的主題。其中的一些你可以跳過,在面試中沒有他們的很好(例如,您可能提出的算法分離集章自己作為解決方案如果需要,和mst可能不會出現),但我有一個詳盡的清單,因為在我看來最好稍微比under-prepare準備過度,和在任何情況下,我認為所有的above-included話題可能會出現在一種或另一種形式,盡管有些可能性比另一些要小得多。
- 原文地址
 
總結
以上是生活随笔為你收集整理的Facebook工程师告诉你,如何正确的阅读《算法导论》(CLRS)?的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 不懂java,这篇文章带你入门起飞
 - 下一篇: 程序员软技能:职场、学习、生活,代码之外