哈希冲突
通常情况下,哈希函数的输入空间远远大于输出空间,因此,哈希冲突是不可避免的。
哈希冲突会导致查询结果错误,严重影响哈希表的可用性,为了解决该问题,我们一般是对哈希表进行扩容,直至冲突消失,但是这种方法效率太低。
对此,我们可以采用以下策略:
- 改良哈希表的数据结构,使得哈希表在出现哈希冲突时可以正常使用
- 当哈希冲突严重时,才进行扩容
哈希表的改良操作主要有“链式地址”和“开放寻址”
链式地址
在原始哈希表中每个桶只能存储一个键值对,链式地址将单个元素转换为链表,将键值对作为链表的节点,将有冲突的键值对存储在同一条链表中。
链式地址:每个桶存储一条链表,其中包括所有冲突的元素
基于链式地址实现的哈希表操作发生了变化
- 查询元素:输入key经过哈希函数得到索引,即可访问头节点,然后遍历链表,对比key以查找键值对
- 添加元素:通过哈希函数得到链表头节点,然后将键值对插入到链表
- 删除元素:通过哈希函数得到链表头节点,遍历链表查到目标节点将其删除。
局限性
- 占用空间变大:链表包含头指针,他比数组更耗费内存空间
- 查询效率低:因为要遍历链表
简单实现
- 当负载因子超过2/3,我们将哈希表扩容到原来的两倍
//
// Created by Administrator on 2024/1/12.
//
#include "iostream"
#include "vector"
using namespace std;
struct Pair{
int key;
string val;
Pair(int key,string val){
this->key = key;
this->val