哈希表的三种数据结构

哈希表的三种数据结构

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()清空容器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值