雜湊函式把乙個無窮大的輸入集合對映到乙個有限大小的輸出集合。不同的關鍵字可能會被對映到同乙個陣列下標,如此一來就導致了雜湊衝突。雜湊表必須實現解決衝突的方法。
我們的雜湊表將使用開放位址法和再雜湊法。在桶索引衝突後,再雜湊法會使用兩個雜湊函式來計算鍵值對將要儲存的桶索引值。
有關其他雜湊衝突的解決方法,請檢視附錄。
索引i
衝突後應該使用的新的索引位置根據下面的函式給出:
index = hash_a(string) + i * hash_b(string) % num_buckets
我們看到,如果沒有雜湊衝突的發生,i=0。此時,桶索引是字串的hash_a
值。如果發生了衝突,索引將由hash_b
進行調整。
有種可能是,hash_b
返回了0,導致i*hash_b(string)%num_buckets
也返回了0。這會使得雜湊表不停的向同乙個桶中插入鍵值對。我們可以通過對第二個雜湊的結果加一來避免這種情況,以確保第二個項的結果不會是0。
index = (hash_a(string) + i * (hash_b(string) + 1)) % num_buckets
具體實現
// hash_table.c
static
intht_get_hash
(const
char
* s,
const
int num_buckets,
const
int attempt
)
教你從零開始寫乙個雜湊表–雜湊函式
教你從零開始寫乙個雜湊表–介面
教你從零開始寫乙個雜湊表 雜湊函式
在這一節,我們來編寫雜湊函式。我們選擇的雜湊函式應該具有 以下特性 我們使用的是常見的字串雜湊函式,偽 的表達如下 function hash string,a,num buckets hash 0 string len length string for i 0,1,string len hash...
教你從零開始寫乙個雜湊表 導讀
雜湊表是乙個可以提供快速實現關聯陣列api的資料結構。跟 雜湊表 有關的一些術語也許有些讓人產生困惑,因此我在下文列了一些摘要。雜湊表由一系列的桶組成,每乙個桶儲存乙個鍵值對。為了找到存放鍵值對的桶,關鍵字要傳遞給雜湊函式。雜湊函式返回乙個指明桶陣列下標的整數。當我們想要查詢乙個鍵值對時,我們對雜湊...
C語言寫乙個雜湊表
目錄 雜湊表,就是下標可以為字母的陣列。假設現有乙個陣列int a 100 想查詢其中第40個元素,則直接輸入a 40 就可以了,時間複雜度為o 1 o 1 o 1 問題在於,當下標不是數字,而是乙個字串的時候,可能需要乙個超大的空間才能將所有下標妥善地存放在特定的位置。例如,若以大小寫字母作為下標...