Day6 哈希表Part1
哈希表基础
基本概念
- 哈希表又称为散列表,是根据关键码的值而直接进行访问的数据结构。
- 哈希表解决的问题是:快速判断一个元素是否在一个集合中,
- HashFunction = HashCode(name) % tableSize。也就是说,把各种数据格式(name)转化为索引,就可以实现快速访问了。
- 当不同的数据被映射到同一个哈希表上时,出现
哈希碰撞
,解决哈希碰撞的基本方法有:
- 拉链法:把发生冲突的元素存储到链表中。
- 线性探测法:向下找一个空位存放对应信息。
常见哈希结构
集合 | 底层实现 | 是否有序 | 数值是否可以重复 | 能否更改数值 | 查询效率 | 增删效率 |
---|---|---|---|---|---|---|
std::set | 红黑树 | 有序 | 否 | 否 | O(log n) | O(log n) |
std::multiset | 红黑树 | 有序 | 是 | 否 | O(logn) | O(logn) |
std::unordered_set | 哈希表 | 无序 | 否 | 否 | O(1) | O(1) |
映射 | 底层实现 | 是否有序 | 数值是否可以重复 | 能否更改数值 | 查询效率 | 增删效率 |
---|---|---|---|---|---|---|
std::map | 红黑树 | key有序 | key不可重复 | key不可修改 | O(logn) | O(logn) |
std::multimap | 红黑树 | key有序 | key可重复 | key不可修改 | O(log n) | O(log n) |
std::unordered_map | 哈希表 | key无序 | key不可重复 | key不可修改 | O(1) | O(1) |
- 是否有序:红黑树是一种平衡二叉树,树的节点是有序的,而哈希表的实现是无序的。
- 数值是否可以重复:只有multiset和multimap可以重复。
- 能否更改数值:三种实现都不能更改数值。
有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
示例 1: 输入: s = “anagram”, t = “nagaram” 输出: true
示例 2: 输入: s = “rat”, t = “car” 输出: false
1 | bool isAnagram(string s, string t) { |
核心就在于构造char
到int
的哈希映射。
两个数组的交集
给定两个数组,计算它们的交集。
此题用set不难实现,主要是学习一下STL的set容器以及方法。
1 | 构造函数 |
1 | vector<int> intersection(vector<int>& nums1, vector<int>& nums2) { |
核心在于运用set的自动去重功能。
但是这个题是可以展开思考的,如果交集是可重复集合,那么我们就可以构造unordered_map
来记录数组中每个元素出现的次数,首先记录一个数组中元素出现的次数,然后遍历另一个数组中的元素,将非零的计数器的值减1并放入结果vector中即可。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Hello There!
评论