這裡不講高深理論,只說直觀感受。雜湊表的目的就是為了根據資料的部分內容(關鍵字),直接計算出存放完整資料的記憶體位址。
為了解決根據關鍵字快速找到元素的存放位址,雜湊表應運而生。它通過某種演算法(雜湊函式)直接根據關鍵字計算出元素的存放位址,由於無需遍歷,所以效率很高。void* list_find_by_key(list,key)
return p;}}
當然,上面的偽**忽略了乙個重要的事實:那就是不同的關鍵字可能產生出同樣的hash值。void* hash_table_find_by_key(table, key)
這種情況稱為「衝突」,為了解決這個問題,有兩種方法:一是鏈式擴充套件;二是開放定址。這裡只講第一種:鏈式擴充套件。hash("張三") = 23;
hash("李四") = 30;
hash("王五") = 23;
也就是把具有相同hash值的元素放到一起,形成乙個鍊錶。這樣在插入和尋找資料的時候就需要進一步判斷。
需要注意的是,只要hash函式合適,這裡的鍊錶通常都長度不大,所以查詢效率依然很高。void* hash_table_find_by_key(table, key)
下圖是乙個雜湊表執行時記憶體布局:
下面是測試程式原始碼,基於c++。
#include #include #include "hashtable.h"
// 要放入雜湊表中的結構體
struct student
;// 結構體內存釋放函式
static void free_student(void* stu)
// 顯示學生資訊的函式
static void show_student(struct student* p)
int main()
// 向雜湊表中加入多個學生結構體
for (int i = 0; i < 100; i++)
// 根據學生姓名查詢學生結構
for (int i = 0; i < 100; i++)
// 銷毀雜湊表例項
hash_table_delete(ht);
return 0;
}
c語言實現雜湊表
雜湊表大家都在資料結構中學習過,應該是查詢最快的一種資料結構了,最好的情況下可以達到線性的時間複雜度。鍵key的狀態碼如果為 vt undefined 的話那麼就是這個槽位沒有被占用或者已經被刪除了 值value的狀態碼有vt true和vt false兩種,只要這個槽位已經被占用過了,那麼valu...
雜湊表查詢 C語言實現
題目 給定乙個全部由字串組成的字典,字串全部由大寫字母構成。其中為每個字串編寫密碼,編寫的 方式是對於 n 位字串,給定乙個 n 位數,大寫字母與數字的對應方式按照 鍵盤的方式 2 a,b,c 5 j,k,l 8 t,u,v 3 d,e,f 6 m,n,o 9 w,x,y,z 4 g,h,i 7 p...
雜湊表的C語言實現
include include define hashsize 12 define nullkey 32768 typedef structhashtable int m 0 初始化雜湊表 int inithashtable hashtable h return 1 雜湊函式 int hash in...