![597b866c799fb60cf3fd6dafaece7555.png](https://i-blog.csdnimg.cn/blog_migrate/c83244cf1aa82e4e1b29d11f08906954.jpeg)
<如果你已经学习过哈希有关知识,也推荐看一下后面的补充知识及题目>
问题引出:假设有一个集合
假设集合中有
示例代码如下:(领会精神QAQ)
Value
假设
假设两个
举个例子:(课件来自CMU15-445,Hash)
![7f1d4ba1f52e613ed4e0942f7004b8a9.png](https://i-blog.csdnimg.cn/blog_migrate/c11264617aa85f8fc3d14ef17ea43538.jpeg)
![e0ec38adcb5f131efd64a55fba7b5bc0.png](https://i-blog.csdnimg.cn/blog_migrate/54cf8422fc8effa181df6ce94d63c9ca.jpeg)
![923bae00cd8126bf2922f154666b0af6.png](https://i-blog.csdnimg.cn/blog_migrate/3894134e9634eed7335f4ca88931dc52.png)
这样问题就解决了。在查询一个
事实上哈希函数是自己定义的……所以只要计算起来比较方便,碰撞次数又比较少就可以啦。
示例代码如下(领会精神QAQ):
pair
上面的思路仅能容纳
List<pair<Key, Value>> hash_map[N];
int F(Key x){ ... } //details omitted.
void init(){
for(Key x, Value y : S)
{
int hash_position = F(x);
hash_map[hash_position].insert( {x, y} );
}
}
void Insert_into_hashmap(Key x, Value y)
{
int hash_position = F(x);
hash_map[hash_position].insert( {x, y} );
}
Value getvalue(Key x) {
return bullet[F(x)].second;
}
由哈希函数所想到的:(与哈希表无关)
题目:给一个字符串
考虑构造一个哈希函数
(领会精神……QAQ)
int
通过自然溢出,把一个string类型的值经过
但由于哈希函数存在碰撞,参考字符串哈希的方法,可以采取双哈希函数的做法,只有两个函数的值都是相同的时候,才认为两个字符串是相同的。
那么做法也就呼之欲出了:首先计算
补充知识:
<为了不让已经会hash表的童鞋直接跑路,强行去查了查这是啥>
<似乎国内的没啥>
ROBIN HOOD HASHING:基于(Linear Probe Hashing)的改进算法。
由于在最差情况下,Linear Probe Hashing的策略取出一个
比如
这似乎没什么,但这样会使得之后能映射到
为了平均寻址次数,有一个叫ROBINHOOD HASHING的方法出现了:
其主旨含义是"劫富济贫"。在数组中,额外记录一个数值代表寻址次数,当新加入一个元素
题外话:在OI/ACM中,有用的不是哈希表本身,而是哈希函数的意义。可以通过(双)哈希去快速判断两个对象(字符串,矩阵,树...)是否相等。
注意树哈希有特别的方式……需要以后另开坑讲了。。。QAQ
推荐题目:
为了不影响选手的做题体验……我只是给出了"哈希"的关键字,所以也不算剧透题解啦(强行掩饰)
另外后面的两个题可能稍微有点难了……QAQ
大视野在线测评·欢迎您(BZOJ)
「BZOJ2351」 Matrix
「BZOJ3555」[Ctsc2014] 企鹅QQ
「BZOJ4754」独特的树叶
「BZOJ4892」[Tjoi2017]dna
ps:微信公众号是同名的,欢迎关注~