雜湊表的一些知識

2021-06-15 22:29:39 字數 2365 閱讀 5739

1.開放定址法

hi=(h(key)+di) mod  m  i=1,2,……,k(k≤m-1)

其中:h(key)為雜湊函式;m為雜湊表表長;di為增量序列,有三種取法。

①di=1,2,……,m-1;稱為線性探測再雜湊或線性探查法。

②di=12,-12,22,-22,32,……,±k2,(k≤m/2);稱為二次探測再雜湊。

③di=偽隨機數序列,稱為偽隨機探測再雜湊

2.再雜湊法

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

rhi均是不同的雜湊函式,即在同義詞產生位址衝突時計算另乙個雜湊函式位址,直到衝突不再發生。這種方法不易產生聚集,但增加了計算的時間。

3.鏈位址法(結合的同義詞子表)

把具有相同雜湊位址的關鍵字存放在同乙個鍊錶中,稱為同義詞表。同時用陣列

t存放各個鍊錶的頭指標。

凡是雜湊位址為i的記錄都以結點方式插入到以t[i]為頭指標的單鏈表中。

4.建立乙個公共的溢位區(分離的同義詞子表)

假設雜湊函式的值域為

[0、、m-1],則設向量hashtable[0、、m-1]為基本表,每個分量存放乙個記錄,另

設立向量overtable[0、、v]為溢位表。所有關鍵字和基本表中關鍵字為同義詞的記錄,不管它們由雜湊函式得

到的雜湊位址是什麼,一旦發生衝突,都填入溢位表。

ps.什麼是雜湊表?

雜湊函式

假設f是乙個包含n個記錄的檔案空間,ri為檔案中的某個記錄(1≤i≤n),keyi是其關鍵字值,若存在關

鍵字值keyi與記錄ri的位址之間建立某種函式關係,則便可以通過這個函式把關鍵字值轉換成相應記錄在檔案中的位址。即有:addr(ri)=h(keyi),其中addr(ri)為ri的位址,h(keyi)稱為雜湊函式。

雜湊表

通過雜湊函式構造而成的表稱為雜湊表。

把記錄按位址存放到檔案空間中相應的位置上,就形成了雜湊表,也稱雜湊表,構成雜湊表的構成稱為位址雜湊。

衝突

若某個雜湊函式對於不同的關鍵字

key1和key2,得到相同的雜湊位址,這種現象稱為衝突,這兩個關鍵字稱為

同義詞。

解決衝突即為對應到同一位址的多個同義詞安排儲存位置。因此在選定雜湊函式是應該考慮盡量避免發生衝突,也就是說,乙個好的雜湊函式應能將關鍵字值均勻地分布在整個位址空間中,是產生衝突的機會盡量少。但衝突是不可避免的,所以構造雜湊表應包括選定均勻的雜湊函式,以及解決衝突的方法。

雜湊函式的構造方法1.直接位址法

2.數字分析法

假設關鍵字是以r為基的數(如2,8,10等),並且雜湊表中可能出現的關鍵字都是事先知道的,則可以取關鍵字的若干數字來組成雜湊位址。

例如:有80個記錄,關鍵字為8位10進製數,則可取其中兩位數作為雜湊位址。

813 46 532       ①取中間4位中的任意兩位。

813 72 242       ②取其中兩位於另外兩位的疊加和。

813 87 422

813 01 367

813 22 817

┆ ┆ ┆┆

3.平方取中法

有時一組關鍵字在每一位上某些數字的重複出現頻率很高,例如:(

該方法適用於關鍵字位數少而相同的位數多的關鍵字。

4.摺疊法(邊界法)與轉移法

有時關鍵字含位數較多,這時可將關鍵字值從某些地方斷開,分成幾段,其中一段的長度等於位址的位數,把其餘摺疊加到它的上面,若產生進製則捨去。

0100,1100,1200,1160,2060,2163,2261,2262),這時無法是用數字分析法得到較均勻的雜湊函式,平方取中法是首先求關鍵字的平方值,通過平方來擴大差別,然後再選其中的幾位或其組合作為雜湊位址。

5.除留餘數法

(p≤m 一般取p為不大於m的最大素數。)

6.隨機數法

選取雜湊函式時需要考慮的因素:

①計算雜湊位址所需要的時間

②關鍵字的長度

③雜湊表的大小

④關鍵字的分布情況

⑤記錄的查詢頻率

個人總結的一些鍊錶知識

總結了一些鍊錶的知識,包括鍊錶建立,反序,逆序輸出,解決約瑟夫環 報數問題 include include using namespace std typedef struct node node,pnode 建立鍊錶 node creat int n pnode start new node t ...

MFC DLL的一些知識

雖然能用dll實現的東西都可以用com來實現,但dll的優點確實不少,它更容易建立。本文將討論如何利用mfc來建立不同型別的dll,以及如何使用他們。一 dll的不同型別 使用mfc可以生成兩種型別的dll mfc擴充套件dll和常規dll。常規dll有可以分為動態連線和靜態連線。visual c ...

const 的一些知識

收集了別人關於 const 的一些論述。const 的用法很多很靈活,稍不注意,就會有些莫名其妙的問題出現。甲 用於定義乙個不能被更改的變數的時候 const int i 10 i 的值不能被改變,否則報錯 void fun const int i 在函式中,i 的值不能被改變,即使他是個區域性變數...