1. 雜湊表是用來解決什麼問題的?
解決查詢效率問題:查詢效率依賴於查詢過程中進行比較的次數,通過(雜湊函式)構建一種對應關係,使得可以不比較直接找到要找的記錄。
就比如乙個二維陣列,陣列的值和下標是一一對應的,知道下標就能找到對應的值;還比如乙個函式,乙個x對應乙個y,知道 x 和 f(x) 就能得到 y 。當多個 x 對應乙個 y 的時候就是發生了雜湊衝突。
2. 雜湊表:
根據設定的hash函式h(key)【構造】和處理衝突的方法【處理衝突】,將一組關鍵字映像到乙個有限的連續的位址集(區間)上,並以關鍵字在位址集中的「像」【x】作為記錄在表中儲存的位置,這種表便稱為雜湊表,這一映像過程【構造h(key)過程】稱為雜湊造表或雜湊,所得儲存位置稱為雜湊位址或雜湊位址。【就像函式對映】
h(key) = key 或 h(key) = a*key+b
一次函式,key和h(key)一一對應,也就是說位址集和和關鍵字集合的大小相同。
好處是不會帶來雜湊衝突。
缺點是實際中能應用的地方較少。
雜湊表長m,p<=m; h(key)=key % p ; 可以直接使用也可以在平方取中或摺疊法後使用。
p:雜湊表的桶
p的選擇:一般取p為質數或 不包含小於20的質因數的合數。選擇質數可以最大程度減少衝突的概率,使得雜湊後資料分布更加均勻。使用合數可能會造成資料分布集中在某些點上,影響雜湊表的效率。
分析關鍵字的特徵。
h(key) = random(key)
非常適合關鍵字字數不相等的情況
考慮因素:
計算雜湊函式所用時間;
關鍵字長度;
雜湊表大小;
關鍵字分布情況;
記錄的查詢頻率
hi =(h(key)+di ) mod m , i=1,2,3…k(k<=m-1);
m:表示表長
di :表示增量序列,有三種取法
線性探測再雜湊 di =1,2,3…m-1
帶來了 二次聚集 :兩個第乙個雜湊位址不同的記錄爭奪同乙個後繼位址的現象
只要雜湊表沒有填滿,總能找到乙個不發生衝突的位置
二次探測再雜湊 di =12,-12,22,-22,32,-32…+k2 ,-k2 , k<=m/2
要求表長m滿足是 4*j+3(j是整數)的素數
偽隨機探測再雜湊 di = random(seed)
hi = rhi (key) , i=1,2,3…k
產生位址衝突時換乙個函式計算
不易產生聚集 (不易不是不會)
耗費計算時間(會有好多函式呀)
將所有關鍵字為同義詞的記錄儲存在同一線性表中(鍊錶),可以插入在表頭、表尾或中間,就是要保持記錄在鍊錶中是按照關鍵字有序排列的。
基本表 :雜湊函式值域[0,m-1],基本表[0…m-1]
溢位表一旦關鍵字是基本表中關鍵字的同義詞了(產生衝突),就把這個關鍵字放到溢位表中
①表中儲存了太多的鍵值對 && ②表已滿
隨著操作的不斷執行, 雜湊表儲存的鍵值對會逐漸地增多或者減少, 為了讓雜湊表的負載因子(load factor)維持在乙個合理的範圍之內, 當雜湊表儲存的鍵值對數量太多或者太少時, 程式需要對雜湊表的大小進行相應的擴充套件或者收縮。
擴充套件和收縮雜湊表的工作可以通過執行 rehash (重新雜湊)操作來完成
c++中
負載因子 loadfactor = 表中元素/表長
當 loadfactor<1 時才能夠向表中新增記錄,當 loadfactor=1 時,就要進行rehash。rehash會模仿c++的擴容機制,每次發現 loadfactor=1 時,就開闢乙個原來桶陣列的兩倍空間,稱為新桶陣列,然後把原來桶陣列中的記錄全部重新雜湊到新的桶陣列中。
①擴容②由於表長度改變了所以要重新hash
資料結構 雜湊表
1.雜湊表的定義 元素的儲存位置和它的關鍵碼之間建立乙個確定的對應關係h,使得每個關鍵碼key和唯一的儲存位置h key 相對應。在查詢時,根據這個確定的對應關係找到給定值k的對映h k 若查詢集合中存在這個記錄,則必定在h k 的位置上,這種查詢技術稱為雜湊技術。採用雜湊技術將記錄儲存在一塊連續的...
資料結構 雜湊表
雜湊表的定義 雜湊表 hash table,也叫雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把 關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的 速度。這個對映函式叫做雜湊函式,存放 記錄的陣列叫做雜湊表。雜湊函式的析構方法 餘數法 取關鍵字被某個不大於雜...
資料結構 雜湊表
3 雜湊函式 數字分析法 根據關鍵碼在各個位上的分布情況,選取分布比較均勻的若干位組成雜湊位址。適用情況 能預先估計出全部關鍵碼的每一位上各種數字出現的頻度,不同的關鍵碼集合需要重新分析。4 雜湊函式 平方取中法 對關鍵碼平方後,按照雜湊表大小,取中間的若干位作為雜湊位址 平方後擷取 適用情況 實現...