雜湊表(雜湊表)

2021-10-05 03:01:04 字數 2287 閱讀 3611

陣列特點是查詢容易,插入刪除困難;鍊錶特點是查詢困難,插入刪除容易。而雜湊表可以取陣列與鍊錶的優點。

雜湊表就是把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;

}

輸出:

雜湊函式有:

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 的時間級。實際上,這只需要幾條機器指令。對雜湊表的使用者一一人來說,這是一瞬間的事。雜湊表運算得非常快,在電腦程...