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