字串hash無論是在acm競賽中還是在工程中都有著廣泛的應用,所以很有必要掌握好它的用法。主要分為兩個部
分:hash對映和衝突處理。而本文主要來詳細講解hash對映的方法及應用,下篇文章將會介紹如何處理衝突。
對於字串hash來說都是把字串對映為乙個整數,這一步是通過hash函式來進行的。常用的hash函式具體有:
sdbmhash,rshash,jshash,elfhash,bkdrhash,djbhash等等。
接下來只詳細介紹elfhash函式的原理
及應用。
elfhash函式的**如下
[cpp]view plain
copy
unsigned int elfhash(char *str)
} return h & 0x7fffffff;
}
接下來我會詳細**它的原理。
(1)h = (h << 4) + *str++; 把當前的字元的ascii存入h的低4位。
(2)x = h & 0xf0000000l; 取出h中最高4位,0xf0000000l地代表28~31這4位是1,其餘後28位是0。
(3)如果最高4位不為0,那麼說明字元多於7個,現在正在存第8個,如果不處理再加下乙個字元時,第乙個字元會
被移出,因為1~4位剛剛加入了新字元,所以不能>>28,而是>>24。
(4)h &= ~x; 表示把h的高4位清零。
題目:
題意:給定一些數字,可能有前導零,求這些數字中出現次數最多的數字的次數。
**:
[cpp]view plain
copy
#include
#include
#include
using
namespace std;
const
int n = 1000005;
const
int mod = 100007;
int hash[n], cnt[n];
unsigned int elfhash(char *str)
} return h & 0x7fffffff;
} int hashhit(char *str)
else cnt[t]++;
return cnt[t];
} int main()
printf("%d\n", ans);
} return 0;
}
問題:為什麼hash表的size總是擴充套件成乙個素數?
分析:素數可以有效地減少衝突。具體原因如下
假設hash表的大小為size,這是乙個合數,即有size = a * n,當有hash值為hashcode = b * n,則
hashcode取模之後有
因為hashcode取值就有了
白兔的字串 字串hash
原題 一道典型的字串hash,至於hash,這裡講的非常好。一開始用map函式一直超時,後來改用unordered map就過了,至於這2個map的區別,這裡講的挺清楚的。之後去查了一下其它方法,發現還有一種方法是手寫map函式 強 指明 大佬 unordered map是跑了600ms,重寫跑了1...
Hash 字串 字串雜湊
luo gu luogu luogup 3370 p3370 p337 0如題,給定n個字串 第i個字串長度為mi,字串內包含數字 大小寫字母 請求出n個字串中共有多少個不同的字串。第一行包含乙個整數n,為字串的個數。接下來n行每行包含乙個字串,為所提供的字串。輸出包含一行,包含乙個整數,為不同的字...
兔子與兔子(字串hash)
很久很久以前,森林裡住著一群兔子。有一天,兔子們想要研究自己的 dna 序列。我們首先選取乙個好長好長的 dna 序列 小兔子是外星生物,dna 序列可能包含 26 個小寫英文本母 然後我們每次選擇兩個區間,詢問如果用兩個區間裡的 dna 序列分別生產出來兩隻兔子,這兩個兔子是否一模一樣。注意兩個兔...