怎樣學算法

回答前,我們先來舉個例子:如何實現“把大象裝進冰箱”?

先來看看丹丹老師的“算法”:

說,要把大象裝冰箱,總(long)共分幾步?

三步。

第一步,把冰箱門打開,

第二步,把大象裝進去,

第三步,把冰箱門帶上。

在這個“程序”中,大象、冰箱,是數據,而“如何把大象裝進冰箱”,就是這個程序的算法。所以,我們可以理解:程序,由數據和算法有機地結合而成,其中,算法,即“計算方法”,是程序的靈魂。作為程序員修煉的“內功”,算法是計算機科學領域最重要的基石之一,是程序員進階的必修課程,特別是面試時,算法是必不可少的一部分。

當然,丹丹老師說的這三步,我們可以更細緻地分解——

算法一:把大象放在冰箱前,把冰箱門打開,把大象裝進去。

算法二:把冰箱門打開,把大象放在冰箱門前,然後把大象裝進去。

算法三:把大象放在冰箱前,把冰箱門打開對準大象,然後把冰箱向著大象推動直至把大象裝進去。

算法四:……

由以上可以看到,實現一種需求,可以設計出多種算法,並且,算法在很大程度上決定了你寫出的程序漂不漂亮、巧不巧妙,所以我們學習算法的目的是為了在寫程序時能夠設計出更優化的方案。

說完What和Why,我們著重來說一下How。對於初學者來說,可以分成三個階段進行算法的學習,循序漸進,逐步深入。

第一階段:基於語言去學習數據結構

首先從最熟悉的編程語言入手,推薦Java或C++,去初窺算法。所謂初窺算法,本質上就是要對數據結構有一定的瞭解。數據結構,就是把數據和算法聯繫起來的橋樑,比如排序、搜索、回溯、貪心、動態規劃、樹、鏈表、隊列、棧等等,這些屬於計算機科學基礎,每位準程序員都應該掌握。同樣的數據,如果選擇的數據結構不同,就會把我們引導到不同的算法上面。

繼續舉大象的例子。一個“把十頭大象裝進冰箱”的程序,首先要解決的問題是:如何存放這十頭大象。你可以把這十頭大象用繩子挨個串起來,這樣即使大象會亂跑,但只要你一直抓著繩子頭,就可以順藤摸瓜,把十頭大象都找到;或者,你可以製作十個緊挨著的格子,然後把每頭大象依次放到格子中,這樣大象就不會亂跑。在這裡我們可以看到,同樣是存放十頭大象,我們設計出了兩種不同的方式,這兩種對大象(數據)的存放方式,就是“數據結構”。

怎樣學算法

同時可以很容易發現,這兩種數據結構是各有利弊的。比如用繩子的數據結構,你想增加一頭大象很容易,只要再串一個大象即可,但是指定某一頭大象卻很麻煩,因為你不得不從繩子頭開始依次查找;而用格子的數據結構,可以很容易找到任意一頭大象,但增加一頭大象卻很麻煩,因為更改格子數量對計算機來說並不是一件容易的事情。所以,不同的數據結構,由於優缺點不同,會直接影響與之適配的算法的好壞。

每種語言都有一些數據結構,因此可以通過自己熟悉的語言先對數據結構進行了解。初學者如果非常想看書的話推薦《大話數據結構》,這本書比較淺顯易懂,實在看不懂的東西也不必深究,簡單過一遍有個大體概念就可以了,隨著積累,之前不懂的東西自然而然就明白了。至於名氣極大的《算法導論》和官方課本《數據結構》,細節方面有些瑣碎,小白看的話易頭痛,易傷自尊,易被勸退,所以不建議小白看。

怎樣學算法

如果你恰好聰明如謝耳朵,則可以自由選擇相關書籍

第二階段:基於數據結構去學習基本的算法

在對數據結構有了一定了解的基礎上,就可以對常用的算法進行學習了。比如最基本的各種不同的排序方法:冒泡排序法、選擇排序法等等。在此期間,可以加強對“時間複雜度”這一概念的瞭解,同時開始學習一些更高級的數據結構。

這些更高級的數據結構所適用的場景更為簡單,因此與它們相匹配的算法基本都固定了,比如紅黑樹、二叉堆等,這些數據結構是否會被使用,完全取決於其時間複雜度的情況。因此熟記它們的時間複雜度可以讓你在不同場景下選擇最優的數據結構。

同時,你還需要學習與“圖”相關的算法,如廣度優先遍歷、深度優先遍歷、最短路徑等等。這個階段,你可以嘗試學習經典書籍《算法導論》了。

怎樣學算法

另外,在這個階段,建議找個OJ(Online Judge) 嘗試做題,遇到問題可以更有針對性的學習。Online Judge會給你一個簡單的問題,然後讓你編程解決,系統會有很多測試樣例。如果你的代碼可以通過所有的測試樣例,那麼說明你的代碼邏輯上是正確的。同時OJ都會有一定的內存使用與運行時間限制,過於低效或耗費大量非必要空間的算法將不會通過測試。

選擇OJ直接上手做題的好處是它可以給你正反饋。在OJ上,你可以為了解決一個小目標而學。前期可能要用自己沒見過的數據結構、沒聽說過的算法去解決具體問題,這段時間測評系統不會遷就你,你的理解上有一點小小的偏差,OJ都會狠狠的甩你一臉wrong answer。

但同樣的,每一個Accept都會讓你的大腦獎勵自己一份多巴胺,能夠讓你更快更精準地融會貫通。隨著做題越來越多,你的算法熟練度會被錘鍊的越來越高,能夠更完美的解答新的題目,後期還可以參加一些比賽小試身手。

怎樣學算法

PS:在OJ上遇到不能通關的算法或數據結構,建議優先找相關視頻來學習,其次是技術博客(不過,博客要挑靠譜的來看)。

當然,除以上方法途徑之外,你也可以通過課程高效學習算法,從基礎出發,強化算法知識,啃完《算法導論》可能要1年,學習這一門課程你只需要1~2個月就能在算法面試脫穎而出了,適合想打好基礎與提升自身高度的同學! 精選了幾門liuyubobobo老師的算法課程,都在這個專題裡面了:走進Google最強AlphaGo Zero算法背後的智能時代 各取所需吧~

第三階段:基於具體需要和個人興趣進階

如果只是要滿足基本使用或大多數工作中的需求,那麼完成第二階段基本就足夠了(除非你是專門研究算法的)。

到了進階階段,更多的是對算法能力的拔高與探索。在此期間,你會觸及到人類目前在算法領域的瓶頸區以及一些更為高級的數據結構。在這一步,建議你除了熟讀《算法導論》外,還要繼續閱讀其他書籍,包括一些學術論文。

你可以繼續深入探索基礎算法,參加ACM比賽獲得獎項;也可以用你練就的紮實編程基礎去實現一些高級點的思想型算法,比如遺傳算法,模擬退火等去解決實際的一些問題;還可以讀個研究生深入某個方向去研究計算機視覺,自然語言處理、數據挖掘、分佈式等等對數學要求較高的算法,這些都可以讓你成長為一名優秀的算法工程師。

祝君學有所成!~ 加個關注哦。

怎樣學算法

鏈接:http://www.imooc.com/article/31724


分享到:


相關文章: