哈希表的三种数据结构
1.数组
当题目限制了数值的大小,数值差异不大,分布比较密集时可以使用数组。
如果哈希值比较少并且跨度非常大,使用数组就会有空间上的浪费。
2.set
在C++中,set有std::set、std::multiset和std::unordered_set。std::set和std::multiset的底层实现是红黑树,unordered_set底层实现是哈希表。unordered_set的增删效率是O(1),所以我们一般使用unordered_set。
unordered_set读写效率高,key无序,数据不重复。unordered_set存储的是value而不是<key,value>。
使用set的cpp代码:
int num: set用来遍历,set.insert()用来插入。
set.count(num)返回set中num的个数。
// LeetCode 2215.找出两数组的不同
class Solution {
public:
vector<vector<int>> findDifference(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> set1, set2;
for (int i = 0; i < nums1.size(); i++) set1.insert(nums1[i]);
for (int i = 0; i < nums2.size(); i++) set2.insert(nums2[i]);
vector<vector<int>> ret(2);
for (int num : set1) if (!set2.count(num)) ret[0].push_back(num);
for (int num : set2) if (!set1.count(num)) ret[1].push_back(num);
return ret;
}
};
3.map
在C++中,set有std::map、std::multimap和std::unordered_map。std::map和std::multimap的底层实现是红黑树,unordered_map底层实现是哈希表。unordered_map的增删效率是O(1),所以我们一般使用unordered_map。
unordered_map读写效率高,key无序,数据不重复。unordered_map存储的是<key,value>。
使用map的cpp代码:
auto x用来遍历,x.first表示key,x.second表示value。
map[],中括号内表示key,map[key]的结果是value。
map[key] = value
// LeetCode 1207.独一无二的出现次数
class Solution {
public:
bool uniqueOccurrences(vector<int>& arr) {
unordered_map<int, int> map1, map2;
for (int i = 0; i < arr.size(); i++) map1[arr[i]]++;
for (auto x: map1) map2[x.second]++;
return map1.size() == map2.size();
}
};
4.unordered_set和unordered_map的常用操作:
函数 | 作用 |
---|---|
empty() | 容器为空返回true,否则返回false |
size() | 返回当前容器中元素的个数 |
find(key) | 查找值为key的元素,没找到则返回end() |
count(key) | 查找值为key的元素的个数 |
insert() | 添加新元素 |
erase() | 删除指定元素 |
clear() | 清空容器 |