工程實踐當(dāng)中,最常用的算法和數(shù)據(jù)結(jié)構(gòu)有哪些?
以下是Google工程師Arjun Nayini在Quora給出的答案,得到了絕大多數(shù)人的贊同。
最常用的算法
1.圖搜索算法(BFS,DFS)
2.排序算法
3.通用的動態(tài)規(guī)劃算法
4.匹配算法和網(wǎng)絡(luò)流算法
5.正則表達式和字符串匹配算法
最常用的數(shù)據(jù)結(jié)構(gòu)
1.圖,尤其是樹結(jié)構(gòu)特別重要
2.Maps結(jié)構(gòu)
3.Heap結(jié)構(gòu)
4.Stacks/Queues結(jié)構(gòu)
5.Tries樹
其他一些相對比較常用的數(shù)據(jù)算法還有:貪心算法、Prim’s / Kruskal’s算法、Dijkstra’s最短路徑算法等等。
在學(xué)習(xí)了解這些數(shù)據(jù)結(jié)構(gòu)和算法之前,引用一位前輩的話:
“我們不需要你能不參考任何資料,實現(xiàn)紅黑樹;我們需要的是你能在實踐當(dāng)中,選擇恰當(dāng)?shù)臄?shù)據(jù)結(jié)構(gòu)完成程序開發(fā);在必要的時候,能在已有的數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)上進行適當(dāng)改進,滿足工程需要。但要做到這一點,你需要掌握基礎(chǔ)的算法和數(shù)據(jù)結(jié)構(gòu),你需要理解并應(yīng)用一些高級數(shù)據(jù)結(jié)構(gòu)和算法的思想。因此, 在程序員這條道路上,你要想走得更遠,你需要活用各種數(shù)據(jù)結(jié)構(gòu),你需要吸收知名算法的一些思想,而不是死記硬背算法本身。”
怎么樣才能活用各種數(shù)據(jù)結(jié)構(gòu)?
你能很清楚的知道什么時候用hash表,什么時候用堆或者紅黑色?在什么應(yīng)用場景下,能用紅黑色來代替hash表么?要做到這些,你需要理解紅黑樹、堆、hash表各有什么特性,彼此優(yōu)缺點等,否則你不可能知道什么時候該用什么數(shù)據(jù)結(jié)構(gòu)。
常言道:
程序 = 算法 + 數(shù)據(jù)結(jié)構(gòu)
程序 ≈ 數(shù)據(jù)結(jié)構(gòu)