哈希表(一)—— 闭散列 / 开放地址法的模拟实现

文章介绍了哈希表的基础知识,包括使用哈希函数将值转换为数组索引,以及处理冲突的线性探测法。详细阐述了线性探测法的查找、插入和删除操作,并提及了二次探测法作为冲突解决的一种变体。此外,还讨论了处理字符串和自定义类型哈希的方法,如使用仿函数进行哈希计算。

哈希表的基本思路是通过某种方式将某个值映射到对应的位置,这里的采取的方式是除留余数法,即将原本的值取模以后再存入到数组的对应下标,即便存入的值是一个字符串,也可以根据字符串哈希算法将字符串转换成对应的ASCII码值,然后再取模。

如果某个位置已经存了其他数据,那么就需要找一个空闲位置来存放当前数据,我们把这种方式称为闭散列(或者开放地址法)


         目录

1、线性探测法

(1) 基本思路

(2) 哈希表数据存储结构

(3) 查找实现

(4) 插入实现

(5) 移除实现

2、二次探测法

3、细节处理:遇到string或者自定义类型如何处理


1、线性探测法

(1) 基本思路

如果当前位置已经存了其他数据,那就看下一个位置是否空着,如果空着就存,被占了就继续看下一个位置,每次检索的步长为1,这种方式检索方式称为“线性探测法”。

假设第 start 个位置已经存了其他数据,那么后续检索的位置是 start + i,i = 0,1,2 ...

(2) 哈希表数据存储结构

哈希表每个位置可以只存一个数据,也可以存键值对,除此之外,还需要加一个状态标记。以查找为例,查找时,一般是遇到空就停下来,如果在找到某个数之前就遇到了空,就会导致后面的数据遍历不到;如果全部遍历一遍,效率太低。

因此,我们可以为表中的每个数据添加状态标记,只要不是 EMPTY 状态,就一直搜索。

enum Status
{
    EXIST,
    EMPTY,
    DELETE
};

template <class K, class V>
struct HashData
{
    pair<K, V> _kv;
    Status _status = EMPTY;     // 初始化缺省为 EMPTY
};

(3) 查找实现

HashData<K, V> *Find(const K &key)
{
    if (_tables.size() == 0)
    {
        return nullptr;
    }

    HashFunc hf;
    size_t start = hf(key) % _tables.size();    // 这里的 size() 是哈希表的有效数据个数
    size_t i = 0;
    size_t index = start;
    // 线性探测 or 
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值