字串Hash的原理與應用

2021-07-25 05:34:43 字數 2370 閱讀 8239

字串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~314位是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 序列分別生產出來兩隻兔子,這兩個兔子是否一模一樣。注意兩個兔...