兩個陣列
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各 不相同。有關字典的操作有 插入具有給定關鍵字值的元素。在字典中尋找具有給定關鍵字值的元素。刪除具有給定關鍵字值的元素。隨機訪問 若僅按照乙個字典元素本身的關鍵字來訪問該元素。順序訪問 指按照關...