成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C#中Dictionary的內部實現剖析

開發(fā) 后端
了解Dictionary的開發(fā)人員都了解,和List相比,字典添加會慢,但是查找會比較快,那么Dictionary是如何實現的呢?

了解Dictionary的開發(fā)人員都了解,和List相比,字典添加會慢,但是查找會比較快,那么Dictionary是如何實現的呢?

Dictionary的構造

下面的代碼我看看Dictionary在構造時都做了什么:

private void Initialize(int capacity)
        {
            int prime = HashHelpers.GetPrime(capacity);
            this.buckets = new int[prime];
            for (int i = 0; i < this.buckets.Length; i++)
            {
                this.buckets[i] = -1;
            }
            this.entries = new Entry<TKey, TValue>[prime];
            this.freeList = -1;
        }

我們看到,Dictionary在構造的時候做了以下幾件事:

  1. 初始化一個this.buckets = new int[prime]

  2. 初始化一個this.entries = new Entry<TKey, TValue>[prime]

  3. Bucket和entries的容量都為大于字典容量的一個最小的質數

其中this.buckets主要用來進行Hash碰撞,this.entries用來存儲字典的內容,并且標識下一個元素的位置。

我們以Dictionary<int,string> 為例,來展示一下Dictionary如何添加元素:

首先,我們構造一個:

Dictionary<int, string> test = new Dictionary<int, string>(6);

初始化后:

添加元素時,集合內部Bucket和entries的變化

Test.Add(4,”4″)后:

根據Hash算法: 4.GetHashCode()%7= 4,因此碰撞到buckets中下標為4的槽上,此時由于Count為0,因此元素放在Entries中第0個元素上,添加后Count變?yōu)?

Test.Add(11,”11″)

根據Hash算法 11.GetHashCode()%7=4,因此再次碰撞到Buckets中下標為4的槽上,由于此槽上的值已經不為-1,此時Count=1,因此把這 個新加的元素放到entries中下標為1的數組中,并且讓Buckets槽指向下標為1的entries中,下標為1的entry之下下標為0的 entries。

Test.Add(18,”18″)

我們添加18,讓HashCode再次碰撞到Buckets中下標為4的槽上,這個時候新元素添加到count+1的位置,并且Bucket槽指向 新元素,新元素的Next指向Entries中下標為1的元素。此時你會發(fā)現所有hashcode相同的元素都形成了一個鏈表,如果元素碰撞次數越多,鏈 表越長。所花費的時間也相對較多。

 

Test.Add(19,”19″)

再次添加元素19,此時Hash碰撞到另外一個槽上,但是元素仍然添加到count+1的位置。

刪除元素時集合內部的變化

Test.Remove(4)

我們刪除元素時,通過一次碰撞,并且沿著鏈表尋找3次,找到key為4的元素所在的位置,刪除當前元素。并且把FreeList的位置指向當前刪除元素的位置,FreeCount置為1

Test.Remove(18)

刪除Key為18的元素,仍然通過一次碰撞,并且沿著鏈表尋找2次,找到當前元素,刪除當前元素,并且讓FreeList指向當前元素,當前元素的Next指向上一個FreeList元素。

此時你會發(fā)現FreeList指向了一個鏈表,鏈表里面不包含任何元素,FreeCount表示不包含元素的鏈表的長度。

Test.Add(20,”20″)

再添加一個元素,此時由于FreeList鏈表不為空,因此字典會優(yōu)先添加到FreeList鏈表所指向的位置,添加后FreeCount減1,FreeList鏈表長度變?yōu)?

總結:

通過以上試驗,我們可以發(fā)現Dictionary在添加,刪除元素按照如下方法進行:

  1. 通過Hash算法來碰撞到指定的Bucket上,碰撞到同一個Bucket槽上所有數據形成一個單鏈表

  2. 默認情況Entries槽中的數據按照添加順序排列

  3. 刪除的數據會形成一個FreeList的鏈表,添加數據的時候,優(yōu)先向FreeList鏈表中添加數據,FreeList為空則按照count依次排列

  4. 字典查詢及其的效率取決于碰撞的次數,這也解釋了為什么Dictionary的查找會很快。

好吧,熬了半宿,今天先寫到這了,如果看了有所收獲就幫忙頂一下,有問題歡迎拍磚。

責任編輯:王雪燕 來源: 獨上高樓
相關推薦

2009-09-02 13:36:58

C#實現多個接口

2024-03-12 10:25:14

C#Dictionary編程語言

2009-09-03 15:03:27

C#實現AOP微型框架

2009-09-10 17:37:01

C# get post

2009-08-28 15:38:49

C#實現斷點續(xù)傳

2015-04-01 14:34:37

C#dynamicDictionary性

2009-08-24 18:15:24

C# Dictiona

2009-09-01 16:29:03

QuickSort C

2009-08-27 17:14:36

C# Socket

2009-09-07 14:29:52

C# ServiceC

2010-08-26 10:41:45

C#內部類

2021-09-13 07:00:01

C# .NET 緩存

2009-08-27 17:51:34

C#匿名方法

2009-08-28 10:44:46

C#字符數組轉換

2009-09-03 16:58:49

C#內存管理

2009-09-18 10:00:17

C#數組操作

2009-08-31 17:26:32

C#異常處理

2009-09-02 18:14:33

C# WebClien

2009-09-11 11:09:36

C#引用類型

2009-09-01 11:04:59

C#調用擴展方法
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品久久一区 | 久久久久国产一区二区三区不卡 | 日韩精品视频一区二区三区 | 久久一区二区三区四区 | 黑人巨大精品欧美一区二区免费 | 午夜一区 | 99精品国自产在线观看 | 激情欧美一区二区三区中文字幕 | 久久久久国产精品免费免费搜索 | 污视频在线免费观看 | 精品久久网 | 国产精品毛片无码 | 久久综合狠狠综合久久 | 天堂一区二区三区 | 欧美久久久久久 | 亚洲欧美少妇 | 天天躁日日躁狠狠很躁 | 伊人网伊人 | 久久69精品久久久久久久电影好 | 青青久久 | 欧美视频免费在线 | 天天插天天操 | 在线超碰| 欧美成人激情 | 欧美aⅴ| 国产精品亚洲一区 | 国产精品亚洲精品久久 | 69亚洲精品 | 国产成人福利在线观看 | 中文字幕 国产精品 | 精品国产一二三区 | 国产日韩视频 | 久久久一区二区三区 | 影音先锋中文字幕在线观看 | 毛片免费观看视频 | 久久国产精品网站 | 久久久久免费观看 | 久久精品视频网站 | 女人精96xxx免费网站p | 国产一区黄色 | 日本亚洲精品 |