開雜湊法又叫鏈位址法(開鏈法)。設元素的關鍵碼為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...