雜湊錶開雜湊法(拉鍊法)

2022-05-09 09:36:11 字數 2424 閱讀 5306

開雜湊法又叫鏈位址法(開鏈法)。設元素的關鍵碼為37, 25, 14, 36, 49, 68, 57, 11, 雜湊表為ht[12],表的大小為12,雜湊函式為hash(x) = x % 11

hash(37)=4

hash(25)=3

hash(14)=3

hash(36)=3

hash(49)=5

hash(68)=2

hash(57)=2

hash(11)=0

使用雜湊函式計算出每個元素所在的桶號,同乙個桶的鍊錶中存放雜湊衝突的元素。

通常,每個桶對應的鍊錶結點都很少,將n個關鍵碼通過某乙個雜湊函式,存放到雜湊表中的m個桶中,那麼每乙個桶中煉表的平均長度為。以搜尋平均長度為的鍊錶代替了搜尋長度為 n 的順序表,搜尋效率快的多。

應用鏈位址法處理溢位,需要增設鏈結指標,似乎增加了儲存開銷。事實上:

由於開位址法必須保持大量的空閒空間以確保搜尋效率,如二次探查法要求裝載因子a <= 0.7,而表項所佔空間又比指標大的多,所以使用鏈位址法反而比開位址法節省儲存空間。

使用素數表對齊做雜湊表的容量,降低雜湊衝突。

size_t hashtablekprime(size_t n) //獲取素數

; for (i=0; i<_primesize i>

return _primelist[_primesize-1];

}

開闢拉鍊的鏈式節點

hashnode* buyhashknode(keytype key,valuetype value) //開闢新節點

雜湊函式

keytype hashkfunc(keytype key,size_t n)

雜湊拉鍊表的初始化

void hashtablekinit(hashtable *ht,size_t n)//初始化

插入時擴容這塊很關鍵,要重新開闢一塊陣列空間,把原先的表中資料對映過來,但是拉鍊節點不用重新開闢,直接把原先的節點拿過來。

int hashtablekinsert(hashtable* ht, keytype key, valuetype value) //插入}}

free(ht->_tables);

ht->_tables = newht._tables;

ht->_n = newht._n;

}index = hashkfunc(key,ht->_n);

if (ht->_tables[index])

}node->_next = ht->_tables[index];

ht->_tables[index] = node;

ht->_size++;

return 0;

}

查詢函式

hashnode* hashtablekfind(hashtable* ht, keytype key) //查詢

return null;}}

else

return null;

}

刪除函式

int hashtablekremove(hashtable* ht, keytype key) //刪除

else if(cur->_key == key)

prev = cur;

cur = cur->_next;

}return -1;

}else

return -1;

}

void hashtablekdestory(hashtable* ht) //銷毀}}

free(ht->_tables);

ht->_tables = null;

ht->_size = 0;

ht->_n = 0;

}

測試函式

void testhashtablek()

測試結果:

相關雜湊表概念請看雜湊表詳解:這裡寫鏈結內容

雜湊表的開雜湊法(拉鍊法)

開雜湊法又叫鏈位址法 開鏈法 設元素的關鍵碼為37,25,14,36,49,68,57,11,雜湊表為ht 12 表的大小為12,雜湊函式為hash x x 11 hash 37 4 hash 25 3 hash 14 3 hash 36 3 hash 49 5 hash 68 2 hash 57 ...

雜湊表(拉鍊法)

開雜湊法又叫鏈位址法 開鏈法 開雜湊法 首先對關鍵碼集合用雜湊函式計算雜湊位址,具有相同位址的關鍵碼歸於同一子集合,每乙個子集合稱為乙個桶,各個 桶中的元素通過乙個單鏈表鏈結起來,各鍊錶的頭結點儲存在雜湊表中。設元素的關鍵碼為37,25,14,36,49,68,57,11,雜湊表為ht 12 表的大...

雜湊表(閉雜湊 拉鍊法 雜湊桶)

雜湊表,也稱雜湊表,是一種通過key值來直接訪問在記憶體中的儲存的資料結構。它通過乙個關鍵值的函式 被稱為雜湊函式 將所需的資料對映到表中的位置來訪問資料。關於雜湊表,主要為以下幾個方面 一 雜湊表的幾種方法 1 直接定址法 取關鍵字key的某個線性函式為雜湊位址,如hash key key 或 h...