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 的值不能被改變,即使他是個區域性變數...