雜湊查詢 資料結構

2021-06-27 18:44:49 字數 1755 閱讀 3583

假定乙個集合為s=,集合長度為n

假定選取的雜湊函式為:h(k)=k % m

即用元素的

關鍵字k整除以雜湊表的長度m

,(假定k和m均為正整數,並且m>=n),取餘數作為儲存該元素的雜湊位址。

h(18)=18 % 13=5        h(75)=75 %13=10

h(60)=60 % 13=8        h(43)=43 %13=4

h(54)=54 % 13=2        h(90)=90 %13=12

h(46)=46 % 13=7

若根據雜湊位址把元素儲存

到雜湊表h[m]中,則儲存映象為:

處理衝突的方法

1、開放定址法  

(1) 線性探查法

向前面的例子中構造的h雜湊表中再插入關鍵字分別為31和58的兩個元素,若發生衝突則使用線性探查法處理。

先看插入關鍵字為31的元素的情況。關鍵字為31的雜湊位址為h(31)=31 % 13=5,因h[5]單元已被占用,接著探查下乙個即下標為6的單元,因該單元空閒,所以關鍵字為31的元素被儲存到下標為6的單元中,此時對應的雜湊表h為:

再看插入關鍵字為58的元素的情況。關鍵字為58的雜湊位址為h(58)=58 % 13=6,因h[6]已被占用,接著探查下乙個即下標為7的單元,因h[7]仍不為空,再接著探查下標為8的單元,這樣當探查到下標為9的單元時,才查詢到乙個空閒單元,所以把關鍵字為58的元素存入該單元中,此時對應的雜湊表h為:

(2) 平方探查法

平方探查法的探查序列為d,d+12,d+22,…,或表示為(d+i2) % m (0≤i≤m-1)。若使用遞推公式表示,則為:

d=h(k)

di=(di-1+2i-1)% m   (1≤i≤m-1, d0=d)

這種方法能夠較好的避免堆積現象,它的缺點是不能探查到雜湊表上的所有單元,但只能探查到一半單元。

(3) 雙雜湊函式探查法

這種方法使用兩個雜湊函式h1和h2,其中h1和前面的h(k)一樣,以關鍵字為自變數,產生乙個0至m-1之間的數作為雜湊位址,h2也以關鍵字為自變數,

產生乙個1至m-1之間的,並和m互素的數作為探查序列的位址增量。

雙雜湊函式的探查序列為:

d=h1(k)

di=(di-1+h2(k))% m   (1≤i≤m-1, d0=d)

2. 鏈結法

鏈結發又稱開雜湊法,它是把發生衝突的同義詞元素用單鏈表鏈結起來的方法。

假定乙個線性表b為:

b=(18,75,60,43,54,90,46,31,58,73,15,34)

為了進行雜湊儲存,假定採用的雜湊函式為:

h(k)=k % 13

當發生衝突時,假定採用鏈結法處理,則得到的雜湊表如下圖所示。

用鏈結法處理衝突,雖然比開放定址法多占用一些儲存空間用來儲存鏈結指標,但它可以減少在插入和查詢過程中同關鍵字的比較次數。

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

通常我們查詢資料都是通過乙個乙個地比較來進行,有一種方法,要尋找的資料與其在資料集中的位置存在一種對應的關係,通過這種關係就能找到資料的位置。這個對應關係成為雜湊函式 雜湊函式 因此建立的表為雜湊表 雜湊表 雜湊查詢是關鍵字與在資料集中的位置一一對應,通過這種對應關係能快速地找到資料,雜湊查詢中雜湊...

雜湊查詢 資料結構

define crt secure no warnings include iostream include stdlib.h include windows.h include iomanip using namespace std define ok 1 define error 0 defin...

資料結構 雜湊查詢

為什麼要用雜湊查詢?什麼是雜湊查詢?解決衝突有哪些方法?如何評估查詢?雜湊函式如何設計?順序查詢 時間複雜度 o n 二分查詢 前提有序 時間複雜度 o logn 二叉搜尋樹 時間複雜度 o h h 是樹高,最好情況 h logn,最差 h n 二叉平衡樹 時間複雜度 o logn 如何資料量很大時...