一、雜湊表的概念及作用
一般的線性表,樹中,記錄在結構中的相對位置是隨機的,即和記錄的關鍵字之間不存在確定的關係,因此,在
結構中查詢記錄時需進行一系列和關鍵字的比
較。這一類查詢方法建立在「比較「的基礎上,查詢的
效率依賴於查詢過
程中所進行的比較次數。
理想的情況是能直接找到需要的記錄,因此必須在記錄的儲存位置和它的關鍵字之間建立乙個確定的對應關係f,
使每個關鍵字和結構中乙個唯一的儲存位置
相對應。
雜湊表最常見的例子是以學生學號為關鍵字的成績表,1號學生的記錄位置在第一條,10號學生的記錄位置在第 1
0條...
如果我們以學生姓名為關鍵字,如何建立查詢表,使得根據姓名可以直接找到相應記錄呢?
用上述得到的數值作為對應記錄在表中的位置,得到下表:
如果將來要查李秋梅的成績,可以用上述方法求出該記錄所在位置:
李秋梅:lqm 12+17+13=42 取表中第42條記錄即可。
問題:如果兩個同學分別叫 劉麗 劉蘭 該如何處理這兩條記錄?
這個問題是雜湊表不可避免的,即衝突現象:對不同的關鍵字可能得到同一雜湊位址。
二、雜湊函式的構造方法
1、直接定址法
例如:有乙個從1到100歲的人口數字統計表,其中,年齡作為關鍵字,雜湊函式取關鍵字自身。
但這種方法效率不高,時間複雜度是o(1),空間複雜度是o(n),n是關鍵字的個數
2、數字分析法
有學生的生日資料如下:
年.月.日
75.10.03
75.11.23
76.03.02
76.07.12
75.04.21
76.02.15
...
經分析,第一位,第二位,第三位重複的可能性大,取這三位造成衝突的機會增加,所以盡量不取前三位,取後三位比 較好
。 3、平方取中法
取關鍵字平方後的中間幾位為雜湊位址。
4、摺疊法
將關鍵字分割成位數相同的幾部分(最後一部分的位數可以不同),然後取這幾部分的疊加和(捨去進製)作為雜湊
位址,這方法稱為摺疊法。
例如:每一種西文圖書都有乙個國際標準圖書編號,它是乙個10位的十進位制數字,若要以它作關鍵字建立乙個雜湊
表,當館藏書種類不到10,000時,可採用此法構造乙個四位數的雜湊函式。如果一本書的編號為0-442-20586-4, 則:
5、除留餘數法
取關鍵字被某個不大於雜湊表表長m的數p除后所得餘數為雜湊位址。
h(key)=key mod p (p<=m)
6、隨機數法
選擇乙個隨機函式,取關鍵字的隨機函式值為它的雜湊位址,即
h(key)=random(key) ,其中random為隨機函式。通常用於關鍵字長度不等時採用此法。
三、處理衝突的方法
如果兩個同學分別叫 劉麗 劉蘭,當加入劉蘭時,位址24發生了衝突,我們可以以某種規律使用其它的儲存位置,如
果選擇的乙個其它位置仍有衝突,則再選下乙個,直到找到沒有衝突的位置。選擇其它位置的方法有:
1、開放定址法
hi=(h(key)+di) mod m i=1,2,...,k(k<=m-1)
其中m為表長,di為增量序列
a.如果di值可能為1,2,3,...m-1,稱線性探測再雜湊。
b.如果di取值可能為1,-1,2,-2,4,-4,9,-9,16,-16,...k*k,-k*k(k<=m/2),
稱二次探測再雜湊。
c.如果di取值可能為偽隨機數列,稱偽隨機探測再雜湊。
例:在長度為11的雜湊表中已填有關鍵字分別為17,60,29的記錄,現有第四個記錄,其關鍵字為38,由雜湊函式得
到位址為5,若用線性探測再雜湊,如下:
2、再雜湊法
當發生衝突時,使用第二個、第三個、雜湊函式計算位址,直到無衝突時。缺點:計算時間增加。
3、鏈位址法
將所有關鍵字為同義詞的記錄儲存在同一線性鍊錶中。
4、建立乙個公共溢位區
假設雜湊函式的值域為[0,m-1],則設向量hashtable[0..m-1]為基本表,另外設立儲存空間向量overtable[0..v]
用以儲存發生衝突的記錄。
雜湊衝突的兩種解決辦法
1.開雜湊 開放位址法 缺點 所有衝突連在一起易產生資料堆積,占用別的資料的關鍵碼,導致搜尋速率下降 pragma once include include include typedef int keydatatype typedef int valuedatatype typedef enum ...
雜湊函式的構造方法以及衝突解決辦法
常用的構造雜湊函式的方法有 h key key 或 h key a key b 其中a和b為常數 這種雜湊函式叫做自身函式 例如 有乙個從1歲到100歲的人口數字統計表,其中,年齡作為關鍵字,雜湊函式取關鍵字自身。這樣,若要詢問25歲的人有多少,則只要查表的第25項即可。又如 有乙個解放後出生的人口...
ios庫衝突解決辦法
1.報錯顯示 x.o檔案,在build phrase裡面搜尋這個類名,把顯示出來的那幾個 m檔案給remove掉 2.如果兩個靜態庫衝突的結構是相同的,可以考慮將兩個靜態庫拆分出來進行合併。檢視檔案的架構有哪些 lipo info libzbar.a architectures in the fat...