首先寫這點東西是為了和大家分享。很多加入群的新人都會問怎么怎么學(xué)習(xí)算法,我也
常常好為人師去參與解答 , 后來覺得應(yīng)該有一個這樣的東西 。 希望大家能夠在群里面多多討
論,前一階段忙于各種各樣的事情也是疏于管理,請大家見諒。
怎么學(xué)習(xí)算法是一個寬大的話題,人人都有自己的見解 。 我覺得如果想要學(xué)習(xí)算法,首
先要知道自己到底處在一個什么樣的層次上 , 下一步的提高方式是怎么樣的 。 網(wǎng)上有很多算
法的層次的講解 , 程序員分九等之類的 。 。 。 我只想說說我的理解 。 其次 , 要知道自己將來要
用算法用到多深的程度。
算法分好多類 , 有傳統(tǒng)意義上的計算機的算法 , 有各個學(xué)科自己的專屬算法 , ( 像 CG 里
面的 Euler angle 四元數(shù) 轉(zhuǎn)換之類 ) 。 。 。這里僅僅討論傳統(tǒng)意義上的計算機的算法。
首先算法入門的問題當(dāng)然就是各種的排序算法了。這個在數(shù)據(jù)結(jié)構(gòu)課程上已經(jīng)被講泛濫
了 。 當(dāng)然僅僅是這么簡單的問題也是能夠看出差別來的 。 你可以嘗試馬上說出各個 排序 算法
的核心思想 , 準(zhǔn)確說出他們的復(fù)雜度 。 如果都可以 , 那么你可以嘗試證明一下 , 快排為什么
在概率意義下是 O(nlogn)... 如果這些你都不清楚 。 恐怕你就要從基礎(chǔ)算法開始掌握了 。 雖然
排序簡單,但是各種排序算法蘊含的算法思想不是都那么淺顯易懂的。
掌握了上述,或許你可以準(zhǔn)備了解一下 Greedy , Divide and Conquer , Dynamic
Programming 了 , 這些是算法設(shè)計的經(jīng)典技巧 。 很多一些很難的問題 , 都能夠通過上述技巧非
常優(yōu)美的解決。舉幾個經(jīng)典的例子來看一下具體掌握多少。
貪心:你能馬上回憶起 Huffman 編碼么? M inimum Spanning Tree 的兩種經(jīng)典構(gòu)造呢?
如果可以,你的貪心算法就算合格了吧。
Divide and Conquer :馬上想起分治排序 。 (這個在排序里面你已經(jīng)掌握了) 最近點對問
題呢??有想法嗎?主定理明白嗎?如果不知道,可以去補一下相關(guān)的知識。
DP :曾經(jīng)很多老師告訴我說, DP 是最不需要技巧的,很多 參加 ACM 的同學(xué)說 DP 是最
需要技巧的 。 在我看來 , DP 是一種經(jīng)驗類題目 , DP 題目的種類千變?nèi)f化 , 每種 DP 的模型
都令人拍案叫絕 。 舉 一個大家普遍都清楚的例子 , 比如說矩陣相乘的 DP 解法 , 最短路徑問
題中 Bellford 算法 ( 這個是我在研究生的時候,才去仔細(xì)思考的一個模型,在實際使用中意
義重大 ) 等等。
如果上述都掌握了,說明你的算法水平已經(jīng)不錯了 。 其實很多人這些事情都不清楚 , 又
不愿意畫時間去研究,他們討論最多的是算法應(yīng)該怎么學(xué)習(xí),算法書籍那本好。 ( 也是我現(xiàn)
在干的 。 。 。 -_-!!) 他們不會花時間去研究算法到底是怎么回事 。 我覺得,學(xué)習(xí)這件事情,自
己不應(yīng)該成為一個收藏者,手頭什么都有,卻什么都沒看。
掌握了上述 , OK , 的確很不錯 , 當(dāng)然還有更多 , 單純上述三種算法的話 , 還有很多東西 :
貪心算法背后的擬陣?yán)碚摚瑒討B(tài)規(guī)劃的優(yōu)化技巧 ( 四邊形不等式等等 ) 。
接下來的一部,我們就要進(jìn)入網(wǎng)絡(luò)流和線性規(guī)劃,這往往也是把很多人擋在算法門外的
一堵高墻 。 最大流 , 最小費用最大流 , 然后是各種算法 。 。 。 太多了 , 不一一列舉 。 。 。 如果你
清楚 , 那么你更應(yīng)該清楚的是網(wǎng)絡(luò)流問題的轉(zhuǎn)化 。 把各種各樣的問題轉(zhuǎn)化為網(wǎng)絡(luò)流 , 轉(zhuǎn)化為
線性規(guī)劃 。 。
如果上述你也清楚 , 那么或許你應(yīng)該看一下近似算法 隨機算法和 NP 問題等等 。 這三類中
任何一類都可以寫成好幾本書,里面的東西也都是浩如煙海,各種 NPC 問題的相互規(guī)約如
果你能夠搞清楚的話 , 或許你都可以到大學(xué)里面教書了 。 。 (->-) 。 。 。 這些都是沒有止境的 。 。 。
如果上述的你還都清楚的話,你可以嘗試一下 Local Search 或者寫幾本關(guān)于近似算法和
隨機算法通俗易懂的中文書 。 。 。或者,把你學(xué)過的算法都變成高效可移植的代碼和文檔 , 開
源造福后人。
熟悉上述所有問題的,往往都是在某個領(lǐng)域經(jīng)歷比較久的 人 , 他們大 都轉(zhuǎn)入了特別窄的
領(lǐng)域進(jìn)行研究了 。 。 。
有關(guān)算法使用什么書 , 這還是被討論了泛濫的問題 , 很多書都不錯 , 我只推薦一本書 《 算
法設(shè)計 》 Jon Kleinberg Eva Tardos 等 , 至于說 《 算法導(dǎo)論 》 等好不好 , 其實都挺不錯的 ,
我只是覺得《算法設(shè)計》比較適合我。
算法的練習(xí)場所就更多了 , 各大高校都非常重視的 ACM 競賽 , 那 就是一個很好的鍛煉 練
習(xí) 場所。 ACM 也訓(xùn)練出了無數(shù)的算法達(dá)人。推薦 T opcoder 的 Single Round Match 。此外 ,
一個更好的練習(xí)是世界各地的 ACM Regional 。當(dāng)然大多數(shù)人都沒有那么多時間和興趣去做
了 。 。 。
以上就是自己對算法的一點小的簡介,有什么錯誤和不足請大家指正。