學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的作用 在用鄰接表表示圖時,拓?fù)渑判蛩惴〞r間復(fù)雜度為多少?
在用鄰接表表示圖時,拓?fù)渑判蛩惴〞r間復(fù)雜度為多少?設(shè)圖中有n個頂點和e個弧,則鄰接表拓?fù)渑判虻臅r間復(fù)雜度為O(n,e)]~。一些深層次的算法可以正確地學(xué)習(xí),但更常見的算法必須學(xué)習(xí)。不僅算法崗需要學(xué)習(xí)這
在用鄰接表表示圖時,拓?fù)渑判蛩惴〞r間復(fù)雜度為多少?
設(shè)圖中有n個頂點和e個弧,則鄰接表拓?fù)渑判虻臅r間復(fù)雜度為O(n,e)]~。一些深層次的算法可以正確地學(xué)習(xí),但更常見的算法必須學(xué)習(xí)。不僅算法崗需要學(xué)習(xí)這么多算法,開發(fā)崗也需要學(xué)習(xí)很多常用算法,這樣才能在開發(fā)過程中編寫出高性能的代碼。我舉個例子。以前,我用MR處理一段數(shù)據(jù)。在reduce階段,我需要根據(jù)某個值保持頂部,但是如果不能使用其他算法,可以調(diào)用quick sort。最壞的時間復(fù)雜度是O(n^2)。當(dāng)數(shù)據(jù)很大時,你不能用完。如果能夠維護大頂堆或bfprt算法,時間復(fù)雜度會大大降低。所以算法是非常重要的。
那么,我們需要學(xué)習(xí)哪些算法?我將列出以下方向
常見的圖論算法,如并集搜索、最短路徑算法、二部圖匹配、網(wǎng)絡(luò)流、拓?fù)渑判虻?/p>
例如常見的二分搜索、三分搜索,特別是二分搜索、訪談常問、深度優(yōu)先搜索和廣度優(yōu)先搜索,經(jīng)典的八道數(shù)字題等等。還有一些啟發(fā)式搜索算法,如模擬退火算法、遺傳算法、粒子群算法、蟻群算法等。
Dijkstra算法用于尋找最短路徑、最大子段和、數(shù)字DP等
這一類比較大,特別是在機器學(xué)習(xí)、人工智能、密碼學(xué)等領(lǐng)域。比如數(shù)論中的大數(shù)分解,大素數(shù)的判定,擴展歐幾里德算法,中國剩余定理,盧卡斯定理等等,組合數(shù)學(xué)中的博弈問題,卡特蘭數(shù)公式,包含排除原理,波利亞計數(shù)等等,計算幾何中的極性排序、凸包問題、旋轉(zhuǎn)卡盤問題、多邊形核問題、平面最近點對問題等。另外,還有一些矩陣的構(gòu)造計算,如矩陣的快冪等。
如果要做算法作業(yè),除了上面的一些應(yīng)用算法外,主要是機器學(xué)習(xí)、深度學(xué)習(xí)算法。
作為一名程序員,需要精通高深的算法嗎?為什么?
這取決于你想成為程序員的哪個方面。
程序員有后端、前端、移動端、大數(shù)據(jù)、人工智能等,如果只是前端和移動端,掌握基本的排序、紅黑樹、哈希等就差不多了。不需要更高級的,更重要的是系統(tǒng)API提供了很多算法方法。寫作并不一定比系統(tǒng)的寫作更好。如果你只是想成為一個普通的程序員,不想朝著高級和體系結(jié)構(gòu)的方向發(fā)展,你會發(fā)現(xiàn)如果你不接觸算法,那就沒關(guān)系了。但是,當(dāng)水流向上流動時,仍然需要該算法。特別是對于大數(shù)據(jù)和人工智能,算法是必要的,算法就是數(shù)學(xué)。
對于人工智能來說,線性代數(shù)、概率論等都是非常重要的,不僅算法可以解釋它們。還有信息論,它計算信息傳遞的熵。個人推薦,可以看到國外的程序設(shè)計大賽,有很多測試算法,平時在開發(fā)中,更多的考慮如何減少信息傳輸,提高代碼效率,這也是一種算法。
我們必須理解和掌握:1。樹,2。散列,3。正規(guī)化,4。圖算法,5。字符串匹配,6。但是我們需要掌握更多的經(jīng)典數(shù)學(xué)算法,這是基礎(chǔ)。算法離不開數(shù)學(xué),算法打得好,一般數(shù)學(xué)都好。通常,建議多讀一些關(guān)于線性代數(shù)、高等數(shù)學(xué)和算法的書,這些書對計算機有幫助??纯雌渌麌业乃惴?,然后寫一些更有啟發(fā)性的程序。但作為程序員,算法只是其中的一部分,更重要的是如何快速迭代,降低開發(fā)成本,如何適應(yīng)業(yè)務(wù)。