哈希表理论基础
- 用来快速判断某个原生是否在集合内(快速查找)
- 哈希函数将传入的key映射到符号表的索引上
- 哈希冲突解决多个key映射到符号表相同索引上的问题,常用的解决办法有拉链法和线性探测法
- c++ stl中有四种常见的哈希结构
- 数组
std::array
- 集合
std::set
std::multiset
std::unordered_set
- 映射
std::map
std::multimap
std::unordered_map
「虽然看起来map是万能的,但也要知道什么时候用数组,什么时候用set」
集合 | 底层实现 | 是否有序 | 增删查的效率 |
---|
std::set | RB-Tree | 是 | O(logn) |
std::multiset | RB-Tree | 是 | O(logn) |
std::unordered_set | Hash | 否 | O(1) |
std::unordered_multiset | Hash | 否 | O(1) |
映射 | 底层实现 | 是否有序 | 增删查的效率 |
---|
std::map | RB-Tree | 是 | O(logn) |
std::multimap | RB-Tree | 是 | O(logn) |
std::unordered_map | Hash | 否 | O(1) |
std::unordered_multimap | Hash | 否 | O(1) |
数组作为hash 表 - 表长固定且密集
242 - 有效的字母异位词
383 - 赎金信
set作为hash表 - 只要key不要value
349 - 两个数组的交集
202 - 快乐数
map作为哈希表
- 数组的大小是受限制的,而且如果元素很少,而哈希值太大会造成内存空间的浪费。
- set是一个集合,里面放的元素只能是一个key
1 - 两数之和
454 - 四数相加II
用hash可以解决,但是效率低且复杂 - 双指针
15 - 三数之和
18 - 四数之和
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。