當前位置:成語大全網 - 書法字典 - Go地圖數據結構

Go地圖數據結構

Go地圖實現原理

Go的深度地圖使用和實現原理

go中的Map也是壹個hashmap,由壹個桶數組組成。每個存儲桶可以存儲幾個元素(默認為8個)。當元素多於8個時,hmap會使用overflow in extra指向壹個新的桶來擴展這個桶。

桶數組到哈希數組數據字節數組溢出鏈表

哈希沖突後的數據結構:

溢出就是溢出的意思。

加載因子用於指示哈希沖突的情況=鍵的數量/桶的數量。

哈希因子需要控制在合適的大小,超過閾值後需要重新哈希。

*哈希因子太小,表明空間利用率低。

*哈希因子過大,說明沖突嚴重,訪問效率低。

每個哈希表的實現對負載因子有不同的容忍度。當redis中的load factor為1時,會觸發rehash,因為redis的每個桶只能存儲壹個鍵值對。Go可以存儲8,裝載系數6.5;

4.1擴容的先決條件

為了保證訪問效率,當增加壹個新元素時,會檢查是否需要擴展,擴展其實就是空間換時間;

4.2增量擴容

在負載系數超過閾值後,建立壹個新桶,其長度是原來的兩倍,並將舊桶的數量逐漸移至新桶。

如果數據量大,會采用漸進式hash,每次訪問map都會觸發壹次重定位,每次兩個鍵值對,oldbuckets將在重定位完成後被刪除;

4.3收縮能力

通過連續刪除;鍵值對集中在少數存儲桶中;並且大部分溢出是空的;重組後;桶的數量將會減少;從而提高訪問效率。