資料結構 雜湊查詢

2021-09-23 20:27:26 字數 3448 閱讀 9506

為什麼要用雜湊查詢?

什麼是雜湊查詢?

解決衝突有哪些方法?

如何評估查詢?

雜湊函式如何設計?

順序查詢 時間複雜度 o(n)

二分查詢(前提有序) 時間複雜度 o(logn)

二叉搜尋樹 時間複雜度 o(h),h 是樹高,最好情況 h = logn,最差 h = n 。

二叉平衡樹 時間複雜度 o(logn)

如何資料量很大時怎麼辦,10 億,100 億 ?

順序查詢全部遍歷不可能 ,二分查詢要求有序太難了,2 的 30 次方等於10 億多,那麼二叉搜尋樹、二叉平衡樹最好情況下樹高 30,比 30 次也有點多。

雜湊查詢:通過雜湊函式的計算求出關鍵字的位置。 這樣就有很快的查詢效率。時間複雜度幾乎是常量 o(1)。

雜湊 (hashing) 是一種重要的查詢方法。它的基本思想是:以資料物件的關鍵字 key 為自變數,通過乙個確定的函式關係 h,計算出對應的函式值 h(key) ,把這個值解釋為資料物件的儲存位址(可能不同的關鍵字會對映到同乙個雜湊位址上會有衝突,需要解決),並按此存放,即「儲存位置= h(key)」。

雜湊表(hash table)也稱為雜湊表。

雜湊查詢的兩項基本工作:

雜湊函式的設計需要考慮下列兩個因素:

1.直接定址法

2.除留餘數法

雜湊函式為:h(key) = key mod p一般 p 取素數,p <= tablesize

是現實應用中比較常見的方法。

3.數字分析法

int atoi(char* s) :將數字字串轉成數字

4.摺疊法

5.平方取中法

如56793542,將其平方,再取中間的三位數作為key

56793542×56793542 = 3225506412905764

h(56793542) = 641

1.ascii碼加和法

h(key) = (∑key[i]) mod tablesize

函式簡單,均勻性比較差,衝突比較嚴重(如a3,b2,c1;eat,tea這些)。

2.簡單的改進————前 3 個字元移位法

h(key) = (key[0] * 27^2 + key[1] * 27 + key[2] ) mod tablesize

3.好的雜湊函式————移位法

常用處理衝突的思路:

開放位址法

一旦產生了衝突(該位址已有其它元素),就按某種規則去尋找另一空位址

若發生了第 i 次衝突,試探的下乙個位址將增加 di,基本公式是:

不同的di決定了不同的解決衝突方案:線性探測、平方探測、雙雜湊。

線性探測

以增量序列1,2……(tablesize - 1)迴圈試探下乙個儲存位址。即di = i

1.先算出雜湊位址,直接求h(key)

2.模擬進行插入操作。

對衝突情況說明:如插入29,h(29) = 7,那麼此時d1=1,移到位址為8的地方即可。

如插入30,此時位址為8的地方已經被占用,因此di++,一直加到d4,位置在12,依然衝突,再加的話需要對其mod tablesize,直到d6處可以放下,那就可以放入。

asl s 中的值每個數的查詢次數,如對於11,查詢1次就查詢到了(11 mod 11 = 0),對於30,需要查詢7次(30 mod 11 = 8,再d6走6次,共7次),分母是放入位址中的數字總數

asl u中的值是對於h(key)相同的值,找不到它的情況(並不一定要列出完全相同的例子),如22,h(22) = 0,從位址0開始,沒有,到1,也不是,到2發現此處是空的,那就斷定沒有22,其它類似。分母是自行設定的b(mod 11的11)

平方探測——二次探測

實際上就是衝突地點開始左右橫跳

缺陷:在一定特殊情況下,表內有空間,但是平方探測找不到改下放的位址

探測序列一直是2和0,3和4夠不著

有定理顯示:如果雜湊表長度tablesize是某個4k+3(k是正整數)形式的素數時,平方探測法就可以探查到整個雜湊表空間

雙雜湊探測法

d1為i*h2(key),h2(key)是另乙個雜湊函式

探測序列成h2(key),2h2(key),3h2(key)……

對任意的key,h2(key)≠0

探測序列還應該保證所有的雜湊儲存單元都應該能夠被探測到。選擇以下形式有良好的效果:

h2(key) = p - (key mod p)

其中p < tablesize,p、tablesize都是素數

再雜湊

當雜湊元素太多(即裝填因子α太大)時,查詢效率會下降;解決的方法是加倍擴大雜湊表,這個過程叫再雜湊。

雜湊表擴大時,原有元素需要重新計算放置到新錶中

實用最大裝填因子一般取0.5 <= α <= 0.85

分離鏈結法

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

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

雜湊查詢 資料結構

假定乙個集合為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 ...

雜湊查詢 資料結構

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...