二、
線性探測法雜湊表:用大小為
m的陣列儲存
n個鍵值對。 1
、特點: 1
)、m>n。2
)、需要依靠陣列中的空位解決碰撞衝突。
基於這種策略的所有方法統稱為開放位址雜湊表。
開放位址雜湊表中最簡單的方法叫做線性探測法:碰撞發生時,直接檢查雜湊表中的下乙個位置。 2
、線性探測會產生三種結果: 1
)、命中:該位置的鍵和被查詢的鍵相同; 2
)、未命中:該位置鍵為空(該位置沒有使用,故被查詢的鍵在雜湊中不存在) 3
)、繼續查詢:該位置鍵不為空,且與被查詢的鍵不同。 3
、查詢步驟: 1
)、用雜湊函式找到該鍵在陣列中的索引; 2
)、檢查其中的鍵和被查詢的鍵是否相同; 3
)、鍵不同,則索引遞增(到大陣列結尾時折回陣列開頭),繼續查詢。 4
)、終止查詢條件:找到該鍵或遇到乙個空元素。 4
、 與其將記憶體用作鍊錶,不如將記憶體作為雜湊的空元素。這些空元素可以作為查詢結束的標誌。 5
、刪除操作:
由於線性探測雜湊表搜尋遇到
key為
null
時就結束,因而刪除線性探測雜湊表中的乙個鍵時,不能將該鍵設定為
null
。如果設定為
null
,則在該位置之後的元素將無法被查詢。
python
的dict
型別就是使用開放位址雜湊表,它將每個(
key,
val)的組合成為乙個
entry
。其結構是:
[dictobject.h]
typedefstructpydictentry;
其中me_hash
字段儲存的是
me_key
的雜湊值,利用乙個字段記錄這個雜湊值可以避免每次查詢時都要重新計算一遍雜湊值。
在pydictobject
物件發生變化時,
entry
會在不同狀態間轉換。
entry
有三種狀態:
unused
態、active
態和dummy
態。當乙個
entry
的me_key
和me_value
都是null
時,entry
處於unused
態。unused
態表明目前該
entry
中並沒有儲存(
key,
value
)對,而且在此之前,也沒有儲存過它們。每乙個
entry
在初始化時都會處於這種狀態,而且只有在
unused
態下,entry
的me_key
欄位才會為
null。當
entry
中儲存了乙個(
key,
val)對時,
entry
便轉換到了
active
態。在active
態下,me_key
和me_value
都不能為
null。當
entry
中儲存的(
key,
value
)對被刪除後,
entry
的狀態不能直接從
active
態轉換為
unused
態,否則將導致衝突探測鏈的中斷。相反,
entry
中的me_key
將指向dummy
物件,entry
進入dummy
態,這就是
python
的「偽刪除」技術。當
python
沿著某條衝突鏈搜尋時,如果發現乙個
entry
處於dummy
態,說明目前該
entry
雖然是無效的,但是其後的
entry 6
、鍵簇:
線性探測的平均成本取決於元素插入陣列後聚集成的一組連續的條目,稱為鍵簇。當新
key的
hash
值與已經插入雜湊表中元素的
hash
值衝突時,線性探測要探測從該
hash
值向後組成的鍵簇的所有位置,因而,短小的鍵簇才能保證較高的效率。由於均勻性假設,陣列每個位置都有相同的可能被插入乙個新的鍵,因而長鍵簇更長的可能性比短鍵簇更大。 7
、調整陣列的大小:命題m
(此處只取其結論)表明:當雜湊表快滿時,需要探測的次數是巨大的,當雜湊表使用率小於
1/2時,探測的預計次數只在
1.5到
2.5之間。因而,在實際應用時應考慮動態調整雜湊表陣列的大小,確保陣列的使用率永遠都不會超過
1/2。
redis學習筆記二 雜湊
1 建立 hset object property val hset是賦值命令,object是要建立的物件,property是物件的屬性名稱,val是該屬性的值 hmset object property1 val1 property2 val2 使用hmset命令可以進行多個屬性賦值 2 查詢 h...
雜湊(二)雜湊桶
雜湊桶又被稱作開鏈法,開雜湊法。相比於閉雜湊法雜湊桶更為靈活直觀,存資料時不會浪費空間,開雜湊法存資料時由於避免雜湊衝突,總會有百分之三十的空間浪費,當儲存空間很大時將會造成大量的浪費。同時開雜湊法造成雜湊衝突時不便於查詢資料。所以我們有了雜湊結構中的雜湊桶。雜湊桶與開雜湊法一樣的是需要開一段陣列用...
Redis學習(二) 雜湊 有序集合
一 理論 1.雜湊命令 a.redis的雜湊可以儲存多個鍵值對之間的雜湊 b.雜湊值中的數字也可以進行自增或者自減操作 c.hset 在雜湊裡面關聯起給定的鍵值對 d.hget 獲取指定雜湊鍵的值 e.hgetall 獲取雜湊包含的所有鍵值對 f.hdel 如果給定鍵存在於雜湊裡面,那麼移除這個鍵 ...