這回真的是後記了,也就是到了這些文章結束的時候了。雖然還有排序和尋找兩大演算法系沒有講,但是對於“資料結構”而言,上面應該是全部了。並且這些文章加在一起已經很長了,每次開啟WORD來編輯,跳到末頁總是不那麼順暢,是到了結束的時候了。對於那兩大演算法系,我準備另外再開一個系列,姑且就叫做《資料結構學習(C++)續》吧。突然發現,在安排文章結構上不知不覺的受了《電腦編程藝術》的影響了。
我的參考書主要是三本,《資料結構(用物件導向方法與C++描述)》(殷人昆等),《資料結構(C語言版)》(嚴蔚敏、吳偉民),《資料結構演算法與應用-C++語言描述》(中譯名,詳細資料可查china-pub)。
能寫完這些文章,首先要感謝C++語言,如果讓我拿C來寫,沒準中途就放棄了。前不久還看到有人爭論資料結構用什麼語言描述最合適,有人還在堅持用C最好,按照他的看法,彙編沒準是最好的(有興趣可以看看《電腦編程藝術》是拿什麼語言寫的)。從ADT的思想來看,C是不合適的,因為C要把資料和資料上的操作封裝在一起非常的麻煩,並且只有利用檔案來組織這種關係,而對於初學者來說,多模組編譯連結本身就是一個很玄的事,當年學C語言的時候這部分都沒敢看。而C++的類能非常完美的表達ADT的思想,並且模板、重載、繼承能更清晰的表述資料結構之間的聯絡。關於C++在解決問題上比C的優勢,可以看看《C++沉思錄》,有非常令人信服的例子,當然,從運行效率來說,C要強於C++。
然而當選用了C++之後,有件事就非常尷尬了,就是STL。常用的資料結構、演算法都已經作為C++標準的一部分了,我就看到一本書是用STL來描述資料結構的(只看到了書名,沒看到內容)。前面的三部分,線性表在STL裡全部都有現成的(變長數組、鏈表、隊列、棧),二叉搜尋樹在SGI-STL裡有紅/黑樹狀結構的實現,只有表徵圖准庫沒有提供,但是圖最重要的是一堆演算法。排序、尋找在STL裡也有現成的。
這讓我想起了“程式員=民工”的論調,的確,現在的語言、開發工具在給程式員提供了便利的同時,也限制了程式員的思維,養成了他們的惰性。現在編程就是在Framework裡面改寫若干的函數,在我們感到這種方式的便利的同時,也越來越感到自己力量的渺小。也許人就是種奇怪的動物。
或許資料結構這門課程根本就不是讓你掌握那些鏈表、樹是如何?的。開設這門課第一個目的是讓你懂得“資料結構+演算法=程式”,第二個目的是培養資料抽象的能力。當這兩個目的達到的同時,你也就具備瞭解決現實未知問題的能力,遺憾的是,大多數連掌握已有的資料結構的目標都沒達到。出於這個原因,我總是建議你看看《電腦編程藝術》,這部有無數讚譽的巨著。最好不要買紙版的,弄個電子版就行了,紙版的恐怕會嚇得你不敢看,^_^。正如蓋茨說的,這本書很有趣,如果你不把它當成參考書,你一定會有新的體會。
所有的來源程式都已打包,MyDS是線性鏈式結構,MyTree是樹結構,Graph是圖結構。加上這系列的WORD文檔,打成一個zip包,初步計劃放到C++中國同盟FTP上,下面是論壇的網址http://www.cppcn.com/bbs/
要想學好資料結構,最好親自把所有的演算法完成一遍,從這個角度說,我的來源程式有負面作用。我的初衷是使那些照書調不出來的不會因為寫不出程式而影響了學習的信心,畢竟書上的錯漏在所難免,對自學的人和在照本宣科老師手下飽受煎熬的人來說,我的來源程式應該能起到預期的作用。
本系列到此結束,續篇再見吧。