知乎經(jīng)典問題:程序員必須掌握哪些算法?
十年Java老鳥 威哥

一、算法的分類
1、基礎(chǔ)算法
算法從廣義的角度來理解,一段代碼的實(shí)現(xiàn)邏輯就可以理解為算法,通常我們說的算法也可以特指計(jì)算機(jī)基礎(chǔ)算法,我們按算法功能分類分為:
1、十大排序算法
簡單排序:插入排序、選擇排序、冒泡排序(必學(xué))
分治排序:快速排序、歸并排序(必學(xué),快速排序還要關(guān)注中軸的選取方式)
分配排序:桶排序、基數(shù)排序
樹狀排序:堆排序(必學(xué))
其他:計(jì)數(shù)排序(必學(xué))、希爾排序
2、圖論算法
圖的表示:鄰接矩陣和鄰接表
遍歷算法:深度搜索和廣度搜索(必學(xué))
最短路徑算法:Floyd,Dijkstra(必學(xué))
最小生成樹算法:Prim,Kruskal(必學(xué))
實(shí)際常用算法:關(guān)鍵路徑、拓?fù)渑判颍ㄔ砼c應(yīng)用)
二分圖匹配:配對、匈牙利算法(原理與應(yīng)用)
拓展:中心性算法、社區(qū)發(fā)現(xiàn)算法(原理與應(yīng)用)
3、搜索與回溯算法
貪心算法(必學(xué))
啟發(fā)式搜索算法:A*尋路算法(了解)
地圖著色算法、N 皇后問題、最優(yōu)加工順序
2、基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)
除了以上算法,通常算法與數(shù)據(jù)結(jié)構(gòu)關(guān)系緊密,常見的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)有以下分類:
1、線性表
列表(必學(xué))鏈表(必學(xué))跳躍表(知道原理,應(yīng)用,最后自己實(shí)現(xiàn)一遍)并查集(建議結(jié)合刷題學(xué)習(xí))不用說,鏈表、列表必須,不過重點(diǎn)是鏈表。
2、棧與隊(duì)列
棧(必學(xué))隊(duì)列(必學(xué))優(yōu)先隊(duì)列、堆(必學(xué))多級反饋隊(duì)列(原理與應(yīng)用)特別是優(yōu)先隊(duì)列,再刷題的時(shí)候,還是經(jīng)常用到的,隊(duì)列與棧,是最基本的數(shù)據(jù)結(jié)構(gòu),必學(xué)??梢酝ㄟ^博客來學(xué)習(xí)。
3、哈希表(必學(xué))
碰撞解決方法:開放定址法、鏈地址法、再次哈希法、建立公共溢出區(qū)(必學(xué))布隆過濾器(原理與應(yīng)用)4、樹
二叉樹:各種遍歷(遞歸與非遞歸)(必學(xué))哈夫曼樹與編碼(原理與應(yīng)用)AVL樹(必學(xué))B 樹與 B+ 樹(原理與應(yīng)用)前綴樹(原理與應(yīng)用)紅黑樹(原理與應(yīng)用)線段樹(原理與應(yīng)用)樹相關(guān)是知識還是挺多的,建議看書,可以看《算法第四版》。
5、數(shù)組
樹狀數(shù)組
矩陣
二、算法在項(xiàng)目中的作用
在代碼中如果沒有算法,就沒有靈魂,就像人沒了靈魂就成了一具尸體,常用算法是是科學(xué)家經(jīng)過推理推算出來解決某一特定問題的有效解決方案,因此在代碼使用算法,可以大大提高代碼運(yùn)行效率,例如:
排序算法顧名思義用于各種數(shù)據(jù)的排序
紅黑樹用于調(diào)度、虛擬內(nèi)存管理、跟蹤文件描述符和目錄條目等
哈希表,用于實(shí)現(xiàn)索引節(jié)點(diǎn)、文件系統(tǒng)完整性檢查等;
鏈表上的合并排序用于垃圾回收、文件系統(tǒng)管理等
排序算法通常需要先搞清楚兩個(gè)基礎(chǔ)概念,算法復(fù)雜度及穩(wěn)定性,這兩個(gè)概念可以通過du娘搜索,這里就不啰嗦了。
排序算法復(fù)雜度及穩(wěn)定性
? ? ? ?

? ? ? ?
三、如何快速掌握算法
對于初學(xué)者來說,學(xué)習(xí)算法最好的方式就是通過視頻講解,這里給大家推薦一套威哥錄制的免費(fèi)Java經(jīng)典視頻,視頻里不僅講了常用的基礎(chǔ)算法和數(shù)據(jù)結(jié)構(gòu),還是一套入門JAVA的經(jīng)典視頻
? ? ? ? ? ? 強(qiáng)烈推薦~

四、最后總結(jié)一下
學(xué)習(xí)算法的好處很多,威哥十多年的開發(fā)經(jīng)驗(yàn)總結(jié)以下幾點(diǎn),希望可以幫助到你:
算法邏輯性極強(qiáng),是初學(xué)者訓(xùn)練邏輯推理能力的良藥
算法在面試中頻頻被問到,是考察面試者基本功的最佳問題
算法在底層實(shí)現(xiàn)中使用較多,這是考察技術(shù)能力功底深不深的條件
優(yōu)先使用算法解決實(shí)際問題,可以大大提高程序運(yùn)行性能(選擇好復(fù)雜度)