大話資料結構 雜湊表查詢(雜湊表)

2021-07-03 05:33:55 字數 2875 閱讀 9786

雜湊技術:在記錄的儲存位置和它的關鍵字之間建立乙個確定的對應關係f,使得每個關鍵字key對應乙個儲存位置f(key)。

f:雜湊函式/雜湊函式

採用雜湊技術將記錄儲存在一塊連續的儲存空間中,這塊連續儲存空間稱為雜湊表或雜湊表

關鍵字對應的記錄儲存位置稱為雜湊位址

雜湊技術既是一種儲存方法,也是一種查詢方法。

雜湊技術適合求解問題是查詢與給定值相等的記錄。查詢速度快。

雜湊技術不適合範圍查詢,不適合查詢同樣關鍵字的記錄,不適合獲取記錄的排序,最值。

衝突:關鍵字key1不等於key2,但f(key1)=f(key2)。

把key1和key2稱為雜湊函式的同義詞。

兩個原則:

計算簡單

雜湊位址分布均勻

f(key)=a x key+b(a、b為常數)

簡單,均勻,不會衝突,但是事先知道關鍵字的分布情況,適合查詢錶小且連續。

關鍵字位數多,比如手機號,可能前幾位一樣,只是後幾位不同,抽取關鍵字的一部分計算雜湊儲存位置。事先知道關鍵字分布且若干位分布均勻。

不知道關鍵字分布,且位數不是很大。1234,平方1522756,抽取中間227作為雜湊位址。

不知道關鍵字分布,位數多。

從左到右分割成位數相等的幾部分,這幾部分疊加求和,並按雜湊表表長,取後幾位作為雜湊位址。

雜湊表長m

f(key)=key mod p(p<=m)

p選取不好,產生衝突。

通常p為<=m(最好接近m)的最小質數或者不包含小於20質因子的合數。

關鍵字長度不等。

f(key)=random(key),random隨機函式

當關鍵字為字串,轉化為某種數字來對待,比如ascll碼或者unicode碼等。

又叫線性探測法:一旦衝突,尋找下乙個空的雜湊位址。雜湊表大。

優化:二次探測法

雙向尋找,防止後面沒空,但前面有空。

增加平方,不讓關鍵字聚集在某一塊區域。

還有對位移量d隨機函式計算,稱之為隨機探測法。

rhi不同雜湊函式,隨機使用除留、摺疊、平方,每次衝突換種雜湊函式。

將所有關鍵字為同義詞的記錄儲存在乙個單鏈表(同義詞字表)中。

雜湊表中只儲存所有同義詞字表的頭指標。

缺點:單鏈表查詢遍歷耗時。

衝突關鍵字儲存到溢位表中

雜湊計算後,先基本表比較。不等,到溢位表進行順序查詢。

#include "stdio.h"    

#include "stdlib.h"

#include "io.h"

#include "math.h"

#include "time.h"

#define ok 1

#define error 0

#define true 1

#define false 0

#define maxsize 100 /* 儲存空間初始分配量 */

#define success 1

#define unsuccess 0

#define hashsize 12 /* 定義雜湊表長為陣列的長度 */

#define nullkey -32768

typedef

int status; /* status是函式的型別,其值是函式結果狀態**,如ok等 */

typedef

struct

hashtable;

int m=0; /* 雜湊表表長,全域性變數 */

/* 初始化雜湊表 */

status inithashtable(hashtable *h)

/* 雜湊函式 */

int hash(int key)

/* 插入關鍵字進雜湊表 */

void inserthash(hashtable *h,int key)

h->elem[addr] = key; /* 直到有空位後插入關鍵字 */

}/* 雜湊表查詢關鍵字 */

status searchhash(hashtable h,int key,int *addr)

return success;

}int main()

; int i,p,key,result;

hashtable h;

key=39;

inithashtable(&h);

for(i=0;iif (result)

printf("查詢 %d 的位址為:%d \n",key,p);

else

printf("查詢 %d 失敗。\n",key);

for(i=0;iprintf("查詢 %d 的位址為:%d \n",key,p);

}return

0;}

如果無衝突,o(1)。

查詢平均長度取決於:

通常將雜湊表的空間設定的比查詢集合大,犧牲空間換時間。

資料結構 雜湊表查詢(雜湊表)

對於查詢,有順序表直接遍歷,有折半查詢直到查詢成功。但是這都需要不斷的比較,每一次查詢都需要重新遍歷,所以當資料龐大時是非常耗時的。雜湊表是一種可以避免多次比較,直接通過關鍵字就可以得到要查詢的記錄記憶體儲存位置。例如就像是乙個函式,每乙個自變數都對應著乙個函式值,即 這屬於雜湊技術,不需要比較就可...

資料結構 雜湊表(雜湊表)查詢

0 前言 順序表 乙個乙個挨個查詢 有序查詢 二分查詢方法 雜湊表查詢 記錄的儲存位置 f 關鍵字 雜湊技術是在記錄的儲存位置和他的關鍵字之間建立乙個確定的對應關係f,使得每個關鍵字key對應乙個儲存位置f key 查詢時,根據這個確定的對應關係找到固定值key的對映f key 若查詢集合中存在這個...

資料結構之雜湊表查詢 雜湊表

這個知識點不難,話不多說,直接上 如下 1 include stdafx.h 2 include3 define success 1 4 define unsuccess 0 5 define hashsize 12 定義雜湊表長為陣列的長度 6 define nullkey 3276878 usi...