雜湊是常用的演算法思想之一
應用如,給出n個正整數,再給出m個正整數
問:m個數中的每個數是否在n個數中出現過
如果n,m<=10^5,可以用遍歷來做,但時間複雜度很大
這時就可以用空間換時間
即設定乙個bool型陣列hash table[100010],
這樣在一開始讀入n個正整數時就進行預處理
**:#include#define maxn 100010
bool hashtable[maxn]=;
int main()
;int main()
{ int n,m,x;
scanf("%d%d",&n,&m);
for(int i=0;i以上兩個問題都有乙個特點
就是直接把輸入的數作為陣列下標來對這個數的性質 進行統計
這是乙個很好的用空間換時間的策略
還有以上題目的每個數都不會超過10^5
因此直接作為陣列下標是可行的
但是如果輸入的可能是10^9大小的整數
或者甚至是乙個字串
就不能直接將他們作為下標了
此時就要用到hash
即為「將元素通過乙個函式轉化為整數,使得該整數可以盡量唯一地代表這個元素」
元素在轉換前為key,轉換後就是乙個整數h(key)
對於key是整數的情況,常用的雜湊函式
①直接位址法
a恒等變換
即h(key)=key(開頭兩個應用,陣列下標)
b線性變換
h(key)=a*key+b
②平方取中法
指取key的平方的中間若干位作為hash值(很少用)
③除留餘數法
把key除以乙個數mod得到的餘數作為hash的方法
h(key)=key%mod
通過這個雜湊函式,可以將很大的數轉換為不超過mod的整數
這樣就可以將它作為可行的陣列下標
(注意:表長tsize必須不小於mod,不然會產生越界)
顯然,當mod是乙個素數時
h(key)能盡可能覆蓋[0,mod)範圍內的每乙個數
因此一般為了方便起見
下文中取tsize是乙個素數
而mod直接取成與tsize相等
但是,通過除留餘數法可能會有兩個不同的數key1,key2
它們的hash值h(key 1)與h(key 2)是相同的
這樣當key1已經把表中位置為h(key 1)的單位佔據時
key2便不能再使用這個位置了
我們把這種情況叫做衝突
以下三種解決衝突的方法:
(其中第一種和第二種都計算了新的hash值,又稱為開放定址法)
①線性探查法
當得到key的hash值h(key)
但是表中下標為h(key)的位置已經被某個其他元素使用了
那麼就檢查下乙個位置h(key)+1是否被佔
如果沒有就使用這個位置
否則就繼續檢查下乙個位置(也就是hash值不斷+1)
如果檢查過程中發現超過了表長
那麼就回到表的首位繼續迴圈
直到找到乙個可以使用的位置
或者發現表中的所有位置都已被使用
顯然,這個方法容易導致扎堆
即表中連續若干個位置都被使用
這在一定程度上會降低效率
②平方探測法
為了盡可能避免扎堆現象
當表中下標為h(key)的位置被佔時
將按下面的順序檢查表中的位置
h(key)+1^2、h(key)-1^2、h(key)+2^2、h(key)-2^2、h(key)+3^2……
如果檢查過程中h(key)+k^2超過了表長tsize
那麼就把h(key)+k^2對錶長tsize取模
如果檢查過程中出現h(key)-k^2<0的情況(假設表的首位是0)
那麼將((h(key)-k^2)%tsize+tsize)%tsize作為結果
等價於將h(key)-k^2不斷加上tsize直到出現第乙個非負數
如果想要避免負數的麻煩
可能只進行正向的平方探查
可以證明
如果k在[0,tsize)範圍內都無法找到位置
那麼當t>=tsize時,也一定無法找到位置
③鏈位址法
此方法不和以上兩種方法一樣
不計算新的hash值
而是把所有h(key)相同的key連線成一條單鏈表
這樣可以設定乙個陣列link
範圍是link[0]~link[mod]
其中link[h]存放h(key)=h的一條單鏈表
於是當多個關鍵字key的hash值都是h時
就可以直接把這些衝突的key直接用單鏈表連線起來
此時就可以遍歷這條單鏈表來尋找所有h(key)=h的key
一般來說,直接使用map使用hash的功能
因此除非必須模擬這些方法或是對演算法的效率要求比較高
一般不需要自己實現上面解決衝突的方法
知識點來自於《演算法筆記》
Hash 雜湊 雜湊 基礎知識梳理
字典的兩種描述方法 跳表和雜湊 hash 限制適用範圍 有序陣列 採用雜湊技術將記錄儲存在一塊連續的儲存空間中,這塊連續的儲存空間愛你被稱為雜湊表或者雜湊表。雜湊技術是在記錄的儲存位置和他的關鍵字之間建立乙個確定的對應關係f 雜湊函式 使得每個關鍵字key對應乙個儲存位置f key 根據這個對應關係...
Hash 雜湊 雜湊
hash 一種用於查詢的資料結構 雜湊查詢的前提是已經一定的規則方法建好了雜湊表。基本思想是 關鍵字 位址轉換法 以資料物件的關鍵字為自變數,通過乙個確定的函式關係h,計算出對應的函式值h key 把這個值解釋為資料物件的儲存位址,並按此存放,即儲存位置 h key 關鍵 1.構造好的雜湊函式 2....
雜湊(hash 雜湊表)
可以認為雜湊有著陣列的思想,它將所有的資料段拼成乙個陣列 順序表 進行儲存,通過雜湊函式,可以基本上以o 1 的時間複雜度來查詢和儲存資料。通過資料段中的唯一關鍵字 key 經過某種演算法,得出此資料段在整個雜湊陣列 順序表 中的的下標,然後直接取元素即可。有資料結構如下 資料段 key,value...