資料結構 雜湊表

2021-10-09 08:05:54 字數 3082 閱讀 5180

雜湊表又稱雜湊表。

對於一般的資料結構,記錄在結構中的相對位置都是隨機的,和記錄的關鍵字無關,因此要想找到資料在資料結構中的相對位置需要進行一系列和關鍵字的」比較」。

例如順序結構的比較的結果為==或!=,折半查詢,二叉樹排序樹查詢和b–樹查詢時比較的結果為《或》等等。(查詢的效率依賴於查詢過程中所進行的比較次數)

當然最理想的情況下,我們希望一次訪問就可以查詢所有元素,這就需要在每個儲存位置與它的關鍵字之間建立乙個對應關係f,使其一一對應。

雜湊函式的設定非常靈活,他是將乙個大集合對映到乙個小集合,只要使得任何關鍵字通過雜湊函式得到的雜湊值都落在雜湊表範圍內。

下面舉出了幾種常見的哈西函式:

直接取值法取關鍵字或關鍵字的某個線性函式值做哈西位址,其實平常使用陣列時有意無意的使用過這種函式。

h (k

ey)=

key或

h(ke

y)=a

×key

+b

h(key)=key或h(key)=a×key+b

h(key)

=key

或h(k

ey)=

a×ke

y+b

數學分析法以r為基的數(如:以10為基的十進位制數),並且雜湊表中可能出現的關鍵字都是事先知道的,可取部分關鍵字的若干位組成雜湊位址。(例如資料經常有重複的部分,這部分可以省去。)

平方取中法取關鍵字平方後的中間幾位做哈系位址。有時候我們不能事先知道關鍵字的全部情況取其中哪幾位也不合適,而乙個數平方的中間幾位與幾乎所有位的數有關,具有很大的隨機性可以作為哈西位址。

摺疊法與平方取中法相似,將乙個數截成幾個相同的部分依次想加,這個數受所以位數的影響,具有隨機性。

除留餘數法這是一種最簡單,也是最常用的構造雜湊函式的方法,可以對關鍵字直接取模,也可以在摺疊,平方取中後取模。(一般情況下,可以選p為質數或不包括小於20的質因數的合數)。

之後的**樣例使用了這個方法。

隨機數法選擇乙個隨機函式,取關鍵值的隨機函式值做雜湊位址。

當不同的關鍵值通過雜湊函式得到了相同的雜湊值是就發生了衝突。

選擇好合適的雜湊函式可以減少衝突,但因為是大集合向小集合是對映,所以衝突不可避免。

這就需要我們有一種遇到衝突時的處理方法。處理衝突就是找到另乙個空的雜湊位址。下面給出幾種常見的處理衝突的方法。

開放定址法hi=

(h(k

ey)+

di)m

odmi

=1

,2...,k

(k

<=m

–1

)hi=(h(key)+di) mod m i = 1,2...,k(k<=m–1)

hi=(h(

key)

+di)

modm

i=1,

2...

,k(k

<=m

–1)

di是增量序列,這裡有三種取法

(1)取1,2,3,…稱線性探測再雜湊;

(2)取12,-12,22,…稱二次探測再雜湊;

(3)取偽隨機數列,稱偽隨機探測再雜湊。

線性探測再雜湊會出現集聚現象,但可以保證一定可以找到還空著的雜湊位址。

在雜湊法hi=

rhi(

key)

i=1,

2,……

,k

hi=rhi(key) i=1,2,……,k

hi=rhi

(key

)i=1

,2,…

…,krhi是不同的雜湊函式,這種方法不易產生「聚集」,但增加了計算時間。

鏈位址法

將所有的同義詞儲存在同一線性鍊錶中。

建立乙個公共溢位區

一旦產生衝突就填入公共溢位區。

除留取餘法+線性探測再雜湊

#include

#include

#include

using

namespace std;

class

hashtable}~

hashtable()

inthash

(string &index)

return code;

}bool

search

(string &index,

int&pos,

int×)

else}if

(elem[pos]

== index)

else

}int

insert

(string &index)

else

if(times < size /2)

else

}void

recreate()

int copy_size = size;

size *=2

;delete

elem;

elem =

new string[size]

;for

(int i =

0; i < size; i++

)for

(int i =

0; i < copy_size; i++)}

delete

temp_elem;}}

;int

main()

else

if(ans ==1)

else

if(ans ==2)

}int temp_pos, temp_times;

cin >> buffer;

if(hashtable.

search

(buffer, temp_pos, temp_times)

)else

system

("pause");

return0;

}

資料結構 雜湊表

1.雜湊表的定義 元素的儲存位置和它的關鍵碼之間建立乙個確定的對應關係h,使得每個關鍵碼key和唯一的儲存位置h key 相對應。在查詢時,根據這個確定的對應關係找到給定值k的對映h k 若查詢集合中存在這個記錄,則必定在h k 的位置上,這種查詢技術稱為雜湊技術。採用雜湊技術將記錄儲存在一塊連續的...

資料結構 雜湊表

雜湊表的定義 雜湊表 hash table,也叫雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把 關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的 速度。這個對映函式叫做雜湊函式,存放 記錄的陣列叫做雜湊表。雜湊函式的析構方法 餘數法 取關鍵字被某個不大於雜...

資料結構 雜湊表

3 雜湊函式 數字分析法 根據關鍵碼在各個位上的分布情況,選取分布比較均勻的若干位組成雜湊位址。適用情況 能預先估計出全部關鍵碼的每一位上各種數字出現的頻度,不同的關鍵碼集合需要重新分析。4 雜湊函式 平方取中法 對關鍵碼平方後,按照雜湊表大小,取中間的若干位作為雜湊位址 平方後擷取 適用情況 實現...