详解哈希,理解及应用

news2024/9/22 19:41:04

全文目录

  • 概念
  • 哈希冲突及原因
  • 解决哈希冲突的方法
    • 闭散列
      • 线性探测
      • 二次探测
      • 扩容
    • 开散列
      • 扩容
  • 哈希的应用
    • 位图
    • 布隆过滤器

概念

通过映射关系将关键字映射到存储位置,并实现增删改查操作。

在这里插入图片描述

通过上面的方法构造出来的结构就叫哈希表(散列表),其中的映射关系叫做哈希函数

哈希冲突及原因

不同的关键字映射到同一个位置称为哈希冲突

原因:

哈希函数设计得不够合理

哈希函数设计原则:

  • 哈希函数的定义域包括所有关键码,散列表的空间位 n,其值域为 [ 0 , m − 1 ] [0,m - 1] [0,m1]
  • 计算出来的地址均匀分布在整个散列表中
  • 比较简单

其他类型哈希:

哈希函数需要将关键码进行取模操作,这就表示了当其他类型哈希时需要先将关键字转换为整型 —— 可以通过仿函数进行转换。

解决哈希冲突的方法

解决哈希冲突两种常见的方法是:闭散列和开散列

闭散列

闭散列:也叫开放定址法,当发生哈希冲突时,如果哈希表未被装满,说明在哈希表中必然还有空位置,那么可以把key存放到冲突位置中的“下一个” 空位置中去。

寻找“下一个”空位置的方法:线性探测和二次探测

线性探测

从发生冲突的位置开始,依次向后探测,直到寻找到下一个空位置为止。

在这里插入图片描述

缺点:

冲突连在一起容易发生数据堆积,不同的关键字占用了可利用的空位置,使得同一个效率下降,影响效率

二次探测

线性探测造成数据堆积的原因是寻找空位置的方式,为了避免数据堆积,二次探测寻找下一个位置的方式为:

H i = ( H 0 + i 2 ) % m H_i = (H_0 + i^2 ) \% m Hi=(H0+i2)%m, 或者: H i = ( H 0 − i 2 ) % m H_i = (H_0 - i^2 ) \% m Hi=(H0i2)%m。其中: i = 1 , 2 , 3 … i = 1,2,3… i=1,2,3 H 0 H_0 H0 是通过散列函数 H a s h ( x ) Hash(x) Hash(x) 对元素的关键码 k e y key key 进行计算得到的位置, m m m 是表的大小。

在这里插入图片描述

扩容

当哈希表的载荷因子达到一定大是进行扩容

在这里插入图片描述

开散列

开散列法又叫链地址法(开链法),将相同地址的关键字分为一个集合称为桶,通过单链表将桶中的元素链接起来。

在这里插入图片描述
在这里插入图片描述

扩容

随着插入的增加,冲突的可能性越来越大即一个桶中节点越来越多,影响哈希表的性能。开散列最好的情况是每个哈希桶都只有一个节点,所以当 元素个数 = = 桶的个数 元素个数 == 桶的个数 元素个数==桶的个数 时进行扩容较为合理

哈希的应用

位图

用一个比特位来存放某种状态,用来快速判断某个数据在不在。

模拟实现:

template<size_t N = 100>
class bitset
{
public:
	bitset(size_t n = N)
	{
		_bit.resize(N / 8 + 1, 0);
	}

	bitset& set(size_t x, bool val = true)
	{
		size_t i = x / 8;
		size_t j = x % 8;
		
		if (val)
		{
			_bit[i] |= 1 << j;
		}
		else
		{
			_bit[i] &= ~(1 << j);
		}

		return *this;
	}

	bitset& set()
	{
		vector<char> tmp(N / 8 + 1, 1);
		_bit.swap(tmp);
		return *this;
	}

	bitset& reset()
	{
		vector<char> tmp(N / 8 + 1, 0);
		_bit.swap(tmp);
		return *this;
	}

	bitset& reset(size_t x)
	{
		size_t i = x / 8;
		size_t j = x % 8;

		_bit[i] &= ~(1 << j);

		return *this;
	}

	bool test(size_t x) const
	{
		size_t i = x / 8;
		size_t j = x % 8;

		return _bit[i] & (1 << j);
	}

private:
	vector<char> _bit;
	size_t _size;
};

缺点:

一般只能处理整型

布隆过滤器

用来快速检索数据是否存在,弥补位图只能处理整型的缺憾。

原理:

通过多个哈希函数,将一个数据映射到位图结构中。

但是可能对存在的情况存在一定的误判,误判概率取决于哈希函数的个数和空间的大小:参考文档

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基础算法---区间合并

直接上题目,不废话! 题目 给定 n 个区间 [l,r]&#xff0c;要求合并所有有交集的区间。 注意如果在端点处相交&#xff0c;也算有交集。 输出合并完成后的区间个数。 例如&#xff1a;[1,3] 和 [2,6] 可以合并为一个区间 [1,6]。 输入格式 第一行包含整数 n。 接下来 n 行&am…

Linux中如何执行命令

命令格式&#xff1a; 主命令 [选项...] [参数&#xff08;要操作的对象&#xff09;...] ——选项&#xff1a;决定了命令的执行方式 长选项 --version 短选项 -V&#xff0c;-i&#xff0c;-d &#xff0c;-r ——参数&#xff1a;决定命令的作用对象 不同的命令参数不同 …

天府新区直播产业成型,成都直播产业基地开园倒计时!

直播&#xff0c;正逐渐衍化为当今社会的基础媒介&#xff0c;直播行业以“平台经济”为依托&#xff0c;构筑了数字经济一大“动脉”。 天府新区&#xff0c;数字激潮涌。蜂巢产业&#xff0c;让未来生长。 站在电商直播的时代风口上&#xff0c;树莓集团携手上市公司德商产投…

如何高效且优雅地使用Redis

本文从如下7个维度&#xff0c;带你全面理解Redis的最佳实践和优化&#xff1a; 内存性能可靠性运维安全资源规划监控 1、如何节省内存 1.1、控制Key的长度 在开发业务时&#xff0c;要提前预估Redis中写入key的数量&#xff0c;如果key数量达到了百万级别&#xff0c;那过…

【SpringMVC】之自定义注解

文章目录 一、Java注解1.1 简介1.2 分类1.2.1 JDK基本注解1.2.2 JDK元注解1.3 自定义注解 二、使用自定义注解2.1 **案例一&#xff08;获取类与方法上的注解值&#xff09;**2.2 **案例二&#xff08;获取类属性上的注解属性值&#xff09;**2.3 **案例三&#xff08;获取参数…

easycms v5.5 分析 | Bugku S3 AWD排位赛

前言 这个awd打的悲&#xff0c;后台默认用户名密码为admin:admin&#xff0c;但是几乎所有人都改了 而且一进去看到这个cms就有点懵逼&#xff0c;都不知道这个cms是干嘛的&#xff08;没用过相似的cms&#xff09; 虽然网上找出了很多相关的漏洞&#xff0c;但是不知道为什…

API实战教程:使用身份证OCR识别API构建一个应用

1. 引言 你是否曾经想过&#xff0c;只需拍一张身份证的照片&#xff0c;就能自动读取上面的所有信息&#xff1f;今天&#xff0c;我们要介绍的就是这样一个神奇的工具&#xff1a;身份证OCR识别API。不管你是技术小白还是初学者&#xff0c;跟着我们的步骤&#xff0c;你都可…

揭秘弹幕游戏制作

最近好多人问弹幕游戏&#xff0c;甚至是招人的也要DOTS做弹幕游戏... 实际上目前的弹幕游戏绝大多数应该和DOTS没有半点关系&#xff0c;别忘了DOTS这项技术渲染问题还没能够被合理解决呢 所以目前用的全都是GPU Instance这项技术&#xff0c;于是乎我决定下场写这篇帖子&am…

【藏经阁一起读】(69)__《阿里云视频云产品手册2023版》

【藏经阁一起读】&#xff08;69&#xff09;__《阿里云视频云产品手册2023版》 目录 一、概述阿里云视频云全产品矩阵 二、数字人视频制作 以下是人工智能虚拟人物的一些优秀代表作品及其特点&#xff1a; 阿里云视频云数字人视频制作产品优势 ▶高还原度的拟真效果 ▶场…

网络安全(黑客技术)自学规划

一、什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面性…

外包干了2个月,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

华为云云耀云服务器L实例评测|华为云云耀云服务器L实例开展性能评测

作者简介&#xff1a; 辭七七&#xff0c;目前大二&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

哪个牌子的电视盒子好用?锋哥数码揭晓最新电视盒子品牌排行榜

哪个牌子的电视盒子好用&#xff1f;不同人群需求不同选购侧重点也不同&#xff0c;老人要买操作简单的&#xff0c;小孩要买辅导课多的&#xff0c;追剧党要买看视频流畅广告少的&#xff0c;喜欢投屏的就更注重投屏体验&#xff0c;锋哥做电视盒子的测评已经很多年了&#xf…

SQL 2008 R2 和vCenter 5.1安装步骤与AQ

准备情况&#xff1a; Windows 2008 r2 sp1 64bit操作系统 Sql 2008 完整版安装包&#xff08;名称&#xff1a;SQLFULL_CHS.iso 安装完成会安装managment&#xff09; vCenter完整版安装包&#xff08;名称&#xff1a;VMware-VIMSetupall-5.1.0-799735.iso&#xff09; …

亿级长连接,淘宝接入层网关的架构设计

说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;很多小伙伴拿到一线互联网企业如阿里、网易、有赞、希音、百度、滴滴的面试资格。 最近&#xff0c;尼恩指导一个小伙伴简历&#xff0c;写了一个《高并发网关项目》&#xff0c;此项目帮这个小伙拿到 字节/阿里/…

C++——vector(2)

作者&#xff1a;几冬雪来 时间&#xff1a;2023年9月15日 内容&#xff1a;C——vector知识讲解 目录 前言&#xff1a; vector: 构造函数&#xff1a; 创建模板&#xff1a; reserve/push_back: 迭代器/capacity和size&#xff1a; insert&#xff1a; 改进&…

基于springboot+vue的大学生智能消费记账系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

OPTEE异常调用栈解析

安全之安全(security)博客目录导读 目录 一、OPTEE标准的异常调用栈格式 二、OPTEE异常调用栈解析脚本 三、如何执行解析命令 四、OPTEE异常调用栈解析结果 序言&#xff1a;当OPTEE发生异常时&#xff0c;安全控制台会输出dump信息&#xff0c;虽然有了Call stack&#x…

企业级SpringBoot单体项目模板 —— 基础应用搭建

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;SpringBoot项目模板、工程、MyBatis-plus☀️每日 一言&#xff1a;你那么在意不喜欢你的人的言语&#xff0c;这对喜欢你的人来说很不公平 一、创建一个Maven项目 Maven的安装自己百度。 2.1 …