文章目录
哈希表的定义
哈希表是根据关键码的值而直接进行访问的数据结构。
给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希表,函数f(key)为哈希函数。
哈希表通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。
它牺牲了空间换取了时间,因为要使用额外的数组、set或map来存放数据,才能实现快速的查找。
当我们要快速判断一个元素是否出现在集合里时,就要考虑哈希法。
常见的哈希结构
常见的三种哈希数据结构:数组、set、map。
在C++中,set和map又分别被提供了三种数据结构。
set
std::unordered_set底层实现为哈希表,std::set 和std::multiset 的底层实现是红黑树,红黑树是一种平衡二叉搜索树,所以key值是有序的,但key不可以修改,改动key值会导致整棵树的错乱,所以只能删除和增加。
| 集合 | 底层实现 | 是否有序 | 数值是否可以重复 | 能否更改数值 | 查询效率 | 增删效率 |
|---|---|---|---|---|---|---|
| std::set | 红黑树 | 有序 | 否 | 否 | O(log n) | O(log n) |
| std::multiset | 红黑树 | 有序 | 是 | 否 | O(logn) | O(logn) |
| std::unordered_set | 哈希表 | 无序 | 否 | 否 | O(1) | O(1) |
当我们要用集合来解决问题时,优先用unordered_set,因为它的查询和增删效率最优,如果需要集合是有序的则用set,如果要求不仅有序还要有重复数据的话,就用multiset。
map
map 是一个key-value的数据结构,map中对key有限制,对value没有限制,因为key是使用红黑树存储的。
std::unordered_map 底层实现为哈希表,std::map 和std::multimap 的底层实现是红黑树。同理,std::map 和std::multimap 的key也是有序的。
| 映射 | 底层实现 | 是否有序 | 数值是否可以重复 | 能否更改数值 | 查询效率 | 增删效率 |
|---|---|---|---|---|---|---|
| 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) |
leetcode242.有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
class Solution {
public:
bool isAnagram(string s, string t) {
if(s.size() != t.size()) {
return false;
}
int record[26] = {
0};
for(int i = 0; i < s.size(); i++) {
record[s[i] - 'a']++;
}
for(int i = 0; i < t.size(); i++) {
record[t[i] - 'a']

文章介绍了哈希表的概念,强调其在快速查找中的作用,并通过列举几个LeetCode题目(如字母异位词、赎金信、数组交集等)展示了哈希表在解决编程问题时的高效性,特别是在处理集合和映射操作时。
最低0.47元/天 解锁文章
1557

被折叠的 条评论
为什么被折叠?



