字典雜湊表的實現原理 字典雜湊表的實現原理

2021-10-19 06:15:06 字數 2274 閱讀 4938

兩個陣列

bucket陣列:儲存key的hash桶,桶指的是把hashcode分配到一定的範圍內

entry陣列:用來儲存實現的值,它是乙個單向鍊錶,bucket總是儲存鍊錶的最後乙個元素

實現方式

通過雜湊桶來實現的k/v儲存,通過key的hash碼,再進行桶計算,生成乙個在某個範圍內的值,這就是桶的索引號,再把值儲存到桶對應的entry裡,桶bucket儲存了entry的索引號,通過乙個bucket可以直接或者間接找到乙個entry.

直接找到:當hash沒有衝突時,它儲存的就是真實的entry索引

間接找到:當hash出現衝突(碰撞)時,它就會把當前最後的索引賦值這個新entry.next,而新的entry的索引就是現在的bucket的值。

實現流程圖

graph lr

key-->hashcode

hashcode-->bucket桶運算

bucket桶運算-->得到bucket索引

得到bucket索引-->bucket值就是entry的索引

bucket值就是entry的索引-->x("↓")

graph lr

bucket值就是entry的索引-->衝突解決

衝突解決-->單向鍊錶next指向上乙個值

單向鍊錶next指向上乙個值-->單身鍊錶查詢

單身鍊錶查詢-->返回結果

陣列長度為素數

hash桶數全部使用的是質數,因為我們在hash的定義中,hash函式使用的是標準的求模函式,因此這樣定義桶數有利於元素各個桶之間的均勻分布和減少hash相同值的碰撞概率。

例如:舉乙個有點極端的例子,假設我們的元素全是偶數1,4,6,8,10,12,14,1,6,18,20,22

如果我們使用4個桶:

0: 4,8,12,16.20

1:2:6,10,14,18,22

3:很明顯看出有的桶有很多元素,但是有的桶是空桶,如果我們改為使用3個桶:

0: 6,12,18

1:4,10,16,22

2:2,8,14,20

模擬乙個字典的實現

@getter

@setter

class kvpair ;

// 桶陣列

private int buckets;// 最新的entry的索引號,

// 真實的資料

private kvpair entry; // entry根據next形成乙個單鏈表

private int count = 0; // 當前entries的數量

public mokihashmap() else {

entry[count].setnext(buckets[index]);

entry[count].sethashcode(index);

entry[count].setkey(key);

entry[count].setvalue(value);

buckets[index] = count;

count = count + 1;

public t find(k key) {

int entryindex = buckets[gethashbucketindex(key)];

while (entry[entryindex].getnext() > -1) {

if (entry[entryindex].getkey().equals(key)

&& entry[entryindex].gethashcode() == gethashbucketindex(key)) {

return entry[entryindex].getvalue();

entryindex = entry[entryindex].getnext();

return null;

public class kvtest {

@test

public void testdic() {

mokihashmap dic = new mokihashmap<>();

dic.add("ok", "1");

dic.add("zzl", "2");

dic.add("lr", "3");

dic.add("dd", "1");

dic.add("a", "b");

dic.add("b", "c");

dic.add("d", "e");

dic.add("e", "f");

system.out.println("dic find:" + dic.find("a"));

字典雜湊表的實現原理 Redis雜湊表的設計與實現

今天要介紹的資料結構,是redis中的雜湊表,這種資料結構是redis中非常重要的一種資料型別,可以方便的處理很多複雜場景的業務需求。雜湊表的結構定義在 dict.h 檔案中,我們抽取 檢視一下 如圖所示,雜湊表是乙個結構體型別,包含四個成員屬性 由上圖我們已經知道,雜湊表的定義中包含乙個table...

字典 與雜湊表 雜湊

python 用雜湊表來實現 dict。雜湊表其實是乙個稀疏陣列 總是有空白元素的陣列稱為稀疏陣列 在一般書中,雜湊表裡的單元通常叫做表元 bucket 在 dict 的雜湊表當中,每個鍵值對都占用乙個表元,每個表元都有兩個部分,乙個是對鍵的引用,乙個是對值的引用。因為每個表元的大小一致,所以可以通...

字典與雜湊表

一 字典 字典 dictionary 是一些元素的集合。每個元素有乙個稱作key 的域,不同元素的key各 不相同。有關字典的操作有 插入具有給定關鍵字值的元素。在字典中尋找具有給定關鍵字值的元素。刪除具有給定關鍵字值的元素。隨機訪問 若僅按照乙個字典元素本身的關鍵字來訪問該元素。順序訪問 指按照關...