雜湊(雜湊)技術是在記錄的儲存位置和它的關鍵字之間建立乙個確定的關係(雜湊函式),使得每個關鍵字key對應乙個儲存位置,
記錄的儲存位置=f(key)。
雜湊函式是一種對映,設定靈活。
不同關鍵字可能會得到同一雜湊位址即衝突。
雜湊表概念:
根據設定的雜湊函式h(key)和處理衝突的方法將一組關鍵字映像到乙個有限的連續的儲存空間(位址集)上,並以關鍵字在位址集中的「像」作為記錄在表中的儲存位置。
雜湊表的查詢步驟:
當儲存記錄時,通過雜湊函式計算出記錄的雜湊位址
當查詢記錄時,我們通過同樣的是雜湊函式計算記錄的雜湊位址,並按此雜湊位址訪問該記錄
雜湊技術既是儲存方法也是查詢方法,且不需要迭代。
雜湊函式的構造方法:
構造雜湊函式的兩個基本原則
1 計算簡單
2 分布均勻
***1.直接定址法
例一:有乙個從1到100歲的人口數字統計表,其中,年齡作為關鍵字,雜湊函式取關鍵字自身。
即:f(key) = key
例二:如果現在要統計的是2023年以後出生的人口數,那麼我們對出生年份這個關鍵字可以變換為:用年份減去1980的值來作為位址。
即:f(key) = key – 1980
實際中使用不多
2 數字分析法
數字分析法通常適合處理關鍵字位數比較大的情況,例如我們現在要儲存某家公司員工登記表,如果用手機號作為關鍵字,那麼我們發現抽取後面的四位數字作為雜湊位址是不錯的選擇。
3 平方取中法
平方取中法是將關鍵字平方之後取中間若干位數字作為雜湊位址。
適合不知關鍵字分布且位數少
4 摺疊法
摺疊法是將關鍵字從左到右分割成位數相等的幾部分,然後將這幾部分疊加求和,並按雜湊表表長取後幾位作為雜湊位址
適合不知關鍵字分布且位數較多
5 除留餘數法
此方法為最常用的構造雜湊函式方法,對於雜湊表長為m的雜湊函式計算公式為:
f(key) = key mod p(p<=m)
事實上,這個方法不僅可以對關鍵字直接取模,也可以通過摺疊、平方取中後再取模。
例如下表,我們對有12個記錄的關鍵字構造雜湊表時,就可以用f(key) = key mod 12的方法。
p的選擇是關鍵,如果對於這個**的關鍵字,p還選擇12的話,那得到的情況未免也太糟糕了:
p的選擇很重要,如果我們把p改為11,那結果就另當別論啦:
由眾人經驗得知:一般情況下,可以選p為質數或不包含小於20的質因數的合數
6 隨機法
選擇乙個隨機數,取關鍵字的隨機函式值為它的雜湊位址。
即:f(key) = random(key)。
這裡的random是隨機函式,當關鍵字的長度不等時,採用這個方法構造雜湊函式是比較合適的
不同情況用不同雜湊函式,考慮因素有:
計算雜湊位址所需的時間
關鍵字的長度
雜湊表的大小
關鍵字的分布情況
記錄查詢的頻率
處理衝突的方法:
1 開放定址法
所謂的開放定址法就是一旦發生了衝突,就去尋找下乙個空的雜湊位址,只要雜湊表足夠大,空的雜湊位址總能找到,並將記錄存入。
它的公式是:
fi(key) = (f(key)+di) mod m (di=1,2,…,m-1)
例:假設關鍵字集合為,使用除留餘數法(m=12)求雜湊表
插入37時與25衝突則(37+1)mod 12=2,則填入2中
di為增量序列,可有三種取法:
1 線性探測再雜湊
di=1,2,…,m-1
此種易堆積
2 二次探測再雜湊
di=1²,-1²,2²,-2²…,q²,-q²,q<=m/1
此中不易堆積
3 隨機探測再雜湊
di是由乙個隨機函式獲得的數列
2 再雜湊法
fi(key) = rhi(key) (i=1,2,3,…k)
即換函式
3 鏈位址法
例:假設關鍵字集合為,同樣使用除留餘數法求雜湊表。
就像上例中所示有衝突直接在其後再插入乙個形成鍊錶。
4 公共溢位區法
例:假設關鍵字集合為,同樣使用除留餘數法求雜湊表。
建立兩個表,乙個基本表,乙個溢位表,先將資料放入基本表若有衝突則按順序放入溢位表,在查詢時先查詢基本表再查詢溢位表,若都無則查詢失敗。
**
#include #include #define hashsize 12 //表長
#define nullkey -32768 //不會出現的值
typedef struct
hashtable;
//初始化雜湊表
int inithashtable(hashtable *h)
for(int i=0;ielem[i]=nullkey;
}return 0;
} //除留餘數法構造雜湊函式
int hash(int key)
//插入關鍵字到雜湊表
void inserthash(hashtable *h,int key)
h->elem[addr]=key;
}//在雜湊表查詢關鍵字
int searchhash(hashtable *h,int key)
}return addr;
} void print(hashtable *h)
printf("------------------------\n");
}int main()
; inithashtable(&h); //初始化雜湊表
for(i=0;i
print(&h);
//查詢資料
printf("請輸入查詢數字:\n");
scanf("%d",&j);
result=searchhash(&h,j);
if(result!=-1)
else
return 0;
}
資料結構 雜湊表
1.雜湊表的定義 元素的儲存位置和它的關鍵碼之間建立乙個確定的對應關係h,使得每個關鍵碼key和唯一的儲存位置h key 相對應。在查詢時,根據這個確定的對應關係找到給定值k的對映h k 若查詢集合中存在這個記錄,則必定在h k 的位置上,這種查詢技術稱為雜湊技術。採用雜湊技術將記錄儲存在一塊連續的...
資料結構 雜湊表
雜湊表的定義 雜湊表 hash table,也叫雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把 關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的 速度。這個對映函式叫做雜湊函式,存放 記錄的陣列叫做雜湊表。雜湊函式的析構方法 餘數法 取關鍵字被某個不大於雜...
資料結構 雜湊表
3 雜湊函式 數字分析法 根據關鍵碼在各個位上的分布情況,選取分布比較均勻的若干位組成雜湊位址。適用情況 能預先估計出全部關鍵碼的每一位上各種數字出現的頻度,不同的關鍵碼集合需要重新分析。4 雜湊函式 平方取中法 對關鍵碼平方後,按照雜湊表大小,取中間的若干位作為雜湊位址 平方後擷取 適用情況 實現...