哈希表---闭散列

闭散列

当我们用哈希函数的时候,其中一个就是除留余数法

取这个表的长度len,按照哈希函数:Hash(key) = key% len,将这个位置映射到表中

通过上面的除留余数法,会有哈希碰撞 的问题,可以通过闭散列来解决

闭散列 也叫开放定址法,通过线性探测,依次找后面的位置存储

插入

哈希表数据定义

cpp 复制代码
enum State
{
	EMPTY,
	EXIST,
	DELETE
};

template<class K, class V>
struct HashData
{
	pair<K, V> _kv;
	State _state=EMPTY;
};

哈希表的底层可以用vector封装

cpp 复制代码
template<class K,class V>
class HashTable
{
public:
	
	bool insert(const pair<K,V>& kv)
	{
		
	...........
	}

private:
	vector<HashData<K, V>> _ht;
	size_t _n = 0;//记录表中数据个数
};

插入问题1

当用除留余数法的时,除以的的vector的capacity还是size呢?

cpp 复制代码
bool insert(const pair<K,V>& kv)
	{    
        int hashi = kv.first% _ht.size();
		int index = hashi;
		int i = 1;
		while (_ht[index]._state ==EXIST)
		{
			index = hashi + i;
			index %= _ht.size();
			i++;
		}
		_ht[index]._kv = kv;
		_ht[index]._state = EXIST;
		_n++;
     }

答案是size,因为用vector的[ ]的时候,是只能访问size的部分的,假如是capacity,算出来的值可以就大于size了,就无法访问了

插入问题2

是不是有疑惑,当size==0的时候怎么处理?那就要扩容了

还有什么情况下要扩容?

在载荷因子较大的情况下要进行扩容

插入问题3

怎么扩容?

你们的脑瓜子一想简单啦,直接用vector的reserve就好啦,不对的,vector的reserve是扩大了capacity,size没有变的

我们可以用resize进行扩容,risize既扩容又初始化,size改变了

再把旧表数据移到新表

cpp 复制代码
	bool insert(const pair<K,V>& kv)
	{
		if (Find(kv.first))
			return false;
		if (_ht.size()==0||_n * 10 / _ht.size() >= 7)
		{
			int newsize = _ht.size() == 0 ? 10 : _ht.size() * 2;
			HashTable<K, V> newht;
			//对原来insert进行复用
			newht._ht.resize(newsize);

			//遍历旧表,来初始化新表
			for (auto& data : _ht)
			{
				if (data._state == EXIST)
				{
					newht.insert(data._kv);
				}

			}
			_ht.swap(newht._ht);
		}
        //线性探测
		int hashi = kv.first% _ht.size();
		int index = hashi;
		int i = 1;
		while (_ht[index]._state ==EXIST)
		{
			index = hashi + i;
			index %= _ht.size();
			i++;
		}
		_ht[index]._kv = kv;
		_ht[index]._state = EXIST;
		_n++;
		return true;
	}
相关推荐
进击的小头几秒前
第17篇:卡尔曼滤波器之概率论初步
python·算法·概率论
2401_87473253几秒前
基于C++的爬虫框架
开发语言·c++·算法
Q741_1472 分钟前
力扣经典模板题 前缀积 力扣 2906. 构造乘积矩阵 每日一题 哈希表 找规律 力扣 13. 罗马数字转整数 C++
算法·leetcode·前缀和·矩阵
lcj25115 分钟前
蓝桥杯C++:数据结构
数据结构·c++·算法
2401_873204657 分钟前
C++代码重构实战
开发语言·c++·算法
wangchunting8 分钟前
Jvm-垃圾回收算法
java·jvm·算法
北顾笙9809 分钟前
day05-数据结构力扣
数据结构·leetcode·哈希算法
LCG元11 分钟前
STM32嵌入式开发:基于PID算法的直流电机闭环调速控制
stm32·嵌入式硬件·算法
测试_AI_一辰12 分钟前
Agent & RAG 测试工程笔记 14:RAG门控层拆解:什么时候该答?什么时候必须拒绝?
人工智能·算法·ai·自动化·ai编程
Σίσυφος190012 分钟前
多频相位展开(Multi-frequency Phase Unwrapping)”可以替代格雷码?
算法