教你從零開始寫乙個雜湊表 雜湊衝突

2021-09-03 02:12:00 字數 888 閱讀 8633

雜湊函式把乙個無窮大的輸入集合對映到乙個有限大小的輸出集合。不同的關鍵字可能會被對映到同乙個陣列下標,如此一來就導致了雜湊衝突。雜湊表必須實現解決衝突的方法。

我們的雜湊表將使用開放位址法和再雜湊法。在桶索引衝突後,再雜湊法會使用兩個雜湊函式來計算鍵值對將要儲存的桶索引值。

有關其他雜湊衝突的解決方法,請檢視附錄。

索引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 問題在於,當下標不是數字,而是乙個字串的時候,可能需要乙個超大的空間才能將所有下標妥善地存放在特定的位置。例如,若以大小寫字母作為下標...