這是查詢這個知識點的最後乙個部分,個人感覺這部分真的很好理解,就簡單的邏輯思維,不需要繞彎,基本上就可以解決大部分的題目。合理的應用查詢的總體效率也是很高的。主要說三個模組的事情:構造方法,處理衝突方法,查詢。
那麼引入一下,前面我們說了順序表的查詢、樹表的查詢,但是我們發現,就算再優化,它們的時間複雜度最小也是log2n級別的。那麼我們肯定是希望能找到更優的演算法,最好就是n(1)級別的,如果能利用公式直接的求解,那麼不是直接就可以找到了,不需要依次比較了嗎?所以就有了我們要說的雜湊表的查詢(也叫雜湊表)。來看看基本的概念:
雜湊表(hash table,也叫雜湊表),是根據關鍵碼值(key value)而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。構造方法有很多,數字分析法、平方取中法、摺疊法、除留餘數法(這個是最常用的)。只需要思考一下就知道我們構造其實就是制定乙個規則,使我們的元素可以按照這個規則查詢到,當然,我們還可以有其他的方法(例如:你自己定義乙個高等數學的計算公式,結構不一樣,依舊可以對映到雜湊位址上)。給定表m,存在函式f(key),對任意給定的關鍵字值key,代入函式後若能得到包含該關鍵字的記錄在表中的位址,則稱表m為雜湊(hash)表,函式f(key)為雜湊(hash) 函式。
1、除留餘數法
這個是最常用的,理解也很簡單。假設雜湊表表長為m,選擇乙個不大於m的數p(這裡我們可以思考,最好的p應該是小於等於m的質數),用p去除關鍵字,除后得到餘數為雜湊位址,即
h(key) = key%p
聰明的你會發現,用上述方法肯定會出現衝突,什麼是衝突呢,就是我們兩個元素根據雜湊函式計算得到的雜湊位址是一樣的,這個時候怎麼辦呢?那麼肯定需要乙個統一的原則去處理這樣的衝突,於是我們就有了:開放位址法和鏈位址法去處理。
這個是最常用的,很好理解,就是當發生衝突的時候,我們都統一向前加一(或者向後加一),知道不衝突結束。
2)二次探測法:
其實和上述的一樣,但是加減的規則邊了,這裡的加減步長不再是線性探測法的±1,而是d=12,-12,22,-22,…
3)偽隨機探測法:
這個也很好理解,就是隨便乙個隨機值(例如9,而我們之前的p=11),當我們衝突的時候,它的計算方式就是(9+衝突位址)%11,得到新的位址。
說到這裡,你一定有很多其他的解決衝突的方式(現實應用的時候其實我們規定了很多的限制去減少這樣的衝突)。
2、鏈位址法
既然你理解了上面的兩個部分,那麼查詢對你來說也一定很容易
【演算法描述】
1.給待查詢的關鍵字key,根據造表時設定的雜湊函式計算h0=h(key);
2.若單元h0為空,則所查詢元素不存在;
3.若單元h0中元素的關鍵字為key,則查詢成功;
4.否則重複解決衝突的過程(這個方法很多,給出的**演示裡面使用的衝突解決方法是線性探測法)。
**演示:
#include
using
namespace std;
//演算法7.10 雜湊表的查詢
//- - - - -開放位址法雜湊表的儲存表示- - - - -
#define m 16
//雜湊表的表長
#define nullkey 0
//單元為空的標記
struct hashtable
;// 演算法7.10為雜湊表查詢的演算法,採用線性探測法處理衝突。
// 【演算法實現】
inth
(int key)
intsearchhash
(hashtable ht,
int key)
//for
return-1
;}//else
}//searchhash
void
main()
; hashtable ht[m]
;for
(int i=
0;i<
16;i++
) result=
searchhash
(ht,55)
;if(result!=-1
)else
}
查詢 雜湊表查詢(雜湊表)
1 雜湊表查詢定義 雜湊技術是在記錄的儲存位置和它的關鍵字之間建立乙個確定的對應關係f,使得每個關鍵字key對應乙個儲存位置f key 查詢時,根據這個確定的對應關係找到給定值key的對映f key 若查詢集合中存在這個記錄,則必定在f key 的位置上。採用雜湊技術將記錄儲存在一塊連續的儲存空間中...
6查詢 3雜湊表
struct hashtable void newnode int i,int key val存第cnt個狀壓值的方案數 bigint operator const int hash 第i位的鍵就是 hash,表明此狀態已存在,讀出位置i是第k對映 如果hash表第i位已被打入但是其狀態值不是 ha...
查詢 之 雜湊表查詢(雜湊表)
雜湊技術是在記錄的儲存位置和它的關鍵字之間建立乙個確定的對應關係f,使得每個關鍵字key對應乙個儲存位置f key 這裡對應關係f稱為雜湊函式,又稱為雜湊 hash 函式。採用雜湊技術將記錄儲存在一塊連續的儲存空間中,這塊連續儲存空間稱為雜湊表或雜湊表 hash table 雜湊技術既是一種儲存方法...