目录
1、框架
在模拟实现之前,要清楚实现哈希表所需的必要成分:
- 哈希节点状态的类
- 哈希表的类
接下来依次展开说明。
2、哈希节点状态的类
我们都很清楚数组里的每一个值无非三种状态:
- 如果某下标没有值,则代表空EMPTY
- 如果有值在代表存在EXIST
- 如果此位置的值被删掉了,则表示为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、哈希表的扩容
- 散列表的载荷因子定义为:α = 填入表中的元素个数 / 散列表的长度
- α是散列表装满程度的标志因子。由于表长是定值,α与“填入表中的元素个数”成正比,所以α越大,表明填入表中的元素越多,产生冲突的可能性就越大;反之,α越小,表明填入表中的元素越少,产生冲突的可能性就越小。实际上,散列表的平均查找长度是载荷因子α的函数,只是不同处理冲突的方法有不同的函数。
- 对于开

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

最低0.47元/天 解锁文章
409






