假定乙個集合為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 如何資料量很大時...