ACM入门之【哈希】
哈希在競賽中也是一個(gè)很常用,且非常厲害的一個(gè)算法。
哈希的主要思想就是把一個(gè)東西轉(zhuǎn)換成一個(gè)大整數(shù),這樣比較兩個(gè)東西是否相等的就只要比較兩個(gè)整數(shù)是否相等就行了,
比較的時(shí)間復(fù)雜度是O(1)的。
舉一個(gè)比較常見的例子:比較倆字符串是否相等,我們可以將字符串變成一個(gè)值,然后直接比較這倆字符串的哈希值就行了。
可能你會(huì)有疑問?在c++中string 不是可以直接就比較了么? 為啥還要用哈希呢?
假如人家問的是倆矩陣是否相等呢?假如人家問這個(gè)矩陣是否在一個(gè)大矩陣中出現(xiàn)過呢?
那么如何存矩陣呢?我們就可以用二維哈希,將矩陣也映射成一個(gè)哈希值,這樣比較矩陣直接比較哈希值就行了。
其實(shí),通過上面你已經(jīng)對(duì)哈希有了一個(gè)初步的了解了。哈希它其實(shí)就是將一些特別難存的東西,通過某種手法變成一個(gè)唯一的值,
然后只需比較哈希值就行了。
哈希常見的幾種模型:
- 一維哈希(字符串)
- 二維矩陣哈希
核心思想:將字符串看成P進(jìn)制數(shù),P的經(jīng)驗(yàn)值是131,13331,233,2333,10007等質(zhì)數(shù) 取這些值的沖突概率低
取模的時(shí)候選一個(gè)較大的質(zhì)數(shù)避免沖突。
小技巧:取模的數(shù)用2^64,這樣直接用unsigned long long存儲(chǔ),溢出的結(jié)果就是取模的結(jié)果
一維哈希模板:
typedef long long int LL; const int M=233;//是我們自己選擇的進(jìn)制數(shù),一般可以選233,2333,10007等質(zhì)數(shù) const int mod=1e9+7;//一般選一個(gè)比較大的質(zhì)數(shù) LL get(string s)//獲取字符串對(duì)應(yīng)的哈希值 {LL sum=0;for(int i=0;i<s.size();i++) sum=(sum*M+s[i]-'a')%mod;return sum; } typedef unsigned long long int ull; const int N=1e5+10; const int M=233; ull h[N],base[N]; ull query(int l,int r)//獲取字符串[l,r]的哈希值 {return h[r]-h[l-1]*base[r-l+1]; } void init(string s)//初始化哈希 {int n=s.size();s="0"+s;//讓其下標(biāo)從1開始base[0]=1;for(int i=1;i<=n;i++){h[i]=h[i-1]*M+s[i];base[i]=base[i-1]*M;// base[i]=M^i} } ull merge(int l1, int r1, int l2, int r2) //求[l1,r1],[l2,r2]子串并的哈希值 {return query(l1, r1) * base[r2 - l2 + 1] + query(l2, r2); }字符串哈希入門:
P3370 【模板】字符串哈希
841. 字符串哈希
103. 子串查找
二維哈希模板
typedef long long int ll; const int N=1010; ll h[N][N],base1[N],base2[N]; int a[N][N],n,m; void init()//構(gòu)建 {base1[0]=base2[0]=1;for(int i=1;i<N;i++){base1[i]=base1[i-1]*131;base2[i]=base2[i-1]*233;}for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)h[i][j]=h[i][j-1]*131+a[i][j];//行哈希for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)h[i][j]=h[i-1][j]*233+h[i][j];//列哈希 } ll query(int x1,int y1,int x2,int y2)//查詢矩陣的哈希值 {return h[x2][y2]-h[x2][y1-1]*base1[y2-y1+1]-h[x1-1][y2]*base2[x2-x1+1]+h[x1-1][y1-1]*base1[y2-y1+1]*base2[x2-x1 + 1]; }二維哈希習(xí)題:
Matrix
矩陣
好的文章推薦:
哈希入門
哈希基礎(chǔ)例題
二維哈希
總結(jié)
以上是生活随笔為你收集整理的ACM入门之【哈希】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ACM入门之【二分】
- 下一篇: ACM入门之【高精度】