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,

就是写死了一组值。

相关推荐
木子墨51611 分钟前
LeetCode 热题 100 精讲 | 并查集篇:最长连续序列 · 岛屿数量 · 省份数量 · 冗余连接 · 等式方程的可满足性
数据结构·c++·算法·leetcode
王老师青少年编程1 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【线性扫描贪心】:均分纸牌
c++·算法·编程·贪心·csp·信奥赛·均分纸牌
EQUINOX11 小时前
2026年码蹄杯 本科院校赛道&青少年挑战赛道提高组初赛(省赛)第一场,个人题解
算法
萝卜小白1 小时前
算法实习Day04-MinerU2.5-pro
人工智能·算法·机器学习
Liangwei Lin1 小时前
洛谷 P3133 [USACO16JAN] Radio Contact G
数据结构·算法
weixin_513449962 小时前
PCA、SVD 、 ICP 、kd-tree算法的简单整理总结
c++·人工智能·学习·算法·机器人
code_pgf2 小时前
Qwen2.5-VL 算法解析
人工智能·深度学习·算法·transformer
Code-keys2 小时前
Android Codec2 Filter 算法模块开发指南
android·算法·音视频·视频编解码
无忧智库2 小时前
低空经济新基建:构建低空飞行大数据中心与行业应用算法工厂的全景式蓝图(WORD)
算法
闻缺陷则喜何志丹3 小时前
【背包 组合】P7552 [COCI 2020/2021 #6] Anagramistica|普及+
c++·算法·背包·洛谷·组合