日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
C#中Dictionary的內(nèi)部實(shí)現(xiàn)剖析

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

公司主營業(yè)務(wù):成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)公司推出巴東免費(fèi)做網(wǎng)站回饋大家。

Dictionary的構(gòu)造

下面的代碼我看看Dictionary在構(gòu)造時(shí)都做了什么:

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[prime];
            this.freeList = -1;
        }

我們看到,Dictionary在構(gòu)造的時(shí)候做了以下幾件事:

  1. 初始化一個(gè)this.buckets = new int[prime]

  2. 初始化一個(gè)this.entries = new Entry[prime]

  3. Bucket和entries的容量都為大于字典容量的一個(gè)最小的質(zhì)數(shù)

其中this.buckets主要用來進(jìn)行Hash碰撞,this.entries用來存儲(chǔ)字典的內(nèi)容,并且標(biāo)識(shí)下一個(gè)元素的位置。

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

首先,我們構(gòu)造一個(gè):

Dictionary test = new Dictionary(6);

初始化后:

添加元素時(shí),集合內(nèi)部Bucket和entries的變化

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

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

Test.Add(11,”11″)

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

Test.Add(18,”18″)

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

Test.Add(19,”19″)

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

刪除元素時(shí)集合內(nèi)部的變化

Test.Remove(4)

我們刪除元素時(shí),通過一次碰撞,并且沿著鏈表尋找3次,找到key為4的元素所在的位置,刪除當(dāng)前元素。并且把FreeList的位置指向當(dāng)前刪除元素的位置,F(xiàn)reeCount置為1

Test.Remove(18)

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

此時(shí)你會(huì)發(fā)現(xiàn)FreeList指向了一個(gè)鏈表,鏈表里面不包含任何元素,F(xiàn)reeCount表示不包含元素的鏈表的長度。

Test.Add(20,”20″)

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

總結(jié):

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

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

  2. 默認(rèn)情況Entries槽中的數(shù)據(jù)按照添加順序排列

  3. 刪除的數(shù)據(jù)會(huì)形成一個(gè)FreeList的鏈表,添加數(shù)據(jù)的時(shí)候,優(yōu)先向FreeList鏈表中添加數(shù)據(jù),F(xiàn)reeList為空則按照count依次排列

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

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


網(wǎng)頁題目:C#中Dictionary的內(nèi)部實(shí)現(xiàn)剖析
分享路徑:http://www.5511xx.com/article/cddeisj.html