哈希表---闭散列

闭散列

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

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

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

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

插入 

 哈希表数据定义

enum State
{
	EMPTY,
	EXIST,
	DELETE
};

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

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

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呢?

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改变了

再把旧表数据移到新表


	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;
	}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/645245.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Django与前端框架协作开发实战:高效构建现代Web应用

title: Django与前端框架协作开发实战&#xff1a;高效构建现代Web应用 date: 2024/5/22 20:07:47 updated: 2024/5/22 20:07:47 categories: 后端开发 tags: DjangoREST前端框架SSR渲染SPA路由SEO优化组件库集成状态管理 第1章&#xff1a;简介 1.1 Django简介 Django是一…

新加坡多ip服务器在跨境电商中有哪些优势?

新加坡多IP服务器**在跨境外贸业务中具有明显的优势&#xff0c;适合需要高性能和网络稳定性的业务场景。Rak部落小编为您整理发布新加坡多ip服务器在跨境电商中有哪些优势? 以下是一些具体的优势&#xff1a; 1. **地理位置优越**&#xff1a;新加坡作为亚太地区的国际商业和…

mysql图形化界面及将mysql注册成后台程序

安装图形化界面版本 右键新建数据库 字符集使用utf8防止以后数据库中存在中文字符导致乱码 将mysql注册成后台程序 cmd进入命令行界面 切换路径到cd /mysql/bin 将mysql注册成后台程序 mysqld.exe --install mysql1 (失败&#xff0c;说明没有权限) 以管理员身份打开成功…

R语言:Mantel Test分析与绘图

Mantel Test 1.什么是Mantel Test2. R语言代码13. R语言代码2 1.什么是Mantel Test Mantel test分析对两个矩阵相关关系进行检验。可以用在生态学上&#xff0c;用来检验群落距离矩阵(如 Bray-Curtis distance matrix)和环境变量距离矩阵(如 pH, 温度 或者地理位置的差异矩阵)之…

MySQL——MySQL目录结构

MySQL安装完成后&#xff0c;会在磁盘上生成一个目录&#xff0c;该目录被称为MySQL的安装目录。在MySQL的安装目录中包含了启动文件、配置文件、数据库文件和命令文件等。 下面对 MySQL 的安装目录进行详细讲解 (1)bin 目录 : 用于放置一些可执行文件,如 mysql.exe、mysqld. …

Java面试八股之什么是锁消除和锁粗化

什么是锁消除和锁粗化 锁消除&#xff08;Lock Elimination&#xff09;&#xff1a; 锁消除是Java虚拟机&#xff08;JVM&#xff09;进行的一种高级优化策略&#xff0c;旨在消除那些没有必要存在的同步操作&#xff0c;以减少不必要的性能开销。这一优化发生在即时编译器&a…

MT7628原厂Uboot修改交互串口

工作中&#xff0c;遇到用户用Skylab的SKW92A模组&#xff0c;在参考设计时&#xff0c;将UART接口预留错的情况&#xff0c;对于这种情况&#xff0c;需要将原厂SDK默认的交互串口UART0&#xff0c;改为UART1。在开发过程中&#xff0c;经常需要在Uboot阶段升级固件&#xff0…

抖音运营_抖音推荐算法的机制

目录 一 抖音流量推荐算法机制 二 4大关键指标 三 完播率 1 黄金3秒 2 内容严谨 3 期待感 4 用户痛点 5 通俗易懂 四 转发量 1 分享需求 2 分享快乐 3 共情表达 4 正义传播 五 评论量 1 话题性 2 争议性 3 参与感 4 评论回评 六 点赞量 1 情感共鸣 2 用户喜…

山东大学软件学院项目实训-创新实训-基于大模型的旅游平台(二十)- JUC(6)

目录 wait , notify wait vs sleep 正确使用方法 同步保护性暂停 join的源码 Future 异步生产者/消费者模型 定义 Park & Unpark 原理 wait , notify 小故事小南需要烟才能工作&#xff0c;但它又要占这锁让别人无法进来。那么这个时候开一个waitSet相当于就是休…

druid 1.2.14,application.yaml配置文件中,如何进行数据库加密配置

步骤一&#xff1a;先生成加密的密码&#xff1a; 步骤二&#xff1a;配置application.yaml文件&#xff1a; spring:datasource:driver-class-name: com.mysql.cj.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSourcedruid:username: rootpassword: aPJ35saFz6ASmnmNt…

ASP.NET MVC 快速入门(图文版)

今年是2024年了&#xff0c;没有多少人在ASP.NET 去做开发&#xff0c;都使用ABP框架 &#xff0c;不过我们仍然需要了解ASP.NET MVC 的一个开发流程 MVC概述 MVC是当前比较流行的WEB程序开发模式之一&#xff0c;ASP.NET MVC是.Net对MVC的一种实现。MVC&#xff08;Model View…

LeetCode 124 —— 二叉树中的最大路径和

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 二叉树的问题首先我们要想想是否能用递归来解决&#xff0c;本题也不例外&#xff0c;而递归的关键是找到子问题。 我们首先来看看一棵最简单的树&#xff0c;也就是示例 1。这样的一棵树总共有六条路径&#xf…

Vita-CLIP: Video and text adaptive CLIP via Multimodal Prompting

标题&#xff1a;Vita-CLIP: 通过多模态提示进行视频和文本自适应CLIP 源文链接&#xff1a;https://openaccess.thecvf.com/content/CVPR2023/papers/Wasim_Vita-CLIP_Video_and_Text_Adaptive_CLIP_via_Multimodal_Prompting_CVPR_2023_paper.pdfhttps://openaccess.thecvf.…

Java中IO流类的体系

Java为我们提供了多种多样的IO流&#xff0c;我们可以根据不同的功能及性能要求挑选合适的IO流&#xff0c;如图所示&#xff0c;为Java中IO流类的体系。 从上图发现&#xff0c;很多流都是成对出现的&#xff0c;比如&#xff1a; FileInputStream/FileOutputStream&#xff0…

国内首个智能体生态大会!2024百度万象大会定档5月30日

最近&#xff0c;百度悄悄「上新」了几个AI神器。 百度搜索上线「互动」功能&#xff0c;可以实时问答&#xff0c;查询信息就像聊天一样简单&#xff0c;还可以艾特相关智能体&#xff0c;更细致精确地满足个性化需求&#xff0c;比如去新加坡旅游&#xff0c;可以让新加坡旅…

Python - 深度学习系列35 重塑实体识别2

说明 上一篇Python - 深度学习系列34 重塑实体识别介绍了如何进行训练&#xff0c;这篇讨论如何应用。 详细review了之后&#xff0c;发现其实早先的服务还是略有欠缺的。例如&#xff1a; 1 最早的时候好像还没有pipeline&#xff0c;我用DataFrame并行处理&#xff0c;然后…

matlab 图像的中值滤波

目录 一、功能概述1、算法概述2、主要函数3、计算公式二、代码实现三、结果展示四、参考链接本文由CSDN点云侠翻译,放入付费专栏只为防不要脸的爬虫。专栏值钱的不是本文,切勿因本文而订阅。 一、功能概述 1、算法概述 中值滤波是图像处理中一种常用的非线性运算,用于减少…

摸鱼大数据——Hive基础理论知识——Hive环境准备

Hive环境准备 1、shell脚本执行方式 方式1: sh 脚本 注意: 需要进入脚本所在目录,但脚本有没有执行权限不影响执行 方式2: ./脚本 注意: 需要进入脚本所在目录,且脚本必须有执行权限 方式3: /绝对路径/脚本 注意: 不需要进入脚本所在目录,但必须有执行…

Pytorch深度学习实践笔记6(b站刘二大人)

&#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;pytorch深度学习 &#x1f380;CSDN主页 发狂的小花 &#x1f304;人生秘诀&#xff1a;学习的本质就是极致重复! 《PyTorch深度学习实践》完结合集_哔哩哔哩_bilibi…

【Spring Security + OAuth2】OAuth2

Spring Security OAuth2 第一章 Spring Security 快速入门 第二章 Spring Security 自定义配置 第三章 Spring Security 前后端分离配置 第四章 Spring Security 身份认证 第五章 Spring Security 授权 第六章 OAuth2 文章目录 Spring Security OAuth21、OAuth2简介1.1、OAu…