欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一文了解go hashmap(數(shù)據(jù)結(jié)構(gòu)、實(shí)現(xiàn)原理、讀寫操作)

454398 ? 來源:itpub技術(shù)棧 ? 作者:itpub技術(shù)棧 ? 2020-09-30 16:19 ? 次閱讀

這是看著別人的文章結(jié)合源碼來整理的自己一套理解

理解 Golang 哈希表 Map 的原理?draveness.me

通過數(shù)據(jù)結(jié)構(gòu)、實(shí)現(xiàn)原理、讀寫操作來了解go hashmap

數(shù)據(jù)結(jié)構(gòu)

hash有2個(gè)關(guān)鍵數(shù)據(jù)結(jié)構(gòu):hmapbmap

hmap:runtime/map.go

type hmap struct {
    count       int 
    flags       uint8
    B           uint8  
    noverflow   uint16 
    hash0       uint32 
    buckets     unsafe.Pointer 
    oldbuckets  unsafe.Pointer
    nevacuate   uintptr
    extra       *mapextra 
}

count元素?cái)?shù)量

B2^B個(gè)buckets桶

noverflowbuckets溢出桶的數(shù)量,近似值

buckets桶

oldbuckets擴(kuò)容時(shí)指向原buckets桶

bmap:runtime/map.gocmd/compile/internal/gc/reflect.go

type bmap struct {
    topbits     [8]uint8
    keys        [8]keytype
    elems       [8]elemtype
    pad         uintptr
    overflow    uintptr
}

哈希表中桶的真正結(jié)構(gòu)其實(shí)是在編譯期間運(yùn)行的函數(shù)bmap中被『動(dòng)態(tài)』創(chuàng)建的, 代碼在cmd/compile/internal/gc/reflect.go

topbits存儲(chǔ)hash值的高8位,通過比對(duì)高8位減少鍵值對(duì)訪問次數(shù)以提高性能

keys/elems數(shù)組

pad內(nèi)存對(duì)齊

overflow溢出桶,map存儲(chǔ)數(shù)據(jù)過多時(shí)使用

實(shí)現(xiàn)原理

時(shí)間復(fù)雜度: O(1)

hash函數(shù)和hash沖突解決方法

hash函數(shù)

實(shí)現(xiàn)哈希表的關(guān)鍵點(diǎn)在于如何選擇哈希函數(shù),哈希函數(shù)的選擇在很大程度上能夠決定哈希表的讀寫性能,在理想情況下,哈希函數(shù)應(yīng)該能夠?qū)⒉煌I映射到不同的索引上,這要求哈希函數(shù)輸出范圍大于輸入范圍,但是由于鍵的數(shù)量會(huì)遠(yuǎn)遠(yuǎn)大于映射的范圍,所以在實(shí)際使用時(shí),這個(gè)理想的結(jié)果是不可能實(shí)現(xiàn)的。

hash沖突

開放尋址法:對(duì)數(shù)組中的元素依次比較鍵值對(duì)是否存在于數(shù)組

拉鏈法: 使用數(shù)組加上鏈表

讀寫操作

計(jì)算出key的hash

用最后的“B”位來確定在哪個(gè)桶(“B”就是前面說的那個(gè),B為4,就有16個(gè)桶,0101用十進(jìn)制表示為5,所以在5號(hào)桶)

根據(jù)key的前8位快速確定是在哪個(gè)格子(額外說明一下,在bmap中存放了每個(gè)key對(duì)應(yīng)的tophash,是key的前8位)

最終還是需要比對(duì)key完整的hash是否匹配,如果匹配則獲取對(duì)應(yīng)value

如果都沒有找到,就去下一個(gè)overflow找

通過key的后“B”位確定是哪一個(gè)桶

通過key的前8位快速確定是否已經(jīng)存在

最終確定存放位置,如果8個(gè)格子已經(jīng)滿了,沒地方放了,那么就重新創(chuàng)建一個(gè)bmap作為溢出桶連接在overflow

擴(kuò)容

條件:

裝載因子大于6.5

溢出桶 大于15個(gè)

func mapassign(t *maptype, h *hmap, key unsafe.Pointer) unsafe.Pointer {
    ...
    if !h.growing() && (overLoadFactor(h.count+1, h.B) || tooManyOverflowBuckets(h.noverflow, h.B)) {
        hashGrow(t, h)
        goto again
    }
    ...
}

方式:

等量擴(kuò)容

翻倍擴(kuò)容
編輯:hfy

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)結(jié)構(gòu)

    關(guān)注

    3

    文章

    573

    瀏覽量

    40236
  • 讀寫操作
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

    7139
  • hashmap
    +關(guān)注

    關(guān)注

    0

    文章

    14

    瀏覽量

    2308
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    數(shù)據(jù)結(jié)構(gòu)概述及線性表

    。    “數(shù)據(jù)結(jié)構(gòu)”是計(jì)算機(jī)專業(yè)的門核心課程,是“編譯原理”、“操作系統(tǒng)”、“數(shù)據(jù)庫”等課程的基礎(chǔ),也是設(shè)計(jì)和實(shí)現(xiàn)
    發(fā)表于 12-05 21:20

    數(shù)據(jù)結(jié)構(gòu)

    1.數(shù)據(jù)結(jié)構(gòu)的概念 所謂數(shù)據(jù)結(jié)構(gòu)是指由某一數(shù)據(jù)對(duì)象及該對(duì)象中所有數(shù)據(jù)成員之間的關(guān)系組成的集合。成員之間的關(guān)系有很多種,最常見的是前后件關(guān)系。 2.
    發(fā)表于 03-04 14:13

    常見的數(shù)據(jù)結(jié)構(gòu)

    順序表結(jié)構(gòu)的底層實(shí)現(xiàn)借助的就是數(shù)組,因此對(duì)于初學(xué)者來說,可以把順序表完全等價(jià)為數(shù)組,但實(shí)則不是這樣。數(shù)據(jù)結(jié)構(gòu)是研究數(shù)據(jù)存儲(chǔ)方式的門學(xué)科,它
    發(fā)表于 05-10 07:58

    數(shù)據(jù)結(jié)構(gòu)鏈表的基本操作

    嵌入式學(xué)習(xí)基礎(chǔ)-數(shù)據(jù)結(jié)構(gòu)鏈表的基本操作鏈表節(jié)點(diǎn)采用結(jié)構(gòu)體的方式進(jìn)行定義,下面是最基礎(chǔ)的定義只有個(gè)數(shù)據(jù)data,*pNext用于指向下
    發(fā)表于 12-22 08:05

    GPIB命令的數(shù)據(jù)結(jié)構(gòu)

    針對(duì)GPIB命令的結(jié)構(gòu),提出種存儲(chǔ)GPIB命令的數(shù)據(jù)結(jié)構(gòu)。根據(jù)GPIB命令的層次關(guān)系的特點(diǎn),選擇數(shù)據(jù)結(jié)構(gòu)中“樹”的概念來存儲(chǔ)GPIB命令結(jié)點(diǎn);并考慮程序
    發(fā)表于 02-10 16:20 ?70次下載

    GPIB命令的數(shù)據(jù)結(jié)構(gòu)

    針對(duì)GPIB命令的結(jié)構(gòu),提出種存儲(chǔ)GPIB命令的數(shù)據(jù)結(jié)構(gòu)。根據(jù)GPIB命令的層次關(guān)系的特點(diǎn),選擇數(shù)據(jù)結(jié)構(gòu)中“樹”的概念來存儲(chǔ)GPIB命令結(jié)點(diǎn);并考慮程序
    發(fā)表于 01-04 10:13 ?0次下載

    數(shù)據(jù)結(jié)構(gòu)是什么_數(shù)據(jù)結(jié)構(gòu)有什么用

    數(shù)據(jù)結(jié)構(gòu)是計(jì)算機(jī)存儲(chǔ)、組織數(shù)據(jù)的方式。數(shù)據(jù)結(jié)構(gòu)是指相互之間存在種或多種特定關(guān)系的數(shù)據(jù)元素的集合。通常情況下,精心選擇的
    發(fā)表于 11-17 14:45 ?1.6w次閱讀
    <b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>是什么_<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>有什么用

    什么是數(shù)據(jù)結(jié)構(gòu)?為什么要學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)?數(shù)據(jù)結(jié)構(gòu)的應(yīng)用實(shí)例分析

    本文檔的主要內(nèi)容詳細(xì)介紹的是什么是數(shù)據(jù)結(jié)構(gòu)?為什么要學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)?數(shù)據(jù)結(jié)構(gòu)的應(yīng)用實(shí)例分析包括了:數(shù)據(jù)結(jié)構(gòu)在串口通信當(dāng)中的應(yīng)用,數(shù)據(jù)結(jié)構(gòu)在按鍵
    發(fā)表于 09-26 15:45 ?14次下載
    什么是<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>?為什么要學(xué)習(xí)<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>?<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>的應(yīng)用實(shí)例分析

    算法和數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)知識(shí)分享(上)

    有哪些常見的數(shù)據(jù)結(jié)構(gòu)?基本操作是什么?常見的排序算法是如何實(shí)現(xiàn)的?各有什么優(yōu)缺點(diǎn)?本文簡要分享算法基礎(chǔ)、常見的數(shù)據(jù)結(jié)構(gòu)以及排序算法。
    的頭像 發(fā)表于 04-06 16:48 ?843次閱讀
    算法和<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>基礎(chǔ)知識(shí)分享(上)

    算法和數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)知識(shí)分享(中)

    有哪些常見的數(shù)據(jù)結(jié)構(gòu)?基本操作是什么?常見的排序算法是如何實(shí)現(xiàn)的?各有什么優(yōu)缺點(diǎn)?本文簡要分享算法基礎(chǔ)、常見的數(shù)據(jù)結(jié)構(gòu)以及排序算法。
    的頭像 發(fā)表于 04-06 16:48 ?649次閱讀
    算法和<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>基礎(chǔ)知識(shí)分享(中)

    算法和數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)知識(shí)分享(下)

    有哪些常見的數(shù)據(jù)結(jié)構(gòu)?基本操作是什么?常見的排序算法是如何實(shí)現(xiàn)的?各有什么優(yōu)缺點(diǎn)?本文簡要分享算法基礎(chǔ)、常見的數(shù)據(jù)結(jié)構(gòu)以及排序算法。
    的頭像 發(fā)表于 04-06 16:48 ?798次閱讀
    算法和<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>基礎(chǔ)知識(shí)分享(下)

    NetApp的數(shù)據(jù)結(jié)構(gòu)是如何演變的

    統(tǒng)一數(shù)據(jù)跨分布式資源進(jìn)行管理,以實(shí)現(xiàn)數(shù)據(jù)移動(dòng)的致性和控制,安全、可見性、保護(hù)和訪問。 本文定義了數(shù)據(jù)結(jié)構(gòu)及其體系
    發(fā)表于 08-25 17:15 ?0次下載
    NetApp的<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>是如何演變的

    JDK中java.util.HashSet 類的介紹

    的效率。了解 HashMap 的具體實(shí)現(xiàn)后,我們?cè)賮斫榻B由 HashMap 作為底層數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)
    的頭像 發(fā)表于 10-09 10:50 ?652次閱讀
    JDK中java.util.HashSet 類的介紹

    epoll的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)

    、epoll的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu) 在開始研究源代碼之前,我們先看下 epoll 中使用的數(shù)據(jù)結(jié)構(gòu),分別是 eventpoll、epitem 和 eppoll_entry。 1、event
    的頭像 發(fā)表于 11-10 10:20 ?849次閱讀
    epoll的基礎(chǔ)<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>

    redis數(shù)據(jù)結(jié)構(gòu)的底層實(shí)現(xiàn)

    Redis是種內(nèi)存鍵值數(shù)據(jù)庫,常用于緩存、消息隊(duì)列、實(shí)時(shí)數(shù)據(jù)分析等場(chǎng)景。它的高性能得益于其精心設(shè)計(jì)的數(shù)據(jù)結(jié)構(gòu)和底層實(shí)現(xiàn)。本文將詳細(xì)介紹Re
    的頭像 發(fā)表于 12-05 10:14 ?669次閱讀