前面的查詢是一系列關鍵字比較,查詢速度相對較慢。hash查詢的優勢來了
a. 哈系函式: 乙個把查詢表中的關鍵字對映成該關鍵字對應的位址的函式,adde = hash(key)。 這裡的位址可以是下標,索引,或記憶體位址。
b. 雜湊表:由根據關鍵字而直接進行訪問的資料結構。雜湊表建立了關鍵字和儲存位址之間的一種直接對映關係。
hash函式的構造方法
a.直接定址法:h(key) = a*key+b (a,b作為常數,計算簡單,但只適合關鍵字分布連續的情況)
b.除留餘數法:最簡單也是最常用的方法,假定雜湊表表長為m,取乙個不大於m但最接近或等於m的質數p,利用下列公式把關鍵字轉換成雜湊位址。h(key)=key%p
c.數字分析法:設關鍵字是r進製,而r個數碼在各位上出現的頻率不一定相同,可能在某個位上分布均勻些,每種數碼出現的機會相等。而某些位上分布不均勻,只有某幾種數碼經常出現,則應選取數碼分布較為均勻的若干位作為雜湊位址。這種方法適合與已知關鍵字集合。(ps: 並不知道它在構造hash表時是怎麼使用的)
d.平方取中法:取關鍵字的平方值的中間幾位作為雜湊位址。使用與關鍵字的每一位取值都不夠均勻或均小於雜湊位址所需的位數。
e. 摺疊法:將關鍵字分割成位數相同的幾部分(最後一部分的位數可能短一些),然後取這幾部分的疊加和作為雜湊位址,這種方法稱為摺疊法。適用與關鍵字很多,且關鍵字中每一位上數字分布大致均勻時,可以採用該方法。
3.處理衝突的方法
上述幾個建構函式可以看出,基本都不可避免產生衝突,故提出以下幾種解決方案。
第一類: 開放定址法
可存放新表項的空閒位址既向同義詞表項開放,也向非同義詞表項開放。
hi = (h(key)+di)%m
其中,i=1, 2, 3, …… , k(k<=m-1);m表示雜湊表表長,di為增量序列
a. 線性探測法:使用較多,發生衝突時,順序檢視表中下乙個單元(當探測到表尾m-1時,下個探測位址就是首位址0)例如:addr = hash(5) = 2。應該存入位址為2的單元,但這個已經被使用,則順序探尋下乙個位址。要麼順序查詢找到,要麼查詢全表完畢。缺點明顯:易聚集,查詢起來困難,許多時候平均查詢長度較大
b. 平方探測法:di=1^2,-1^2,2^2,-2^2, … ,k^2,-k^2。其中k<=m/2,m必須是乙個可以表示成4k+3的質數,又稱二次探測法。(可以看出,是在addr左右來回擺動探測)
c. 再雜湊法:di=hash2(key).當第乙個雜湊函式h(key)得到的位址發生衝突,則利用第二個雜湊函式hash2(key)計算該關鍵字的位址增量。再雜湊法中,最多經過m-1次探測會遍歷表中所有位置,回到h0位置。
d. 偽隨機數序列法:di= 偽隨機數序列
注意:在開放位址法中,不能隨便物理刪除表中已有元素,因為若刪除元素將會截斷其他具有相同雜湊位址的元素的查詢位址。所以要刪除乙個元素時,需要做乙個刪除標記,進行邏輯刪除。***就是執行多次刪除後,表面上看起來列表很滿,實際上位置並沒有利用到。
第二類:拉鍊法
避免非同義詞發生衝突,可以把所有的同義詞儲存在乙個線性鍊錶中,這個鍊錶由其雜湊位址唯一標識。假設雜湊位址為i的同義詞鍊錶存放在雜湊表的第i個單元中,因此查詢,插入和刪除操作主要在同義詞鏈當中進行。拉鍊法適用與經常插入和刪除的情況。
平均查詢長度
雜湊表的查詢效率取決於三個因素:雜湊函式,處理衝突的方法和裝填因子a
a = (表中記錄數n)/(雜湊表長度m)
例:
asl(成功) = (1*7+2*4+3*1)/12 (12個元素)
asl(不成功) = (1×6+2*2+3*3+4*1)/13 (表長為13,所以所有值都可以看成13個元素)
查詢計畫Hash和查詢Hash
在sql server 2008中引入的圍繞執行計畫和緩衝的新功能被稱為查詢計畫hash和查詢hash。這是使用針對查詢或查詢計畫的演算法來生成二進位制hash值的二進位制物件。可以從sys.dm exec query stats或sys.dm exec requests檢索查詢計畫hash和查詢h...
查詢計畫Hash和查詢Hash
原文 查詢計畫hash和查詢hash 在sql server 2008中引入的圍繞執行計畫和緩衝的新功能被稱為查詢計畫hash和查詢hash。這是使用針對查詢或查詢計畫的演算法來生成二進位制hash值的二進位制物件。可以從sys.dm exec query stats或sys.dm exec req...
查詢計畫Hash和查詢Hash
原文 查詢計畫hash和查詢hash 在sql server 2008中引入的圍繞執行計畫和緩衝的新功能被稱為查詢計畫hash和查詢hash。這是使用針對查詢或查詢計畫的演算法來生成二進位制hash值的二進位制物件。可以從sys.dm exec query stats或sys.dm exec req...