哈希的应用
- STL中的unordered系列
- unordered_map
- 位图
- 布隆过滤器
- 海量数据面试题
STL中的unordered系列
c++11中提出的unordered系列,其底层结构都是用哈希桶实现的。
unordered_map
构造
函数申明 | 功能介绍 |
---|---|
可以使用迭代器构造,也可以使用拷贝构造,或者是初始化列表进行构造 |
容量
函数声明 | 功能介绍 |
---|---|
bool empty() const | 检测unordered_map是否为空 |
size_t size() const | 获取unordered_map的有效元素个数 |
迭代器
函数声明 | 功能介绍 |
---|---|
begin() | 返回unordered_map第一个元素的迭代器 |
end() | 返回unordered_map最后一个元素的下一个位置的迭代器 |
cbegin() | 返回unordered_map第一个元素的const迭代器 |
cend() | 返回unordered_map最后一个元素的下一个位置的const迭代器 |
元素访问
函数声明 | 功能介绍 |
---|---|
operator[] | 返回与key对应的value,没有的话则插入失败 |
注意:该函数中实际调用哈希桶的插入操作,用参数key与V()构造一个默认值往底层哈希桶中插入,如果key不在哈希桶中,插入成功,返回V(),插入失败,说明key已经在哈希桶中,将key对应的value返回。
查询
函数声明 | 功能介绍 |
---|---|
iterator find(const K& key) | 返回的是迭代器,返回key在哈希桶中的位置 |
size_t count(const K& key) | 返回的是key在哈希桶中的个数 |
修改
函数声明 | 功能介绍 |
---|---|
insert | 向容器中插入键值对 |
erase | 删除容器中的键值对 |
void clear() | 清空容器中有效元素 |
void swap(unordered_map&) | 交换两个容器中的元素 |
桶的操作
函数声明 | 功能介绍 |
---|---|
size_t bucket_count()const | 返回哈希桶中桶的个数 |
size_t bucket_size(size_t n)const | 返回n号桶中有效元素的个数 |
位图
位图就是用每一个比特位来存放某种状态,使用于海量数据,和数据无重复的场景。通常用来判断某个数据是否存在的。
位图的应用:
1.快速查找某个数据是否在一个集合中
2.排序+去重
3.求两个数据的交集、并集
4.操作系统中磁盘块的标记
面试题:
1.给定100亿个整数,设计算法找到只出现一次的整数?
2.给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?
3.位图应用变形:1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数