這幾天七七八八,也不知道本身在忙什麼。彷佛就是沒心情繼續到這裏寫東西。打了幾天遊戲,用java寫了一個網絡仿真軟件用來測試p2p設計的性能,改改小bug,時間就這麼過去。 但願沒人在這裏等個人下文,否則就慚愧死人了。 言 歸正傳,回來繼續講咱們的正題。 翻翻前面的帖子,對於數據結構和算法,我已經囉嗦了一堆他們的重要性。接下來改說哪本數據結構或者算法的書寫得好把,看看網上這類的帖子文章已經論斤賣 了,再寫也沒多少意義了。何況本身不是算法狂人,所看過的算法書也就那麼基本粗淺的而已,天然不敢出來挨磚。想一想能拿出來和你們分享的,依然是本身的一些 見解和認識而已。 數據結構和算法 算法這兩字其實到今天我仍是稀裏糊塗的,每次讀算法書,前言或者序言第一句話確定就有定 義。反正本科看了一回,碩士的時候學算法又看了一回。至今好像也沒再看過第三回。也不記得書上是怎麼定義的,發展以爲就是特經典,精闢的那種,可是過眼就 記不得。沒事和朋友吹牛的,三句話不離本行,十句話確定是不離算法的:大部分口水是爲「算法」噴的;碼的代碼大多數也是在解決算法問題。 可是對於算法究竟是啥,我卻不肯意深究其定義,由於我知道揪出來也沒意義,它能基本涵蓋一個程序員全部的有用功——就好像你問人吃啥,他說吃飯, 你絕對不會去再問一句飯吃的啥了。 在這裏,我有興趣作的,卻是如何把算法和數據結構來個「實用性」分類。所謂實用性就是我不在意分的對不對,靚不靚,只從合乎情理來分。從對算法和數據結構的逐步深刻理解來分,能夠分爲這麼三類: (1)基本數據結構和基礎算法:編程語言和數據結構,針對對編程語言的掌握 (2)通用算法:針對理論問題的探討 (3)專用算法:金融,路由 這 也對應三個不一樣學習和使用算法和數據結構的階段。 雖然這分法有點老土,可是也是通過我也是仔細琢磨,以爲最合情理的分法。 首先(1)明顯區別與(2)(3):前者是「就事論事」,屬於掌握編程語言的內容,換句「課堂用語」來講就是爲了解決編程實現域中知識技能;後二者是爲了 解決實際應用問題,屬於「應用域」。會了(1),你就基本掌握了啥是編程了,會了(2)(3)你纔算是有點「生產力」,能掙公分了。(1)是大多數學計算 機的人所要關注的,而其餘學科未必注重這個。(2)主要是計算機作理論方面的人在搗鼓 ,和一些職業的應用數學家(3)則是***到各個行業中了。 因此能掌握(3)的人是各行業裏賺錢的;會(2)的人呢小康是有保障屬於技術工種;。剩下的只會(1)的人,就是標榜爲IT民工的各位了。這也就是爲何 你們都說作IT都是打工的,只能給其餘行業的人當槍使。事實也的確如此,大多數人從科班出身人,能把(1)能真正掌握作好就很少,(2)就須要去花不少的 時間去看什麼《算法的藝術》 《算法導論》和有相對比較好的數學底子了。(3)就每每須要在計算機以外有數學的功力和行業的背景知識了。因此說,時下流行的:少壯不努力,老大作IT, 也是有必定道理的。 上面這堆廢話對已經入行的朋友沒有什麼意義,你們就權且一笑;可是若是正準備開始學習編程,那仍是應該把這些記在內心的。不少時候,決定你之後發展的並非你學的是什麼,而在於你對全局的把握。這也是我廢話這麼多的初衷。 言 歸正傳, 如何學好第一步。答案很簡單,也很讓人失望: 學好算法和數據結構的最好辦法就是把所學的背下來,默寫出來。這有點相似英語學習,基本功就是背單詞和句型。之因此強調要背要默的緣由,第一是因爲這是以 後的基礎;第二是之後不再會有這樣的機會讓你來作這些基礎功課。這點上每每是科班程序員和票友程序員之間的分水嶺。科班程序員大多在入門的時候被老師逼 着去作這樣那樣的功課, 雖然不情願可是這些基本功對之後的確意義重大;票友程序員每每沒有這樣的壓力, 在學習中迴避這些基本功,其結果也是人浮於事,以後的內容也學不進去。 這裏說說我當時的學習。個人數據結構老師很不錯,上課用的是南加州大學的老教程,我喜歡把裏面的例程算法都仔細看透,琢磨是否能夠優化。作做業的時候是我 最慘的時候。當時軟盤都不多用, 程序都是本身寫在做業本上交老師批改的。 女孩子們喜歡打草稿,反正他們的做業都乾淨要命。我是粗線條那種, 不喜歡作門面功夫,那就得力求一次性在做業上把程序從頭至尾都一次寫出來。這固然不可能了, 即使在計算機上編程,也不可能一次性把整個程序都寫出來。因此個人本子老是塗塗改改的特別噁心。 成績固然不高,即使程序是對的,老師也不肯意給如此噁心的做業打高分。 爲了提升成績,只能少塗改,那隻能要求我本身在腦子裏面進行「腦中做業」,由於上機的時間實在是很少,還得本身花錢買上機票。另一個辦法就是背住所學的 算法, 背住的越多,腦中做業的腦力花費越少。因而這無形中極大強化了我對算法的掌握。後來我看其餘同窗作做業都要翻書抄書上的例程再改就很不屑, 由於我作做業的時候歷來不打開書的。 考試的時候是開卷,我就很牛逼的連書都不帶嘩嘩嘩的寫完交卷,爽!後來在學算法設計,操做系統,編譯原理和計算機圖形學的時候,我基本都是把書上的僞代碼 實現出來,寫成完整的系統(如今回想當年花了3個星期實現一個pascal編譯器,真是太痛苦了,後來知道有lex和yacc,真是鬱悶了好久)。不過這 些東西到如今對我來言都是極大的資本。 其次,我還想在這個話題下多說一句: 不要爲了算法去專業算法。不少年輕人老是在我面前炫耀本身讀完了《算法導論》第幾卷,裏面某某算法設計多難,本身都看懂了。可是我絕對不建議任何年輕的程 序員去看這種書。緣由有二: 第一,這種書屬於(2)的範疇,須要瞭解,可是不須要去啃懂每一個算法,比如是新華字典,對每一箇中國人都很重要,可是那是工具書,沒人會去把整本啃完,沒有 意義;第二,作編程這行,變化太快,等印在紙上了,那些都已是過期的死東西了,等你啃完前人的骨頭了,你也差很少該做古了。