字典算法
前言:字典是一種很是複雜的數據結構。這種數據結構容許按照某個鍵來訪問元素。字段也稱爲映射或者散列表。字典的主要的特徵是能根據鍵快速查找值。有能夠自由的添加和刪除元素。這有像List<T>類。可是沒有在內存中移動後續元素的性能開銷。數組
下圖是字典的一個簡化表示。其中的employee-id(如B4711)是添加到字典中的鍵。鍵會轉換爲一個散列。利用散列建立一個數字。它將索引與值關聯起來。而後 索引包含一個到值的連接。該圖是作了簡化的處理。由於一個索引能夠關聯多個值。索引能夠存儲爲一個樹形結構。數據結構
.Net Framwork提供了幾個字典類,可使用的最主要的類是Dictionary<TKey,TValue>。函數
一.鍵的類型 性能
用做字典中的鍵的類型必須重寫Object類的GetHashCode()方法。只要字典類須要肯定元素的位置,就能夠調用GetHashCode()方法。GetHashCode()方法返回的int由字典用於計算在對應位置放置元素的索引。這裏不介紹這個算法。咱們只須要知道,它涉及素數,因此字典的容量是一個素數。GetHashCode()方法實現必須知足以下的要求:spa
1.1:相同的對象老是返回相同的值。code
1.2:不一樣的對象能夠返回相同的值。對象
1.3:它應執行的比較快,計算的開銷不大。blog
1.4:它不能拋出異常。排序
1.5:它應至少使用一個實例字段。
1.6:散列代碼值應平均分佈在int能夠存儲的整個數字範圍上。
1.7:散列代碼最好在對象的生存期中不發生變化。
二:字典的示例
static void Main(string[] args) { Dictionary<int, string> dic = new Dictionary<int, string>(); dic.Add(1, "張三"); dic.Add(2, "李四"); dic.Add(3, "王五"); //新值替代舊值 dic[1] = "新來的"; foreach (KeyValuePair<int,string> kv in dic) { Console.WriteLine("{0}---{1}",kv.Key,kv.Value); } Console.ReadKey(); }
三:有序字典
SortedDictionary<TKey,TValue>類是一個二叉搜索樹。其中的元素根據鍵來排序。該鍵類型必須實現IComparable<TKey>接口。若是鍵的類型不能排序,則還能夠建立一個實現了IComparer<TKey>接口的比較器。將比較器用做於有序字典的構造函數的一個參數。
SortDictionary<TKey,TValue>類和SortedList<TKey,TValue>類的功能相似。可是由於SortedList<TKey,TValue>實現爲一個基於數組的列表。而SortDictionary<TKey,TValue>類實現爲一個字典,全部他們有不一樣的特徵。
3.1:SortedList<TKey,TValue>類使用的內存比SortDictionary<TKey,TValue>類少。
3.2:SortDictionary<TKey,TValue>類的元素插入和刪除操做比較快。
3.3:在用已經排序好的數據填充集合時,如不須要修改容量。SortedList<TKey,TValue>類就比較快。
注意:SortedList<TKey,TValue> 類使用的內存比SortDictionary<TKey,TValue>類少。可是SortDictionary<TKey,TValue>類在插入和刪除未排序的數據時比較快。
四:性能
許多集合類都提供了相同的功能。例如:SortedList和SortedDictionary類的功能幾乎徹底相同的功能。可是,其性能上每每上有很大的區別。
以下圖表示:
總結:數組的大小是固定的。可是可使用列表做爲動態增加集合。隊列一先進先出的方式訪問元素。棧以先進後出的方式訪問元素。鏈表能夠快速的插入和刪除元素,可是搜索比較慢,經過鍵和值可使用字典。它的搜索和插入操做比較快,集(Hashset<T>)是用於無序的惟一項。