理论知识
一般哈希表都是用来快速判断一个元素是否出现集合里,要枚举的话时间复杂度是O(n),但如果使用哈希表的话, 只需要O(1)就可以做到。
● 哈希碰撞:映射到了同一个索引
● 拉链法:索引存链表头节点,发生冲突的元素都被存储在链表中
● 线性探测法:使用线性探测法,一定要保证tableSize大于dataSize
C++的set和map:
set:
集合 | 底层实现 | 是否有序 | 数值是否可以重复 | 能否更改数值 | 查询效率 | 增删效率 |
---|---|---|---|---|---|---|
std::set | 红黑树 | 有序 | 否 | 否 | O(log n) | O(log n) |
std::multiset | 红黑树 | 有序 | 是 | 否 | O(logn) | O(logn) |
std::unordered_set | 哈希表 | 无序 | 否 | 否 | O(1) | O(1) |
std::unordered_set底层实现为哈希表,std::set 和std::multiset 的底层实现是红黑树,红黑树是一种平衡二叉搜索树,所以key值是有序的,但key不可以修改,改动key值会导致整棵树的错乱,所以只能删除和增加。
map:
集合 | 底层实现 | key是否有序 | key是否可以重复 | key能否更改 | 查询效率 | 增删效率 |
---|---|---|---|---|---|---|
std::map | 红黑树 | 有序 | 否 | 否 | O(log n) | O(log n) |
std::multimap | 红黑树 | 有序 | 是 | 否 | O(logn) | O(logn) |
std::unordered_map | 哈希表 | 无序 | 否 | 否 | O(1) | O(1) |
数组代替哈希表
常常是在哈希表的tablesize已经被确定的时候使用,因为开数组时需要声明数组大小
1002. 查找共用字符
set
使用了unordered_set来判断一个数是否重复出现过。
202.快乐数
map
出现次数
1.两数之和