【 C++ 】闭散列哈希表的模拟实现

本文详细介绍了哈希表的模拟实现,包括哈希节点状态的类、哈希表的扩容策略、仿函数的特化处理、插入、查找和删除操作。通过负载因子控制扩容时机,使用BKDR哈希算法避免冲突,实现高效的数据存储和检索。此外,还讨论了删除操作的处理方式。

目录

1、框架

2、哈希节点状态的类

3、哈希表的扩容

4、构建仿函数把所有数据类型转换为整型并特化

5、哈希表的插入

6、哈希表的查找

7、哈希表的删除

8、源码链接


1、框架

在模拟实现之前,要清楚实现哈希表所需的必要成分:

  • 哈希节点状态的类
  • 哈希表的类

接下来依次展开说明。


2、哈希节点状态的类

我们都很清楚数组里的每一个值无非三种状态:

  1. 如果某下标没有值,则代表空EMPTY
  2. 如果有值在代表存在EXIST
  3. 如果此位置的值被删掉了,则表示为DELETE

而这三种状态我们可以借助enum枚举来帮助我们表示数组里每个位置的状态。这里我们专门封装一个类来记录每个位置的状态,以此汇报给后续的哈希表。

enum State
{
	EMPTY,
	EXIST,
	DELETE
};
//哈希节点状态的类
template<class K, class V>
struct HashData
{
	pair<K, V> _kv;
	State _state = EMPTY;//记录每个位置的状态,默认给空
};
//哈希表的类
template<class K, class V, class HashFunc = DefaultHash<K>>//添加仿函数便于把其他类型的数据转换为整型数据
class HashTable
{
	typedef HashData<K, V> Data;
public:
	//相关功能的实现……
private:
	vector<Data> _tables;
	size_t _n = 0;//记录存放的有效数据的个数
};

实现好了哈希节点的类,就能够很好的帮助我们后续的查找,示例:

1、查找50:

  • 50%10=0,下标0的值不是50,继续++下标往后查找,直至下标3的下标为止。

2、查找60:

  • 60%10=0,下标0不是,往后++下标继续查找,找到下标4发现状态为EMPTY空,此时停止查询,因为往后就不可能出现了

3、删除10,再查找50

  • 50%10=0,下标0的值不是,++下标到下标1,发现状态为DELETE删除,继续++下标直至下标3的值为50,找到了。

3、哈希表的扩容

  • 散列表载荷因子定义为:α = 填入表中的元素个数 / 散列表的长度
  • α是散列表装满程度的标志因子。由于表长是定值α与“填入表中的元素个数”成正比,所以α越大,表明填入表中的元素越多,产生冲突的可能性就越大;反之,α越小,表明填入表中的元素越少,产生冲突的可能性就越小。实际上,散列表的平均查找长度是载荷因子α的函数,只是不同处理冲突的方法有不同的函数。
  • 对于开
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三分苦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值