說來慚愧,這本書陸續讀了很多很多次次了,卻從來沒有讀完過。在學校的時候,多次下決心讀完,2011年也有一次,這次總算把這本書看完了(從2011年11月開始的,雖然仍有很多頁是翻過去的)。
這本書實在是一本特别枯燥又不知道有沒有用的書,我多次強迫自己,卻始終沒有讀完。在學校上這門課時,我實在覺得這門課沒有什麼意義,幾乎沒有認真上過一次。 讀完此書,我得到了什麼呢?我覺得,讀書對我們來說,主要是給我們啟發,至于書中具體的内容,時間長了,你也未必記得那麼清楚。 事實上,幾乎所有的語言和架構,都會為我們提供了豐富的資料結構(棧,隊列,線性表等等),我們在絕大部分開發中幾乎不用自己寫(比如做網遊伺服器,為了優化效率,還是會自己寫的)。我建議每個程式員,如果有多餘的時間,都應該研究一下資料結構,研究一下天天都在使用的線性表,棧等是怎麼實作的。普通的司機,是沒有什麼必要了解汽車的構造的,不了解,仍然可以把車開的很好。對賽車手卻不是如此,了解汽車的底層構造,對他們一些極緻的發揮,是有作用的。普通司機,有時間,也應該了解一下,雖然對開車技術提高未必有多大,但是反正玩遊戲,看電影也沒什麼意思。當然了,沒有特殊情況,不論是普通司機還是賽車手,在已經有車的情況下,不要自己去造輪子,造發動機,然後把它們組裝成自己要開的車。 我常聽一些進階語言程式員說,資料結構沒什麼用。我的觀點是,在實際開發中,資料結構即沒有進階語言程式員說的那麼沒用,也沒一些低級語言程式員說的那麼有用。所謂小馬過河,什麼适合自己,隻有試了才知道。但是基本的實作原理,還是要知道一些的,比如當知道vector是順序,list是連結時,就知道在哪些情況下選用哪個結構,而不是道聽途說了。 我常覺得,任何一種技能,任何一種經曆,都是一筆财富,當時不知道有什麼作用,過後了可能發現有用。雖然資料結構在實際運用中,對某些甚至說大部分程式員沒有太大作用,但是在另外一個層面,它提高着一個程式員的素質。總是給出幾種方法,讓你明白,任何問題都有很多種解。于是在日常的開發中,遇到 問題,也會想到換另外一個思想,而不是用最簡單直接的方法(比如周遊)。這一點我深有體會,這一年的工作中,遇到問題,我開始會停下來想一想了。 資料結構和算法的研究,為我打開了另外一扇門。雖然這個啟發并非來自知識本身,卻更新了我的思維方式。它變得我不像以前那麼“懶”了,我相信一切問題都有另外幾種方法解決,我也相信我目前最終确定的方法,可以優化。一個簡單的道理,我卻讀了一本書才明白。如果你象我一樣,明白這個道理,這本書就算是沒有白讀吧,這也是我讀罷此書最大的一個收獲。至于具體的資料結構實作,已經有好多記不起來了。 另一方面,資料結構和算法中的幾中方法,又往往是不完美的,提高了效率失了記憶體,提了記憶體失了效率,幾乎永遠隻能選一個适合具體問題或者折中的方法。 人生的得失,不也是如此嗎。有了這個想法,生活中,就會更坦然一些。 在以前,我可能不會了解資料結構的抽象有多大的意義。比如狼,白菜,羊,農夫過河的例子,就不知道用什麼樣的資料來抽象。漸漸發現,資料的抽象,對程式員來說,意義重大。尤其作為一個天天看不到界面的伺服器程式員,更是如此。比如在玩家看來非常炫酷的裝備,在程式員眼中,隻是幾個int和int數組罷了。資料結構設計的合理,往往事半功倍。比如我把遊戲中背包的結構設計成一維資料,而不是二維數組,當需要改每行有多少列格子時,都是前台問題,與背景毫無關系。比如人物原有五套裝備,現在要加一個時裝欄,如果我再加一個時裝的結構,工作量就很大。我選擇了“拉長”原有的普通裝備欄。資料的第5(從0開始)個元素,就是時裝的第一件。當然這隻是簡單的例子,因為最近有這方面的改動。 最後一個收獲,就是增強了信心吧。當人類遇到自己完全不熟悉的東西時,就會有些恐懼,而掌握了那個你不熟悉的東西的人,就會成為偶象。資料結構隻有兩種,線性和連結,後面複雜的資料結構,都是由此組合而成的。當我聽到某人說在一個子產品中用了八叉樹,我隻是淡淡的一笑。
轉載于:https://www.cnblogs.com/fox7nights/archive/2012/02/19/2358691.html