《算法的樂趣》作者王曉華訪談:多看、多做、多想是秘訣

摘要:王曉華是一位熱衷于算法研究的程序員,他是CSDN算法專欄的超人氣博主,也是《算法的樂趣》一書的作者。近日,筆者采訪了王曉華,請他分享算法的經驗之道。

王曉華是一位熱衷于算法研究的程序員,他是CSDN算法專欄的超人氣博主( 博客),也是《算法的樂趣》一書的作者。2005年畢業于華中科技大學,目前在中興通訊上海研發中心從事光纖接入網通訊設備開發,擔任EPON(以太網無源光網絡)業務軟件開發經理,參與開發的PON設備在全球部署過億線,為數億家庭提供寬帶接入服務。?

日前,筆者對王曉華進行了采訪,請他分享專研算法的樂趣之道。


王曉華

CSDN:請先做個自我介紹、所在公司以及目前所負責的領域。

王曉華:我目前在ZTE上海研發中心從事軟件開發相關工作。我們開發的產品是無源光網絡(PON)設備,在網絡設備領域中,我們開發的設備屬于接入網設備,也就是常說的“網絡的最后一公里”。光接入技術目前已經是接入網的主流技術,未來的家庭寬帶建設,比如FTTH、FTTB,都依賴于光接入技術的不斷發展和革新。當前,下一代PON技術(NG-PON2)的標準正在制定過程中,NG-PON2標準將提供單纖40G bps的下行帶寬,千兆光纖入戶將成為現實,到時候只有百兆接口家用路由器將被淘汰,無線傳輸的速率也將水漲船高。

CSDN:是什么原因促使你對算法感興趣的?又是什么原因讓你堅持把算法做下去的?

王曉華:剛開始我對算法和軟件沒有概念,覺得編程序就是為了應付作業。后來因為學習表形碼輸入法,就寫了一個程序把Windows格式的表形碼碼表文件轉換成UCDOS支持的碼表文件格式,這個程序只用了幾分鐘就完成了十幾萬條記錄的轉換,給我很大的震撼,讓我覺得這東西不只是交作業,還可以做一些有用的事情,從而開始對編程感興趣,從簡單的排序算法開始,逐漸接觸了更多有用的算法,進而對設計算法產生興趣。

研究算法其實是一個很枯燥的過程,常常一個人在計算機前面一坐就是一天,其他人都很難理解這種行為,沒有興趣是堅持不下來的。上學的時候也熱衷于參加各種算法比賽,填鴨式的背很多東西,記算法的模式,搞得很辛苦,也沒取得很好的結果。當時以為這就是算法的意義,搞得幾乎對算法失去了興趣。讀研究生的時候想做一個MP3播放器,為了實現均衡器和頻譜的功能,找了很多資料,最后發現了離散傅立葉變換算法,小小的算法蘊含了這么多的意義在里面,于是對算法又燃起了興趣。后來有學習了一些很有意思,但是都很實用的算法,比如A*尋徑算法、棋類游戲的博弈樹算法等等,漸漸地開始把興趣放在更有實用意義的實用類算法上,開始研究針對各種現實問題的算法設計和實現。解決的實際問題越多,分析問題、解決問題的能力就越強,“玩”算法的興趣就越大。

CSDN:?《算法的樂趣》這本書的思路是怎樣的?對讀者而言如何學習這本書,你有什么建議?

王曉華:這本書從一開始就順著培養興趣的思路來策劃的。市面上已經有很多算法設計的書了,或淺顯易懂,或深不可測,如果沿用類似的討論再寫一本完全沒有意義。而我的“算法系列”專欄中剛好已經介紹了很多有意思的算法,于是就以此專欄為基礎,補充了一些有趣的專業類算法和實用類算法,構成了本書的主要結構。每一個有趣的算法都展示了從問題的提出,到設計模型,最后得到能解決問題的算法實現的完整過程,將算法設計的三個關鍵問題融入到整個過程中,使得讀者在得到一個趣味算法的同時,也學習了算法設計的整個過程。

本書各個章節之間沒有前后關系,可以從任意一個感興趣的章節開始看這本書。對讀者而言,我建議先系統看完前三章,然后再挑選感興趣的章節開始。在圖靈社區可以下載本書的全部源代碼,任何問題都可以在源代碼中找到答案。

CSDN:什么是算法?最常見的算法有哪些?可否就其中一個給大家舉個示例。

王曉華:我理解的算法的意義就是解決問題,從這個角度看,我將算法分為專業類算法、通用類算法和實用類算法三類。專業類算法通常都有一些堅實的數學理論、物理理論或其他理論作為理論支撐,比如離散傅立葉變換算法、RSA算法、AES加密算法、各種曲線擬合算法、插值算法、牛頓迭代法以及計算機圖形學中的各種圖形生成算法、消隱算法等等。專業類算法通常在一些專業領域內廣泛應用,經過多年的研究和技術積累,普遍形成了各種固定的高效算法實現,很多情況下都可以像函數庫一樣直接拿過來用。

通用類算法也有相應的理論支撐,算法的套路是固定的,但是算法的實現要視具體的問題而定。此類算法的例子也比較多,比如退火算法、蟻群算法、遺傳算法、BP神經網絡模型學習算法(誤差反向傳播算法)等等。此類算法雖然套路固定,但是不同的問題有不同的實現方式。以遺傳算法為例,針對不同的問題要設計不同的遺傳編碼格式,遺傳編碼格式不一樣,對應的基因交叉和變異算法的具體實現自然也不一樣,但總的來說,還是按照遺傳算法的套路進行。通用類算法應用領域更廣泛,上面提到的幾種算法都是常用的最優化求解算法(隨機搜索算法),在機器學習、人工智能和虛擬現實等領域都可以看到這些算法的身影。

實用類算法往往是針對特定的問題設計的算法,用于解決某個或某種類型的問題。有時候解決問題的算法很多,但是受重視的往往是公認的效率最高的算法。比如穩定匹配問題,Gale-Shapley 算法就是公認的最好算法。二分匹配問題,大家會首選匈牙利算法。Pierre Dellacherie 算法是俄羅斯方塊游戲中最好的One-piece評估算法。除了這些著名的算法之外,任何人為解決某個問題而設計的算法也可以歸為實用類算法,比如本書提供的求解“三個水桶等分8升水問題”的算法和“愛因斯坦的思考題”的算法。設計針對具體問題的實用類算法是衡量一個程序員水平高低的重要因素,也是程序員需要重點關注的問題。

CSDN:目前中興通訊用到了哪些算法?能不能向讀者詳細介紹下該算法?

王曉華:中興通訊的產品線很長,甚至包括太陽能發電和無線充電,我還真不知道這些產品中到底都用到了哪些算法。就我所涉及的產品來說,很多基本的算法都會用到,既有各種專業算法,也有為解決特定問題而設計的通用算法。比如線性表的排序和查找就用到了快速排序算法和二分查找算法,數據一致性校驗用到了CRC算法,還有本書中提到的環形隊列算法。PON網絡的特點是下行數據是廣播到所有終端設備上的,為了數據安全,標準定義了一套密鑰交換算法,同時規定了實際加密數據采用了三重擾動算法和AES加密算法。

CSDN:從一名資深程序員到《算法的樂趣》的作者,你的學習秘訣是什么?會通過哪些方式來提升自己的專業技能?

王曉華:其實沒有什么秘訣,就是多看、多做和多想。多看就是多看書,多看各種優秀算法的實現代碼。多做就是多寫代碼,看懂算法的實現原理和寫出正確的算法實現之間還是有一道很寬的檻兒,研究一個算法,要到能正確寫出算法實現為止,而不是看懂就算了。多想就是多思考,為什么這個算法比那個算法高效?這個啟發函數為什么要這樣設計?多思考可以培養舉一反三的能力。

CSDN:未來的下一步計劃是什么?有哪些難點需要去克服?

王曉華:這個還真一時不知道從何說起,先不回答了,抱歉。

CSDN:?目前,你常用的編程語言有哪些?在你看來還有哪些語言比較熱門?

王曉華:我目前用的編程語言是C/C++和Lua,偶爾用用Java。2008年聽Ivar Jacoson的演講,他講了個笑話,形容軟件行業就像是時尚業,一天一個潮流:十五年前我們都討論OO,十年前我們追的是組件、UML和UP,五年前變成了RUP和CMMI,兩年前流行XP,現在是Scrum。但是他的一句話我很認同,那就是這些都是好東西,但是沒有任何一種是可以解決你的全部問題的銀彈。我對當今比較流行的編程語言的看法也是這樣,存在就是有道理,這些編程語言沒有好壞之分,但是有各自擅長的領域,要合理的使用它們。

CSDN:你是從什么時候開始接觸CSDN的?對CSDN有什么建議嗎?

王曉華:我從2001年開始就是CSDN的注冊用戶了,剛開始是泡論壇,后來寫博客。建議的話我覺得CSDN要讓博主們能夠通過博客獲得收益,無私的奉獻是一種熱情,但是熱情過后就什么都沒有了。之前CSDN的博客是可以嵌入廣告的,我就從嵌入廣告中獲得了十幾美元的收益,后來都取消了,我看到很多人就把博客遷走了,或者申請了獨立的域名。CSDN的博客和技術文章要繁榮,就要有一個共贏的模式。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/447249.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/447249.shtml
英文地址,請注明出處:http://en.pswp.cn/news/447249.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于Mac環境搭建以太坊私有區塊鏈進行挖礦模擬

第一步:相關軟件的安裝 go-ethereum客戶端安裝Go-ethereum客戶端通常被稱為Geth,它是個命令行界面,執行在Go上實現的完整以太坊節點。Geth得益于Go語言的多平臺特性,支持在多個平臺上使用(比如Windows、Linux、Mac)。Geth是以太坊…

Springboot 添加server.servlet.context-path

Springboot 2.0變革后的配置區別 1、springboot 2.0之前,配置為 server.context-path 2、springboot 2.0之后,配置為 server.servlet.context-path

vs2015 支持Android arm neon Introducing Visual Studio’s Emulator for Android

visual studio 2015支持Android開發了。 Microsoft released Visual Studio 2015 Preview this week and with it you now have options for Android development. When choosing one of those Android development options, Visual Studio will also install the brand new Vi…

基于linux環境采用update-alternatives 方式進行python版本切換

采用update-alternatives 切換版本 update-alternatives是Debian提供的一個工具,通過鏈接的方式,但是其切換的過程非常方便。首先看一下update-alternatives的幫助信息: $ update-alternatives --help 用法:update-alternatives …

FFmpeg示例程序合集-批量編譯腳本

此前做了一系列有關FFmpeg的示例程序,組成了《 最簡單的FFmpeg示例程序合集》,其中包含了如下項目:simplest ffmpeg player: 最簡單的基于FFmpeg的視頻播放器simplest ffmpeg audio player: 最簡單的基于FFmpeg的音頻…

基于Ubuntu環境使用docker搭建對于中文識別的chineseocr_lite項目

光學字符識別(OCR) 光學字符識別(OCR)目前已經有了很廣泛的應用,很多開源項目都會嵌入OCR 來擴展原有的能力,例如身份證識別、出入停車場的車牌識別、拍照翻譯等等本文介紹的開源的中文 OCR 項目&#xff…

Ubuntu環境使用conda安裝輕量級中文ocr開源項目chineseocr_lite,最簡單的方式

問題 接使用docker的方式來創建項目所報的錯誤選中文件之后,界面不停的繞圈,顯示不了對于圖片的識別結果,并且監控界面上出現錯誤提示如下ImportError: libpython3.6m.so.1.0: cannot open shared object file: No such file or directory&a…

基于Ubuntu使用docker的方式來搭建基于Yolo3+crnn的Chineseocr識別

Docker Docker簡單易用,具體的安裝和配置可以看我的或者其他人的博客 安裝完之后,輸入以下命令安裝chineseocr并且開啟服務 docker pull zergmk2/chineseocr docker run -d -p 8080:8080 zergmk2/chineseocr 在瀏覽器輸入http://127.0.0.1:8080/ocr網…

c/c++ 內存使用指南 和實踐指導

如果你完全理解如下內容, 請聯系我:szu030606163.com, 討論更深層次合作 。 1. 大內高手—內存模型 單線程模型 多線程模型 2. 大內高手—棧/堆 backtrace的實現 alloca的實現 可變參數的實現。 malloc/free系列函數簡介 new…

mininet 應用實踐

教學目的與學時建議 能夠運用 mininet 可視化工具創建計算機網絡拓撲結構能夠運用 mininet 交互界面創建拓撲結構能夠運用 python 腳本構建計算機網絡拓撲結構建議:2 學時 實驗環境 下載并安裝虛擬機 VMware workstation;下載虛擬機鏡像( S…

使用百度大腦,導入aip以及相應的庫文件報錯問題

參考文章 github鏈接地址 具體操作 pip install githttps://github.com/Baidu-AIP/python-sdk.gitmasterfrom aip import 對應服務即可

一個通用的makefile寫法,自動推導文件的依賴關系

溫習之用。 假設有兩個頭文件目錄 header1,header2;兩個cpp文件目錄,src1,src2,一個lib目錄 寫一個完整的makefile步驟如下: 1 定義可執行文件的名稱 TARGET MyPro 2 指定此編譯工程所要使用的頭文件所在的目錄 INC -I. -Iheader1 -Iheader2 3 指…

實現基于darknet框架實現CTPN版本自然場景文字檢測 與CNN+CTCOCR文字識別的ChineseOCR搭建

Github地址 Github源碼地址 支持系統:mac/ubuntu python3.6 實現功能 文字檢測; 文字識別; 支持GPU/CPU,CPU優化(opencv dnn) docker鏡像服務(CPU優化版本) 下載鏡像 鏈接:https://pan.baidu…

50個c/c++源代碼網站

C/C是最主要的編程語言。這里列出了50名優秀網站和網頁清單,這些網站提供c/c源代碼。這份清單提供了源代碼的鏈接以及它們的小說明。我已盡力包括最佳的C/C源代碼的網站。這不是一個完整的清單,您有建議可以聯系我,我將歡迎您的建議&#xff…

在服務器上搭建基于yolo3 與crnn 實現中文自然場景文字檢測及識別,GPU版本

Github地址 參考地址作者大人,十分熱心,對于我的問題,提供了大量的幫助,使我少走了很多的彎路,在此表示由衷的感謝 注意事項 使用nvidia-smi命令查看cuda的版本,必須是10.1或者10.0,10.2是萬萬…

python TypeError can only concatenate tuple not str to tuple

原因分析 這個錯誤出現是因為執行元組之間的合并例子 tuple1 ("str",1,["a","b","c"],4) tuple2 ("hello",) print(tuple1[0]) print (tuple1[1:3]) print (tuple1[1:]) print (tuple2 * 2) print (tuple1tuple2) 注意事…

23種設計模式 -比喻

1、FACTORY—追MM少不了請吃飯了,麥當勞的雞翅和肯德基的雞翅都是MM愛吃的東西,雖然口味有所不同,但不管你帶MM去麥當勞或肯德基,只管向服務員說“來四個雞翅”就行了。麥當勞和肯德基就是生產雞翅的Factory (下載源碼就到源碼網:…

python 版本2和3 在/取模方面的的差異

注意事項 python2 使用 /python3 使用 // 例子 二分法取數值 def binary_search(search_list,target):left 0right len(search_list) - 1while left < right:mid (left right) // 2if search_list[mid] < target:left mid 1continueif search_list[mid] target:r…

vc中調用其他應用程序的方法(函數) winexec,shellexecute ,createprocess

三個SDK函數: WinExec&#xff0c;ShellExecute &#xff0c;CreateProcess可以實現調用其他程序的要求&#xff0c;其中以WinExec最為簡單&#xff0c;ShellExecute比WinExec靈活一些&#xff0c;CreateProcess最為復雜。WinExec 兩個參數&#xff0c;前一個指定路徑&#xf…

算法入門篇 一 時間復雜度

時間復雜度 要求&#xff1a;只要高階項&#xff0c;不要低階項常數操作&#xff1a;操作花費的時間和數據量無關&#xff0c;比如數組尋址&#xff0c;直接利用偏移量找到對應元素的位置&#xff1b;非常數操作&#xff1a;比如list(鏈表)&#xff1b;查找元素需要遍歷鏈表&a…