字典

字典算法

前言:字典是一種很是複雜的數據結構。這種數據結構容許按照某個鍵來訪問元素。字段也稱爲映射或者散列表。字典的主要的特徵是能根據鍵快速查找值。有能夠自由的添加和刪除元素。這有像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>)是用於無序的惟一項。 

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息