資料結構學習(C++)——線性鏈式結構總結(代後記)【2】 (轉)

worldblog發表於2008-01-31
資料結構學習(C++)——線性鏈式結構總結(代後記)【2】 (轉)[@more@]

在開始寫這些文章之前,我曾經有個想法,能不能以單連結串列為基礎,完成所有的線性鏈式結構?實踐證明,是可以的,就像你看到的這樣。我做這個嘗試的起因是,看不慣現在教科書凌亂的結構:羅列了一大堆ADT或者是templat class,好像這些都要你去記似的。殊不知,只有提取共性,突出個性,才能更明顯的表現出各種資料結構的差異,顯示資料結構的進化發展的過程,看出變化的內在需求。借用《C++沉思錄》作者的一句話,“避免重複”。在以後的應用中,你可能需要單獨的寫出一個class——打個比方,為了實現棧,你沒有必要先寫一個線性表,然後再繼承得到棧;但假如你已經有了一個線性表了,你還需要另起爐灶再重寫一個棧嗎?對於一本書來說,本來就是假定讀者在看後面的章節的時候,已經對前面的章節有所瞭解;即使象《C++沉思錄》這樣的從以前發表在雜誌上的文章整理出的書,也能看到循序漸進的影子。如果在後面的章節又把前面的東西重複一遍,我只能認為他是在騙稿費。

我把以前的程式碼總結一下,列表如下(因為我畫不好圖):

單連結串列(List

多項式節點

節點

修改部分操作

新增向前指標域

限制操作

多項式

表示式

迴圈連結串列

雙向連結串列

棧和佇列

我們從單連結串列出發,透過對應的變化,得到了綠色的一行。突然之間我覺得自己很可悲,看了100多頁書,最後得到竟然只是這麼一個表。不管怎麼說,這也是我看了這麼多頁書的結晶,讓我們看看能從這表裡得到什麼。

首先,單連結串列是一個容器,他是為了存取資料而存在的。如果裡面存的是多項式的節點,那麼他就是一個多項式;如果裡面存的是表示式節點,那麼他就是一個表示式。這讓我想起了以前曾經困擾我的語義問題:多項式究竟是一個存了多項式節點的單連結串列呢,還是包含了一個存了多項式節點的單連結串列?現在我的想法是,這並不重要,怎麼理解都行。

其次,迴圈連結串列、雙向連結串列、棧和佇列也是容器,只是具體的操作實現或者對外的行為和單連結串列有所差別。但是內在的存取機制是相同的,或者還有更多的地方相同,我們應當最大限度的利用這些相同之處。

上面的提法好像很無聊——他們當然是容器,還用你小子廢話嗎——請注意我下面的問題:陣列是容器嗎?你做過僅針對陣列裡的元素操作的練習嗎?你做過陣列應用的練習嗎?現在請你把陣列換成單連結串列,檢查一下有沒有答案變化了。這真是對大學教育的一個諷刺,我們學完單連結串列,竟然只會插入刪除節點,合併兩個連結串列,將一個單連結串列逆序,等等;我們居然不知道為什麼要學這個,怎樣用他。最終的結果就是,當我們走向工作崗位後,又如獲至寶的捧起這本書,然後用語重心長的口氣對學弟們說:“資料結構很重要,你一定要好好學”。

或許你說這沒什麼,大學裡許多的功課不都是這樣的嗎——臨到用時才發現重要。是的,習慣成自然,但是習慣並不都是好的,我們也並不是一定要“書到用時方恨少”,然而,這並不只是取決於我們的年少“不”輕狂。讓我們回想一下我們的教科書,一章一節,井井有條,絲絲入扣,當然這是寫的好的,其他的就是追求這個目標,畫虎不成反類犬。前面的章節為後面的章節鋪墊,邏輯推理性極強,請不要認為我這是誇那些書,你不覺得和看那些論文一個感覺?你所得到的僅僅是“是什麼”,“我說的是有道理的”;你能看到“為什麼有這些”嗎?

對於論文,我不能要求作者給出他的思維過程,而他寫論文的目的也僅僅是為了告訴別人:“我研究出這個了,你們看,我說的是有道理的”,並且,看他的論文的人也有和他相當的知識構成,我想,現在看我文章的人也不會對哲學論文感興趣(即使你可能會看黑格爾的書,你也決不會對現在那群玄人的夢囈感興趣;正如那群人雖然用寫文章,你想要跟他們說管理,他們也會把耳朵塞起來)。

對於教科書,僅僅用論文的要求來要求,顯然是太低了。首先,書所面對的讀者都是對這門課程一無所知的人——你假設和論文一樣,都有一個基本認識了,我還學你這門課幹什麼,我直接看最新的論文好不好。其次,寫作目的是讓讀者瞭解這門學科,認識這門學科的規律,最終能夠運用這門學科,甚至有所發展。正如學寫字先描紅,不先模仿,怎麼創新呢?如果連現有的結論和成果都不知道來龍去脈,談何再有新的突破呢?

教科書不是論文,當然不能象寫論文那樣來寫,但現在國內的作者好像樂此不疲,就好像不寫得層次嚴謹就不能體現自己功力紮實似的。這也是為什麼越來越多的人選用國外的教科書,即使他們的英文並不好——當然,不少人是藉此學習英文。

正如哲學上講的,只有遵從人類的認知規律,人們才能更容易的認識新事物。但論文的寫作,恰恰是對這個過程的逆向總結——他是和人類的認識過程相反的。而教科書為了達到他傳授知識的目的,就必須遵從人的認知規律,而決不是象論文那樣反其道而行之。

這樣看來,資料結構的書決不應該象現在這樣來寫。從資料結構的發展來看,他是應問題的需要而出現的,併為解決問題而服務。換而言之,對於資料結構的講解,應當把重點放在演算法上面,在各種典型問題上提出新的資料結構;最終得出的認識是,為了特定的問題和演算法,而選用特定的資料結構;為了改進演算法而改進資料結構;為了新的問題和演算法而創造出新的資料結構。而決不是象現在這樣能得出的認識:我學了資料結構能解決什麼問題。乍一看,好像沒什麼差別,但現在這個認識,你不是資料結構的主人,你只是資料結構的奴隸。

最後舉個諷刺性的例子。我最初知道資料結構的時候是高中,那時我只會BASIC,資料結構的概念源自一本名叫《中小學生電腦操作與設計》的書。那本書使用的是GWBASIC,實現了大學教科書裡的資料結構:連結串列、棧、樹、圖。來看看他的目錄:八皇后、迷宮、騎馬遊世界、連結串列和約瑟夫、樹和揹包、一筆畫、追捕罪犯、四種顏色就夠了。——我們甚至在中小學時,用BASIC就可以清楚的有趣的講解資料結構;現在居然讓大學生學完之後,甚至連中小學生的水平都不如。我不知道你怎麼看,但我覺得,至少,我們的教科書應該改變一下寫作的風格了。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-998919/,如需轉載,請註明出處,否則將追究法律責任。

相關文章