丁香五月天婷婷久久婷婷色综合91|国产传媒自偷自拍|久久影院亚洲精品|国产欧美VA天堂国产美女自慰视屏|免费黄色av网站|婷婷丁香五月激情四射|日韩AV一区二区中文字幕在线观看|亚洲欧美日本性爱|日日噜噜噜夜夜噜噜噜|中文Av日韩一区二区

您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號安全和更好的產品體驗,強烈建議使用更快更安全的瀏覽器
此為臨時鏈接,僅用于文章預覽,將在時失效
專欄 正文
發(fā)私信給圖靈訪談
發(fā)送

5

學習算法太枯燥?那么就來“玩”算法吧

本文作者: 圖靈訪談 2015-10-14 17:20
導語:他說他是一個“玩”算法的人 —— 等等,算法有什么可玩的?

學習算法太枯燥?那么就來“玩”算法吧

王曉華是一位熱衷于算法研究的程序員,也是《算法的樂趣》一書的作者。他目前在中興通訊上海研發(fā)中心從事光纖接入網(wǎng)通訊設備開發(fā),擔任EPON(以太網(wǎng)無源光網(wǎng)絡)業(yè)務軟件開發(fā)經理,參與開發(fā)的PON設備在全球部署過億線,為數(shù)億家庭提供寬帶接入服務。

對于算法,王曉華更愿意稱自己是在“玩”,“玩算法”最大的樂趣就是用程序解決生活中的問題。當年為了方便使用Visual Studio 6.0開發(fā)軟件,他特意編寫了一個tabbar插件,并隨后開源了這個軟件。為了文檔安全,他開發(fā)了一個基于layerFSD技術的透明文件加密系統(tǒng),在朋友圈內廣為流傳。后來他在使用Source Insight軟件的時候,又以外掛的形式為Source Insight開發(fā)了TabSiPlus插件,受到了很多程序員朋友的歡迎。

關于算法該怎么“玩”,王曉華自有多年的經驗分享:

為了玩游戲而開始的算法之旅

從上大學時候開始,我迷上了算法。那時候,像我這樣的懶人覺得拼音輸入法太繁瑣,于是就去學“表形碼”(當然,因為笨的原因,現(xiàn)在還在用拼音輸入法)。資深一點的游戲玩家都還記得,那個時候為了玩中文DOS游戲,很多人都裝了UCDOS中文環(huán)境,UCDOS沒有表形碼,但是支持通過碼表文件增加自定義輸入法。我研究了Windows上的表形碼碼表文件(老師給的,適用于Windows 3.x版本)和UCDOS碼表文件的格式,發(fā)現(xiàn)二者有一定的相似性:都是文本文件,有固定的格式,每一行由一組編碼和一個字或詞組成一個編碼對。二者的區(qū)別僅僅在于一個文件是編碼在前,對應的字或詞在后面,另一個剛好相反,字或詞在前,對應的編碼在后面。碼表文件有十幾萬行,手工修改是不可能了,剛好當時在上C語言課,就決定寫個程序來做這個事情。

學習算法太枯燥?那么就來“玩”算法吧

神奇的表形碼

第一次運行我寫的程序,十幾秒鐘都沒有結束。因為我之前寫的C語言作業(yè),從來沒有哪個程序運行時間超過1秒鐘的,所以我覺得這個程序掛了,于是我就“Ctrl+Break”了。但是分析代碼又覺得沒有問題,看了遺留在磁盤上的碼表文件,發(fā)現(xiàn)轉換了幾千行,并且內容是對的。于是再次運行程序,等了2-3分鐘,程序結束了。我急不可待地將得到的碼表文件導入UCDOS,發(fā)現(xiàn)可以用,當時就感覺非常有成就感。這是我第一次為解決一個實際的問題編寫算法,盡管當時還沒有算法、軟件的概念,但是隱隱約約就覺得這東西有用,不是只用于完成作業(yè),還可以解決實際的問題。后來我接觸到了更多的有用算法以及各種算法競賽,一直到現(xiàn)在,寫個程序解決問題幾乎成了一種習慣。

學習算法難在哪里?

許多算法是有難度的,理論很復雜,不容易理解和掌握,這是客觀存在的現(xiàn)實。但是我們可以通過提高自身分析問題和解決問題的能力來相對地降低學習難度。從基礎來講,要深入理解數(shù)據(jù)結構,至少要非常熟練地掌握一種排序算法,各種線性表的插入、刪除算法,樹的遍歷和插入、刪除算法,圖的遍歷算法等等。然后要多學習,掌握一些常見問題的解決模式,比如窮舉算法如何應用,動態(tài)規(guī)劃算法如何應用等等。最后要勤思考,對應已經掌握并解決的算法,要想想為什么用這種方法解決,有沒有其他方法,類似的問題怎么辦,提高舉一反三的能力。

想學好計算機算法,數(shù)學問題是無法回避的。數(shù)學的重要性不在于算法中用了哪些公式或數(shù)學原理,其重要性在于一種思維方式的培養(yǎng)。當我們遇到一個新的問題的時候,通常有兩種解決問題的方式,一種方式是創(chuàng)造一種新的方法來解決這個問題,另一種方式是將新問題分解、轉化成已知問題,然后用已知的方法解決這個問題。這兩種方式都很需要抽象思維能力,現(xiàn)實生活中很少有機會鍛煉抽象思維能力,而學習數(shù)學是一種很好地培養(yǎng)這種能力的方法。但是并不是說要學好算法就必需成為數(shù)學大咖,而是通過學習數(shù)學促進抽象思維能力的提高。

學習算法太枯燥?那么就來“玩”算法吧

算法設計又難在何處?

參加算法競賽其實是一件很痛苦的事情,要經過大量的訓練,很多人會選擇背一些算法或整理一些算法模板,到時候可以直接套用。在理解算法的基礎上熟記一些經典的算法實現(xiàn)其實也是一件無可厚非的事情,我上學的時候也參加過一些比賽,通常在比賽之前也會突擊訓練一兩個月,背很多東西,基本上也是事后一個月就全忘了。

比賽的題目一般都有特定的套路,但是現(xiàn)實生活中的算法往往就事而論,有可能只有你遇到過,沒有現(xiàn)成的經驗,需要自己從無到有來解決問題。我認為算法設計有三個方面需要強調:模型的建立、演化算法和輸入、輸出的轉換。這三個方面中模型的建立是關鍵,很多情況下,模型建好了,演化算法和輸入、輸出的轉換就水到渠成。

建立模型的基礎是數(shù)據(jù)結構。當一個問題的數(shù)據(jù)存在先進先出的特性時,你要想到隊列。當一個問題的數(shù)據(jù)需要頻繁查找操作時,你要想到有序表、hash、map。當一個問題的數(shù)據(jù)需要頻繁的插入、刪除操作時,你要想到鏈表。當一個問題中的數(shù)據(jù)包含父子關系時,你要想到樹。當一個問題中的數(shù)據(jù)中既有節(jié)點又有路徑什么的,你要想到圖。這些都和使用數(shù)據(jù)結構的經驗有關,只要多練習就能掌握。

建立模型還需要抽象的邏輯思維能力。簡單地說,就是運用抽象的邏輯思維,抓住問題的主要因素,忽略次要因素,建立問題的框架。

算法設計之難體現(xiàn)在思維方式的轉換和模型的建立。前面說過,這需要有抽象思維能力,缺乏這種能力,連問題都很難想明白,更不用說設計解決問題的算法了。幸運的是這種能力是可以培養(yǎng)的,學好數(shù)學,多研究一些算法,積累些經驗,都是很好的提高抽象思維能力的方法。

學習算法太枯燥?那么就來“玩”算法吧

算法學習的干貨推薦

在我學習算法的過程中,興趣是最大的推動力。興趣來自于我覺得這東西能解決問題,對自己有用。我在策劃《算法的樂趣》這本書的時候,我依然沿用了這種思想。我選取、介紹的例子都是大家生活中沒有在意,但是卻處處都會遇到的算法,通過這些例子讓大家覺得算法是有用的,并通過這個來吸引大家關注算法,學習算法,從而達到提高能力的作用。

算法學習是一條并不簡單的路,就我的經驗而言,在計算機上學習算法首先需要熟悉編程語言和數(shù)據(jù)結構,關于編程語言和數(shù)據(jù)結構有很多經典的書籍,我就不多介紹了。就算法而言,我看過的書有Cormen的《算法導論》、Knuth的《計算機程序設計藝術》、Weiss的《數(shù)據(jù)結構與算法分析》、Levitin的《算法設計與分析基礎》、Kleigberg的《算法設計》等等。想?yún)⒓铀惴ǜ傎惖耐瑢W可以參考劉汝佳等人編寫的《算法藝術與信息學競賽》,以及《ACM國際大學生程序設計競賽題解》。因為時間過去太久了,已經不記得看這些書的順序了,只記得最早看的是《算法導論》,關于順序實在沒有什么經驗可談。

至于如何讀這些算法的經典書籍,我倒是有一些經驗和大家分享:

不管哪一本書,都不要泛泛地看一遍就覺得看懂了,而是要把書中的每一個例子算法都用程序寫出來,這樣才能留下深刻的印象。如果遇到看不懂的地方,不要停下來,跳過去看其他算法,過幾天在回頭來看,如果還看不懂就再過幾天再回頭來看。千萬不要在一個地方停下來,否則你很可能就此失去興趣,恐怕永遠也看不完這本書了。

此外,還有一些學習算法的網(wǎng)站值得推薦:

游戲開發(fā)相關的算法介紹:

http://www.gamedev.net

http://theory.stanford.edu/~amitp/GameProgramming

http://www.gamasutra.com

http://www.sudoku.com

俄羅斯方塊游戲的算法網(wǎng)站:

http://gforge.inria.fr/projects/mdptetris

http://colinfahey.com/tetris/tetris.html

leetcode,最近很火的算法網(wǎng)站:

http://www.leetcode.com

Topcoder,也很經典,每周都有競賽,有獎金的:

http://community.topcoder.com/tc

還有很多大學也有自己的競賽題庫,比如北大、杭電和華中科技大學等等。

編程算法、推薦算法、數(shù)據(jù)挖掘涉及的算法的區(qū)別和聯(lián)系?

編程算法應該只是算法的一種表達形式,我們還可以用表格或流程圖來表達算法。數(shù)據(jù)挖掘領域涉及的算法和其他領域的算法并無本質的區(qū)別,只是問題域不同。數(shù)據(jù)挖掘和機器學習常用的方法,比如決策樹、貝葉斯學習、神經網(wǎng)絡、遺傳算法等等,在其他領域也都是有應用的。神經網(wǎng)絡、遺傳算法作為啟發(fā)性搜索算法在人工智能和最優(yōu)化求解領域也得到了廣泛應用。貝葉斯學習在一些電子郵件應用程序中也有應用,主要用于垃圾郵件的識別。在人工智能領域或各種專家系統(tǒng)中,決策樹算法也是常用算法。各種算法之間的聯(lián)系還是很普遍的,在不同的領域扮演著不同的角色,本質上沒有區(qū)別。

在日常生活中,我們有機會見到越來越多的推薦算法,我曾經想買一個佳能鏡頭,于是用了一下百度,想了解幾種鏡頭的評價,結果一連幾天,只要登錄京東或淘寶,首頁都會給我推薦與數(shù)碼相機有關的配件或鏡頭信息。因為工作領域的原因,我對推薦算法沒有深入的研究,我認為這種算法應該主要是建立在大數(shù)據(jù)上的數(shù)據(jù)分類、篩選和過濾。不過就我對算法的理解來說,目前的推薦算法還是有改進余地的,比如要能區(qū)分同一臺計算機的不同使用者,不要在我用電腦的時候向我推薦女式內衣和化妝品,那是我老婆關注的東西。(笑)

學習算法太枯燥?那么就來“玩”算法吧

生活中處處有算法

應該說,在我的工作和生活中也是處處都有算法。說到網(wǎng)絡協(xié)議,TCP協(xié)議中的“滑動窗口算法”也是很經典的算法。路由器和交換機中為了避免出現(xiàn)端口環(huán)路,都會使用最小生成樹算法。在接入網(wǎng)設備中,通常語音報文的優(yōu)先級高于視頻報文,視頻報文的優(yōu)先級又高于一般的數(shù)據(jù)報文,當一大波各種報文來臨時,設備如何處理?這個算法也很經典,就是用多個隊列加上一個調度算法,簡單說就是六個字:分分類,排排隊。

隨著寬帶的普及,現(xiàn)在幾乎家家都有路由器,很多人都會在路由器上給各個端口配置帶寬,這就會用到帶寬分配算法,令牌算法和Max-Min Fairness帶寬分配算法都是經典的帶寬分配算法。網(wǎng)絡傳輸?shù)臄?shù)據(jù)報文出了錯碼怎么辦?那就要糾錯,Reed-Solomon編碼和解碼算法就是這樣的經典糾錯算法,除此之外,Reed-Solomon編碼和解碼算法還用于光盤、磁盤的數(shù)據(jù)糾錯。

說實話,我曾經“玩”過的算法,絕大多數(shù)都沒有機會直接應用到工作當中,但是“玩”算法對我的影響是顯而易見的,它提高了我的動手能力,以及遇到問題時分析并解決問題能力,這就是收獲,也是任何一個軟件企業(yè)對程序員最基本的要求。

雷峰網(wǎng)原創(chuàng)文章,未經授權禁止轉載。詳情見轉載須知。

學習算法太枯燥?那么就來“玩”算法吧

分享:
相關文章

知情人士

對話國外知名技術作者,講述國內碼農精彩人生。你聽得見他們,他們也聽得見你。
當月熱門文章
最新文章
請?zhí)顚懮暾埲速Y料
姓名
電話
郵箱
微信號
作品鏈接
個人簡介
為了您的賬戶安全,請驗證郵箱
您的郵箱還未驗證,完成可獲20積分喲!
請驗證您的郵箱
立即驗證
完善賬號信息
您的賬號已經綁定,現(xiàn)在您可以設置密碼以方便用郵箱登錄
立即設置 以后再說