哈希表的基本思路是通过某种方式将某个值映射到对应的位置,这里的采取的方式是除留余数法,即将原本的值取模以后再存入到数组的对应下标,即便存入的值是一个字符串,也可以根据字符串哈希算法将字符串转换成对应的ASCII码值,然后再取模。
如果某个位置已经存了其他数据,那么就需要找一个空闲位置来存放当前数据,我们把这种方式称为闭散列(或者开放地址法)。

目录
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

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





