《演算法筆記》學習筆記

2021-09-12 18:32:10 字數 2097 閱讀 1898

雜湊的定義與整數雜湊

雜湊:將元素通過乙個函式轉換為整數,使得該整數可以盡量唯一地代表這個元素。其中把這個轉換函式稱為雜湊函式h,也就是說,如果元素在轉換前為key,那麼轉換後就是乙個整數h(key).

常用的雜湊函式有:直接定址法、平方取中法、除留餘數法。

直接定址法:指恒等變換(即h(key)=key,直接把key作為陣列下標,是最常見最實用的雜湊應用)

平方取中法:指取key的平方的中間若干位作為hash值(很少用)。

除留餘數法:指把key除以乙個數mod得到的餘數作為hash值的方法,即h(key)=key%mod。通過這個雜湊函式,可以把很大的數轉換為不超過mod的整數這樣就可以將它作為可行的陣列下標。當mod是乙個素數時,h(key)能盡可能覆蓋[0,mod)範圍內的每乙個數。

通過除留餘數法可能會有兩個不同的數key1和key2,它們的hash值h(key1)與h(key2)是相同的,這樣當key1已經把表中位置為h(key1)的單元佔據時,key2便不能使用這個位置,這樣便產生了「衝突」。下面有三種方法來解決衝突:

(1)線性探查法(linear probing)

當得到key的hash值h(key),但是表中下標為h(key)的位置已經被某個其他元素使用了,那麼就檢查下乙個位置 h(key)+ 1是否被佔,如果沒有,就使用這個位置: 否則就繼續檢查下乙個位置(也就是將hash值不斷加1)。如果檢查過程中超過了表長,那麼就回到表的首位繼續迴圈,直到找到乙個可以使用的位置,或者是發現表中所有位置都已被使用。顯然,這個做法容易導致扎堆,即表中連續若千個位置都被使用,這在一定程度上會降低效率。

(2)平方探查法(quadratic probing)

在平方探查法中,為了盡可能避免扎堆現象,當表中下標為h(key的位置被佔時,將按下面的順序檢查表中的位置: h(key)+ 12、h(key)- 12、h(key)+22、h(key)- 22、h(key) +32、…如果檢查過程中h(key)+k2超過了表長tsize,那麼就把h(key)+k2對錶長tsize取模:如果檢查過程**現h(key) - k2

< 0的情況(假設表的首位為0),那麼將((h(key)- k2)% tsize+ tsize) % tsize作為結果(等價於將h(key) - k2不斷加上tsize直到出現第乙個非負數)。如果想避免負數的麻煩,可以只進行正向的平方探查。可以證明,如果k在[0, tsize)範圍內都無法找到位置,那麼當k≥tsize時,也一-定無法找到位置。

(3)鏈位址法(拉鍊法)

和上面兩種方法不同,鏈位址法不計算新的hash值,而是把所有h(key)相同的key連線成一條單鏈表。這樣可以設定乙個陣列link, 範圍是link[0]~ link[mod -1], 其中link[h]存放h(key)= h的一條單鏈表,於是當多個關鍵字key的hash值都是h時,就可以直接把這些衝突的key直接用單鏈表連線起來,此時就可以遍歷這條單鏈表來尋找所有h(key)= h的key。

當然,一般來說, 可以使用標準庫模板庫中的map 來直接使用hash的功能(c++11以後可以用unordered_map,速度更快),因此除非必須模擬這些方法或是對演算法的效率要求比較高,一般不需要自己實現上面解決衝突的方法。

字串hash初步

字串hash是指乙個字串s對映為乙個整數,使得該整數可能盡可能唯一地代表字串s。

給出n個字串(由恰好三位大寫字母組成),再給出m個查詢字串,問每個查詢字串在n個字串**現的次數。

#include

using namespace std;

const

int maxn=

100;

char s[maxn][5

],temp[5]

;int hashtable[26*

26*26+

10];int

hashfunc

(char s,

int len)

return id;

}int

main()

for(

int i=

0;i)return0;

}

《演算法筆記》學習筆記

排序是基礎演算法之一,屬於常見題型。由於考試中大部分只需要得到排序的最終結果,而不需要去寫排序的完整過程,因此推薦直接使用c語言中的庫函式qsort或者c 中的sort函式進行排序。排序題型的常用解題步驟 相關結構體的定義 對排序題,一定會在題目中給出個體的許多資訊,這些資訊在排序過程中一般都會用到...

演算法筆記學習筆記02

2.5 陣列 問題 a 習題6 4 有序插入 includeint main for i 0 i 10 i printf d n a i 問題 b 習題6 5 陣列元素逆置 includeint main 問題 c 習題6 6 楊輝三角 includeint main if n 2 return 0...

演算法筆記學習筆記03

2.6 函式 問題 a 習題7 5 字串逆序存放 include includevoid change char a,char b b len 0 int main 問題 b 習題7 7 複製字串中的母音字母 include includevoid select char a,char b b j ...