【刷题总结】哈希系列问题

本文深入解析哈希表的概念和算法,包括哈希集合与哈希映射的实现,以及它们在C++中的API。通过实例探讨哈希在去重、查找、交集计算等场景的应用,并介绍哈希表设计、滑动窗口问题和键设计等问题。内容覆盖从基础到进阶,帮助读者理解并掌握哈希技术。

一、算法解析

有两种不同类型的哈希表:哈希集合和哈希映射。

  • 哈希集合集合数据结构的实现之一,用于存储非重复值
  • 哈希映射映射 数据结构的实现之一,用于存储(key, value)键值对

哈希表的关键思想是使用哈希函数将键映射到存储桶。更确切地说,

  1. 插入一个新的键时,哈希函数将决定该键应该分配到哪个桶中,并将该键存储在相应的桶中;

  2. 想要搜索一个键时,哈希表将使用相同的哈希函数来查找对应的桶,并只在特定的桶中进行搜索。哈希表是一种使用 哈希函数组织数据,以支持快速插入和搜索的数据结构。

负载因子:负载因子又叫装填因子,是哈希表的一个重要参数,它反映了哈希表的装满程度。实际利用桶的个数 与 桶的总数 的比值,称为负载因子。随着插入的数据量的增加,计算机会逐渐增加桶的个数,并选择合适的哈希函数,使得数据经过映射之后能均匀地分布在桶中

二、解题模板

1、C++ 内相关API

- unordered_set 无序的set
- unordered_map 无序的map
- set 按key排序的set
- map 按key排序的map

(1)哈希集合

哈希集合是集合的实现方式之一,采用set/ unordered_set实现,它是一种存储 不重复值 的数据结构。

#include <unordered_set>               

int main() {
    // 1. 初始化哈希集
    unordered_set<int> hashset;   
    // 2. 新增键
    hashset.insert(3);
    hashset.insert(2);
    hashset.insert(1);
    // 3. 删除键
    hashset.erase(2);
    // 4. 查询键是否包含在哈希集合中
    if (hashset.count(2) <= 0) {
        cout << "键 2 不在哈希集合中" << endl;
    }
    // 5. 哈希集合的大小
    cout << "哈希集合的大小为: " << hashset.size() << endl; 
    // 6. 遍历哈希集合
    for (auto it = hashset.begin(); it != hashset.end(); ++it) {
        cout << (*it) << " ";
    }
    cout << "在哈希集合中" << endl;
    // 7. 清空哈希集合
    hashset.clear();
    // 8. 查看哈希集合是否为空
    if (hashset.empty()) {
        cout << "哈希集合为空!" << endl;
    }
}

(2)哈希映射

哈希表的操作:哈希表 是用来存储 (key, value) 键值对的一种实现。用map/unordered_map实现

#include <unordered_map>                

int main() {
    // 1. 初始化哈希表
    unordered_map<int, int> hashmap;
    // 2. 插入一个新的(键,值)对
    hashmap.insert(make_pair(0, 0));
    hashmap.insert(make_pair(2, 3));
    // 3. 插入一个新的(键,值)对,或者更新值
    hashmap[1] = 1;
    hashmap[1] = 2;
    // 4. 获得特定键对应的值
    cout << "The value of key 1 is: " << hashmap[1] << endl;
    // 5. 删除键
    hashmap.erase(2);
    // 6. 检查键是否存在于哈希表中
    if (hashmap.count(2) <= 0) {
        cout << "键 2 不在哈希表中" << endl;
    }
    // 7. 哈希表的大小
    cout << "哈希表的大小为: " << hashmap.size() << endl; 
    // 8. 遍历哈希表
    for (auto it = hashmap.begin(); it != hashmap.end(); ++it) {
        cout << "(" << it->first << "," << it->second << ") ";
    }
    cout << "在哈希表中" << endl;
    // 9. 清空哈希表
    hashmap.clear();
    // 10. 检查哈希表是否为空
    if (hashmap.empty()) {
        cout << "哈希表为空!" << endl;
    }
}

2、使用哈希集合查重

由于哈希集合中的元素是 不重复的,因此可以使用哈希集合来判断是否包含重复元素。伪代码模板:

//使用哈希集合寻找重复元素的模板
bool findDuplicates(vector<Type>& keys) {
    // 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值