另外一個一般索引集合是dictionary(字典)。Dictionary由一系列鍵/值對組成,叫做關聯。這種數據結構跟字典類似,當一個單詞為鍵時,單詞的解釋就是跟鍵對應的值。鍵是一個由值所對應的鍵生成的索引。因為這種索引設計,字典通常被叫做關聯數組,盡管索引並非一定是整數。我們將在第11章中討論imes New Roman">.Net Framework中的幾個字典類。
分層次集合
非線性集合被分為兩種類型:分層次集合和分組集合。分層次集合由一組不同級別的項目組成。某個級別上的項目可以包含低一個級別的子項目。
常見的分級集合是樹。樹型集合看上去象一個顛倒的樹,有一個數據元素做為樹的根,其它數元素是懸掛在樹根下面的葉子。樹的元素叫做結點,某一特定結點下的元素叫做這個結點的孩子。如圖1.6所示:
樹在幾個不同的領域都有應用。最現代的操作系統中的文件系統被設計為樹型集合,在一個根目錄的下面有其他的子目錄做為根的孩子。
二叉樹是一種特殊的樹型集合,它的每個節點的孩子不超過兩個。二叉樹可以成為二叉查找樹,它用於搜索大量數據時更加有效率。這是通過在節點中存放從這個節點到根的最短路徑來實現的。
另外一種樹的類型是堆,它的最小的數值在根節點上。根節點在進行刪除和插入操作時有可能被刪除。為了使最小值處於根節點上,從堆中進行刪除操作時往往導致堆重新組織它的數據。堆裡的數據經常被排序,叫堆排序。通過重復地刪除根節點和重新組織數據,在堆中存放的數據可以保持按順序排列。
我們將在第12章中討論幾種不同種類的樹。在非線性集合中的項不按順序進行排列的叫組。三個主要的組的種類是:sets,圖和網絡。
Set是一組無序的、沒有重復值的數據。例如一個班裡級的學生。同理,整數也是。Sets上的操作可以有合集和交集。如圖1.7所示。
圖是一組被線條連接的節點。圖用於模擬圖上的每個節點都要被訪問到的情形,有時需要貫穿圖時需要找到一條最短的路徑。圖可用於後勤調度系統,並被計算機科學家和數學家進行研究。您或許聽說過“推銷員旅行”問題。這是一個很特別的圖的問題,推銷員為了保證在預算內完成工作,需要設計一條最短的,訪問所有城市的旅行路線。如圖1.8所示:
這個問題是“NP-complete”問題的一個分支。這意味著大多數的這類問題是沒有最精確的解的。比如圖1.8所示的所有可能路徑為10的階乘等於362800。如果我們把城市擴大為100個,則需要計算100的階乘,這是無法忍受的,這時需要使用一個近似的解來做為替代。
網是圖的一種特殊類型,網的每條邊都帶權。權跟從一個節點移動到另一個節點所耗費的代價相關聯。圖1.9描述了一個城市網,在裡面,權表示城市(節點)之間的距離。
我們已經簡單浏覽了這本書將要講述的所有的集合類型。現在准備要真正地討論集合在C#中是如何被使用的。我們通過學習如何使用.Net Framework中的抽象類CollectionBase類去建立一個集合來開始這個旅程。
.Net Framework類庫並不包含用於存儲數據的泛型集合類,但可以使用抽象類CollectionBase去創建您自己的集合類。CollectionBash類使得開發人員可以定制集合類。它實現了創建一個集合類所必須實現的接口:ICollection and IEnumerable,做為集合類的一部份,開發人員不得不去實現它們。