自从学了字符串hash之后,感觉万物皆可hash…
字符串hash就是将一个字符串转变为一个整数。判断两个数是否相等明显比判断两个字符串相等在时间复杂度上要低很多。
hash函数
散列函数(英语:Hash function)又称散列算法、哈希函数。hash函数的返回值为hash值,也称散列值。
举个例子
假如你要在你们班找一个叫 “abcdefghigklmnopqrstuvwxyz”的同学,你总不能遇到一个同学,你就问你是不是叫“…”,问了2,3个,你恍然大悟,我可以问序号呀,然后你查了一下,这个同学的序号是 1,你再去问你的序号是不是 1?
明显方便了许多。
比如字符串匹配中“abcdef”的hash值为123456,你如果通过字符串比为O(6),用户hash值比 只需要 1次。
这个是我经常用的模板。
int seed = 133331;
#define MOD 0x7FFFFFFF
// s为传入的字符串
int front_hash(char s[])
{
unsigned int hash = 0;
int i = 0;
while(s[i]) hash = hash * seed + s[i++];
return (hash & MOD);
}
解释一下
s 为传入的字符串,遍历整个字符串,计算出 hash值。
散列冲突
散列冲突:两个不同的字符串的hash值相同,称这种情况为散列冲突。
举个例子:当 2 个人的序号是同一个人。你通过学号找,就会发生冲突。
当数据量很大时,难免会出现散列冲突,不同的散列函数发生的散列冲突的概率是不同的,越好的散列函数出现的散列冲突的可能性就越小。
有兴趣的可以了解一下各种字符串hash函数的比较
不同的hash函数都是为了解决这个问题,除此之外,还可以采用双hash解决(一般不会)。
hash的用处
1.字符串匹配
2.可以用来求最长回文串。
3.ac自动机
4.后缀数组(没想到吧)
例题
单词数
Crazy Search
Oulipo
高手之在一起
合并序列
仓谷里的回声
String
温馨提示:如果遇到判重,不要用set,会超时.