29.哈希(下)

实现哈希表:

这样看起来可以实际不可以,

这几个值互相抢位置,比如说找20,在模10位置找,找不到下一个位置找。直到空停止,但是如果删除30,再去查找20,9位置没值,直接停了。这还有三个枚举值存在 空 删除,删除了,标记成删除,删除状态继续往后找。哈希冲突越多效率越低。

cpp 复制代码
#pragma once
#include<vector>

enum State
{
	EXIST,
	EMPTY,
	DELETE
};

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

template<class K, class V>
class HashTable
{
public:
	HashTable()
		:_tables(11)
		,_n(0)
	{}
private:
	vector<HashData<K, V>> _tables;
	size_t _n;  // 记录数据个数
};

这里模capacity的话,,打个比方,如果容量是20,size 11 ,

vector operator【】会检查越没越界,等不等于size。顺序表要线性存储,不能直接存,要模size

尽量让size capacity一样大,比如说这里,size和capacity都是11,

基础哈希表就写完了。

满了就死循环了,

扩容:有点差

新方式:

如果搞新vector要自己计算位置,搞新哈希表,把里面vector扩到二倍,遍历旧表,把旧表数据insert到新表,不会再次扩容,因为已经扩了二倍了,负载因子最多0.3到不了扩容,就复用了这个逻辑。

为什么这里必须支持等于,给一个等于的仿函数。查找插入紧紧和等于相关。

插入不允许冗余,

cpp 复制代码
int main()
{
	//int a[] = { 19,30,52,63,11,22 };
	int a[] = { 19,30,5,36,13,20,21,12 };
	HashTable<int, int> ht;
	for (auto e : a)
	{
		ht.Insert({ e, e });
	}

	//ht.Insert({ 15, 15 });

	ht.Erase(30);
	if (ht.Find(20))
	{
		cout << "找到了" << endl;
	}

	if (ht.Find(30))
	{
		cout << "找到了" << endl;
	}
	else
	{
		cout << "没有找到" << endl;
	}

	return 0;
}

验证一下

用二次检测解决群集,堆积问题

二次探测就是让更分散

w往右回绕是模往左回绕是加。

这只是逻辑不验证了。

直接加i平方就行。

互相占还是不好。哈希桶好

大小要是素数但是这里不是素数。解决1:

选了一堆素数表,接近二倍。改造我们的代码:

会取比0大的素数,53,

就是写死了一组值。

相关推荐
罗湖老棍子10 小时前
【例 1】Sightseeing Trip(信息学奥赛一本通- P1494)(洛谷-P10927)
数据结构·算法·图论·最短路·floyd·最小环
雪碧聊技术10 小时前
算法基础—>散列表(哈希)—>线性探测的开放定址法解决冲突(顺序地探查可用存储单元)
哈希算法·散列表·线性探测的开放定址法
stsdddd12 小时前
YOLO算法建筑工地安全帽目标检测数据集16881张:标注核对笔记
算法·yolo·目标检测
CV爱数码13 小时前
论文精读|Learned Primal-Dual:把原始–对偶算法展开成网络
图像处理·算法·计算机视觉·ct·重建·断层扫描
yuniko-n13 小时前
【算法】约瑟夫环问题
java·算法
l1t14 小时前
测试DuckDB v2.1.0-alpha49002的bignum乘法
数据库·sql·算法·duckdb
Nil20814 小时前
LeetCode 283移动零
数据结构·算法·leetcode
CQU_JIAKE14 小时前
10.18【A】
算法
LMT流氓兔14 小时前
第五单元——第4课:给工具参数加校验
java·前端·算法·ai·langchain
物联网软硬件开发-轨物科技15 小时前
【轨物方案】深度解读开关柜智能感知及一键顺控专家系统
大数据·运维·网络·人工智能·算法·机器人