標籤:

如何系統地學習演算法?


謝邀。對於這個問題,我也不太有發言權,只能根據自己的體會瞎說一下。不清楚lz的具體水平,所以中間提供了一些可供測試的內容。

1、可以先不看任何書籍,自己試著解決一些簡單問題。或是與他人討論問題。

2、等你習慣了使用點陣圖、hash、優先隊列來解決問題(這部分知識用到時從網上能搜索到)。可以開始學習動態規劃和分治。

3、如果你對遞推已有所了解,並會運用到狀態轉移方程中。同時可以解決這裡面的大部分問題:http://www.51nod.com/favorite/index.html#!favoriteId=25。

那麼你可以開始看《演算法導論》了。

4、演算法導論的內容不需要通讀,找自己懂的部分仔細看看,圖論部分可以先略過。習題如有不懂無須深究,以後慢慢體會。最好將注意力集中在《演算法導論》的問題上,不要被其他問題分散了精力。

5、第1次看過導論之後,需要將學到的知識,以及分析問題的方法總結並靈活運用。這時你應當可以解決這裡面的大部分問題。

http://www.51nod.com/favorite/index.html#!favoriteId=36

http://www.51nod.com/favorite/index.html#!favoriteId=26

6、到各個OJ挑一些水題做,同時別忘了同大家討論,討論是加深記憶的捷徑。經過這段後,你應當可以輕鬆的解決這裡面的大部分問題。

http://www.51nod.com/favorite/index.html#!favoriteId=33

http://www.51nod.com/favorite/index.html#!favoriteId=27

如果《演算法導論》算是教材的話,你目前雖未完全掌握教材中的內容,但應該已經了解了不少超綱的內容。

7、第2次看《演算法導論》,這次除了線性規劃和近似演算法可以跳過,剩下的知識點都要涉及。哪怕細節存疑,先掌握哪些問題用哪些方法解決。之後可以試著解決一下這些問題:

http://www.51nod.com/favorite/index.html#!favoriteId=34

http://www.51nod.com/favorite/index.html#!favoriteId=28

到此知識的基礎構架應當完備了,但各種模型轉換以及思想的運用,還要靠長期的積累學習。


很多演算法書的問題是太裝逼,我是robert sedgewick的演算法課才把演算法搞明白的,他的課真正詮釋了什麼叫鞭辟入裡,入木三分。貼一下課程地址給懶癌患者:《演算法一》Coursera - Free Online Courses From Top Universities、《演算法二》https://www.coursera.org/course/algs4partII


樓上前輩少說了我認為很重要一個前提,那就是離散。既說『系統』,要深究,就不是用用而已,你要對比哪個演算法好,就需要計算演算法的效率,複雜度和離散數學關係緊密,所以先學好離散。實際上所有的演算法書在介紹某個演算法的時候都只是在計算它的複雜度,離散不好演算法就學不好,死記硬背幾個經典演算法那當然不叫系統了。這個學好不一定精通,入門即可,畢竟你不是去搞應用數學。

覺得離散學好了就可以看演算法了,當然並不是看懂了就不用記了,經典演算法還是要記,要領和很多計算機本領的練習一樣,就是用你會的各種語言去寫,又練演算法又練代碼,兩不落下,還可以結合演算法數據結構應用密集的項目學習,比如redis.

如果你在學校,老師教的不見得好,但差不多是夠『系統』的,跟好老師和教材。如果你沒在學校,推薦兩本書,《A First Course in Discrete Mathematics - Ian Anderson》如題目所說,就是入門,沒有難度,學過初等數學就能看了,很薄一本,但是學完看演算法書差不多夠了,清華有引進版。演算法書就是《演算法導論》啦。

跟著MOOC學也不錯,最好的自然是MIT的Introduction to Algorithms,網易公開課和iTunesU都有,配合演算法導論,再好不過。

不好意思沒有捷徑介紹給你,一些不權威的個人經驗,祝你精進吧。


讀演算法導論,讀離散數學


推薦一個Google工程師的演算法學習之路,[MSRA鞏朋的演算法之路](MSRA鞏朋的演算法之路(一) | 好書嚴選)

講述了一個普通人如何一步步學習演算法,最後進入Google工作的故事。裡面有推薦自己的學習方法和書籍。


推薦之前關注簡書的一個系列文章:kyson_zhu - 簡書


個人經驗是不能懶。笨辦法是好辦法。拿出一張紙一支筆,自己一步步推一遍。


買來一本演算法導論。先讀一遍,同時寫點程序練練(可以上USACO,還有其他的一些ACM競賽網站看看),實在看不懂的跳過。

然後把演算法導論再讀一遍。


還是先把教科書好好看看吧,比如操作系統,數據結構,最好能動手實現下課後習題


推薦博客:

地址:微信:rdst6029930


推薦閱讀:

請問求一個圖的全局最小割,有什麼比較快的演算法?
人的思維存在範式嗎?
刷完了leetcode,接下來刷哪個網站比較好呢?
計算機快速計算2^N是如何實現的?
迪傑斯特拉演算法(Dijkstra)的本質是貪心還是動態規劃?

TAG:學習 | 演算法 |