2009年10月5日 星期一

1.1.1 資料與結構化

杜林獎(Turing Award;相當於計算機科學的諾貝爾獎)得獎人Nicklaus Wirth大師曾於1975年出版一本名為Algorithms + Data Structures = Programs的著作,說明程式是由「演算法」與「資料結構」組成。
在1995年之前,上述名言可精確描述程式的內容,其中,演算法指的是程式的邏輯之處,也就是如何組織各種指令完成程式之目的,而資料結構則指的是將各種資料組織結構化後作為一個個體來使用。
在此階段,「資料結構」視為「資料」的結構,因此造就此一名詞。就如同現實物體的結構般,我們想要生產一架戰鬥機,首先必須了解戰鬥機的結構,想要生產一輛戰車,則必須了解戰車的結構。而戰鬥機與戰車都是一些實際存在於世界上的武器物體,因此,若有一門名為「武器結構」的課程,則該課程將會先介紹何謂戰鬥機、何謂戰車、何謂航空母艦等等,以及介紹這些武器的內部結構。更進一步者,還可能會介紹其下的改良品,例如隱形戰鬥機。
要理解什麼是武器是非常容易的,而想要理解資料結構的「資料」,似乎有些困難。請回顧您在C語言課程中是如何設計程式的,我們通常會在程式中,使用int,double,char等宣告一些資料項目,然後對這些資料項目進行運算以完成工作。這些資料項目是資料結構嗎?嚴格來說,並不是,因為它們沒有一個系統化的組織,通常是想到需要什麼資料項,就宣告該資料項(例如迴圈需要一個迴圈變數i,就宣告一個i整數變數),並沒有更高一層的意義。
不過有兩個特例,即「陣列」與「結構」。在C語言程式設計中,我們可以利用陣列來存放多個相同意義的資料,例如int Month[12];。每一個陣列元素代表一個月份的收入,所有的陣列元素合起來就是整年的收入。
更明顯者,則是C語言的結構(或稱結構體),C語言允許我們利用struct宣告一個結構體,組織各種不同的資料(struct關鍵字源自於英文的structure)。例如我們可能會宣告學生成績結構體,當中可包含學生姓名、學生學號、平均成績等。此時,我們可以將之視為「學生成績」資料的結構,但這種資料結構通用性不大,可能只應用於您所設計的程式,所以別人不需要理解。而在本書中,我們將介紹「堆疊」資料的結構、「佇列」資料的結構、「樹」資料的結構等等。這些種類的資料結構就常被使用在計算機科學的應用中,因此資訊相關科系的學生必須理解,以利於其他課程的教學及未來的應用。
假設我們已經將學生的成績存入我們宣告的結構體中,而現在要求以平均成績為準,遞減輸出各學生的資料時,我們就需要對此結構體進行排序,而排序有許多種方法,這些方法的細節就是「演算法」。換句話說,只有資料結構而無演算法,則程式無法達到目的,就如同現在收到一個任務,要求轟炸機前往甲地轟炸,則光有轟炸機並無法達到目的,還必須讓轟炸機起飛、前進抵達目的地、放下炸彈才能達到目的。而要讓轟炸機起飛有一定的操作順序,這些操作順序就是轟炸機起飛的演算法。

資料結構化與程式開發效率
沒有資料結構只有演算法是否能夠撰寫程式呢?當然還是可以的,不過開發程式時較無效率。撰寫程式的過程就如同堆積木般,因此,我們以「樂高」積木來作比喻。
假設我們想要以樂高完成一艘航空母艦,我們可以利用一塊塊的小型樂高積木慢慢堆積並完成航空母艦的外觀,而此時若想要在其甲板上放置『戰鬥機』,則可以同樣慢慢以樂高拼湊出戰鬥機的外觀(當中可能需要使用各種基本樂高積木,包含長條形、方形、甚至是輪胎),然後放到甲板上,不過這樣頗為費時。樂高公司為了方便玩家,後來直接推出了『戰鬥機』樂高積木,如此,我們只要購買多架的『戰鬥機』,然後放置到甲板上即可。
樂高公司推出的『戰鬥機』積木並非一體成型的,此『戰鬥機』積木事實上是結構化的樂高積木,因為它包含了多種基本的樂高積木。只不過當我們設計航空母艦時,會將這些『戰鬥機』視為一個個體來看待並使用。
在C語言的程式設計中,int,char,double等種類的資料變數就像是這些基本的樂高積木,而C語言的struct結構體可以將眾多不同型態的資料組織在一起成為一個個體,因此,我們可以將『戰鬥機』樂高積木視為struct plane結構體,事先建立,並且在需要時直接取用即可。由此可知,資料經由結構化之後,將有助於程式的設計。
1.1.2 資料與抽象化(下一篇)

沒有留言: