雜湊表 C語言實現

2021-08-28 12:06:55 字數 3251 閱讀 9995

這裡不講高深理論,只說直觀感受。雜湊表的目的就是為了根據資料的部分內容(關鍵字),直接計算出存放完整資料的記憶體位址。

void* list_find_by_key(list,key)

return p;}}

為了解決根據關鍵字快速找到元素的存放位址,雜湊表應運而生。它通過某種演算法(雜湊函式)直接根據關鍵字計算出元素的存放位址,由於無需遍歷,所以效率很高。

void* hash_table_find_by_key(table, key)

當然,上面的偽**忽略了乙個重要的事實:那就是不同的關鍵字可能產生出同樣的hash值。

hash("張三") = 23;

hash("李四") = 30;

hash("王五") = 23;

這種情況稱為「衝突」,為了解決這個問題,有兩種方法:一是鏈式擴充套件;二是開放定址。這裡只講第一種:鏈式擴充套件。

也就是把具有相同hash值的元素放到一起,形成乙個鍊錶。這樣在插入和尋找資料的時候就需要進一步判斷。

void* hash_table_find_by_key(table, key)

需要注意的是,只要hash函式合適,這裡的鍊錶通常都長度不大,所以查詢效率依然很高。

下圖是乙個雜湊表執行時記憶體布局:

下面是測試程式原始碼,基於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...