陣列特點是查詢容易,插入刪除困難;鍊錶特點是查詢困難,插入刪除容易。而雜湊表可以取陣列與鍊錶的優點。
雜湊表就是把key通過乙個固定演算法函式(雜湊函式)轉換成乙個整型數字,再將該數字對陣列長度取餘,取餘的結果就當做陣列下標,後將value儲存在以該取餘結果為下標的陣列中。
公式: 儲存位置 = f(關鍵字)
例項:
#include "stdafx.h"
#include #define ok 1
#define error 0
#define success 1
#define unsuccess 0
#define hashsize 20
#define nullkey -111
int m = 0; // 雜湊表長度,全域性變數
typedef struct
hashtable;
// 初始化雜湊表
int inithashtable(hashtable *h)
for (i = 0; i < m; i++)
printf("初始化雜湊表%d個元素成功!\n", m);
return ok;
}//雜湊函式
int hash(int key)
// 插入關鍵字進雜湊表
void inserthash(hashtable *h, int key)
h->elem[addr] = key; //將關鍵字插入
printf("插入關鍵字進雜湊表成功!\n");
}// 雜湊表查詢關鍵字
int searchhash(hashtable h, int key)
} printf("查詢成功, %d 在hash表第 %d 個位置!\n", key, addr);
return success;
}int main(void)
printf("\n");
//插入資料
printf("現在插入資料,請輸入(c表示結束):\n");
while ((1 == scanf_s("%d", &i)) && (num < hashsize))
num++;
inserthash(&h, i);
if (num > hashsize)
}getchar();
// 列印插入資料後hash表的內容
printf("插入資料後hash表的內容: \n");
getchar();
for ( i = 0; i < hashsize; i++)
printf("\n");
printf("現在進行查詢。\n");
searchhash(h, 18);
searchhash(h, 190);
printf("test over\n");
getchar();
return 0;
}
輸出:![](https://pic.w3help.cc/b74/c08610d18fb3d554420030beafbe9.jpeg)
雜湊函式有:
a. 除留餘數法:
對雜湊表長度為m的雜湊函式有公式: f (key) = key mod p (p ≤ m) ; mod表示取餘,這裡關鍵是需要選擇合適的p,若p沒選好,容易產生碰撞。經驗上若雜湊表的表長為m,一般p為小於或等於表長的最小質數或不包含小於20質因子的合數。該方法最常用。另外它的取餘操作,還可經過摺疊,平放取中後再取餘。
b.摺疊法:
將關鍵字從左到右分割成位數相等的幾部分(最後一部分位數不夠時可以短些),然後將這幾部分疊加求和,並按雜湊表表長,取後幾位作為雜湊位址。
如關鍵字0123456789,雜湊表表長度為3位,可將它分為4組,012|345|678|9,再疊加求和:012 + 345 + 678 + 9 = 1044,再求後3位得到雜湊位址044。
摺疊法事先不需要知道關鍵字的分布,適合關鍵字位數較多的情況。
c.平方取中法:
假設關鍵字為123,則它的平方是15129,再抽取中間的3位就是512,用作雜湊表。平方取中法比較適合不知道關鍵字的分布,而位數又不是很大的情況。
d.直接定址法 --- 取關鍵字的某個線性函式值為雜湊位址(f(key) = a * key + b ; a, b為常數)
雜湊衝突:
一般正常情況每個關鍵字通過雜湊函式計算出來的位址是不一樣的,但有時會碰到兩個關鍵字key1和key2不相等,但是經過雜湊函式計算出來的索引位址卻是一樣的。出現這種情況說明雜湊衝突了。
雜湊衝突會導致查詢錯誤,通過仔細設計雜湊函式能夠將衝突盡可能減少,但是不能完全避免。
雜湊表 雜湊表
一 定義 雜湊表 hash table,也叫雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。雜湊表的做法其實很簡單,就是把key通過乙個固定的演算法函式...
雜湊表(雜湊表)
雜湊表是最基礎的資料結構之一,利用鍵值對儲存並檢索資料的一種非線性結構。在其它各種結構線性表 樹等資料結構中,記錄在結構中的位置是隨機的,和記錄關鍵字之間不存在確定的關係,因此,在結構中查詢記錄時需進行一系列和關鍵字的 比較 的基礎上。在順序查詢時,比較的結果為 與 兩種可能 在折半查詢 二叉排序樹...
雜湊表(雜湊表)
原文 雜湊表是種資料結構,它可以提供快速的插入操作和查詢操作。第一次接觸雜湊表時,它的優點多得讓人難以置信。不論雜湊表中有多少資料,插入和刪除 有時包括側除 只需要接近常量的時間即0 1 的時間級。實際上,這只需要幾條機器指令。對雜湊表的使用者一一人來說,這是一瞬間的事。雜湊表運算得非常快,在電腦程...