哈希知识点总结:哈希、哈希表、位图、布隆过滤器

目录

哈希

哈希表

哈希常用方法

1、直接定址法

2、存留余数法

哈希冲突

哈希冲突的解决办法

1、闭散列:开放定址法

(1)线性探测法

(2)二次探测法

2、开散列

哈希桶 / 拉链法

哈希的运用

位图

set操作

reset操作

 总结

位图的运用

 布隆过滤器

引入

思想讲解

【拓展阅读】

经典问题

1、给两个文件,分别有100亿个字符串,我们只有1G内存,如何找到两个文件的交集?分别给出精确算法和近似算法

近似算法:布隆过滤器

精确算法:哈希切分

2、给一个超过100G的logfile,log文件中存折IP地址,设计算法找到出现次数最多的地址,与上题条件相同,如何找到topK的IP?


哈希

哈希也叫散列,它表示的是“一种映射,关键字和存储位置建立一个关联关系”。

哈希表

关键字和存储位置建立一个关联关系

哈希常用方法

1、直接定址法

关键字和存储位置是一 一对应的关系,可能该数就是地址,也可能是通过某种运算得到该地址

使用场景:关键字范围集中(否则容易空间浪费),数据量较小

2、存留余数法

通常计算方法为:

存储位置 = 该数 % 哈希表.size()

【注】

负数也可以用该种方法确定位置,因为%上的数是size(),而size()的结果是size_t,也就是无符号数,这意味着运算时会发生隐式类型转换,也就是说不用担心得出的位置的下标为负数的情况

在这里,就要扩展一下哈希冲突了

哈希冲突

哈希冲突也叫哈希碰撞,表示的是:不同的值映射到同一位置

上面介绍的“存留余数法”获取存储位置的方法是通过模上一个数,但是我们应该很容易想到,不同的数很可能模到同一位置,如哈希表长度为5,当要存储5这个数据时,将会映射到0这个位置,但是后面如果要存储10这个数据时,我们通过计算,会发现存储位置仍然是0,但这个位置已经有数据了,这就引发了哈希冲突

哈希冲突的解决办法
1、闭散列:开放定址法

顾名思义,“开放定址法”也就是将“地址开放”,也就是说,数据可以占用其他位置,只要该位置还处于开放状态,也就是该位置未存储数据。开放定址法的定址有两种探测方法:

(1)线性探测法

通常是 存储位置 = hahi + i (i >= 1),也就是  存储位置 = 上一次哈希映射的位置 + i (i >= 1),直到找到可以存储的位置

(2)二次探测法

通常是 存储位置 = hahi + i ^ 2

2、开散列
哈希桶 / 拉链法

所谓的拉链,就是用一个链条拉起来,和普通的哈希数组不同,拉链法的哈希数组是一个指针数组,每个元素存的是一个节点的指针

哈希的运用

位图

首先我用一个题目来引入

给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在
这40亿个数中

解决方案:

(1)二分查找

缺点:要有序 ----> 排序花时间且数据都要存在数组中 -----> 占内存大 --------> 40亿个数据 = 4,0000,000,000 * 4 byte = 14.9G,但是在普通电脑中,用14.9G的内存存数据是比较困难的,而且是要在连续的空间下,这难上加难

(2)位图

因为该题只需要我们判断一个数是否存在,而是否存在我们可以用0和1两种状态来表示,我们很容易能想到二进制,而计算机中,每个比特位就是一个二进制,而一个字节有32个比特位,因此我们可以用一个字节来表示32个数哪些存在,哪些不存在,显然,这种方法所需空间大小远远小于上面那种方法的大小。

接下来我们就要看位图到底怎么使用

假如我们要用一个字节表示下面这个数组哪些数字存在,哪些数字不存在,我们可以这样子做

❁ x在第几个区?(该图是8个比特位一个区)

 区号 = x / 8

❁ x在该区的第几个位?

 位数 = x % 8

我们得到了x在哪个区的哪个位后,我们只需要通过位运算就可以得出该数是否存在,存在则该比特位为1,否则为0

接下来将讲解的是位图中最重要的两个操作:set,reset

set操作

该操作是将某数据设置为“存在”,也就是将其对应的比特位设置为1

假如我们需要将j位处理成1,那我们需要注意的是:我们不应该影响其他位

将某位设置,很明显,我们需要进行移位操作,假如我们要将 j 位设置为1,我们只需要:

bits[i] |= (1 << j)

i表示的是x所在的区号,而bits是整个位图

reset操作

该操作是将某数据设置为“不存在”,也就是将其对应的比特位设置为0

假如我们需要将j位处理成0,那我们仍然需要注意的是:我们不应该影响其他位

将某位设置为0,我们只需要:

bits[i] &= (~(1 << j))

【注】

原位 &= (~(1 << j))后,将会被置为0

 总结

其实位图就是数组,只是数组的每个元素是一个比特位,这样子一个整型可以表示32个数,大大节省了空间

位图的运用

1、给定100亿个整数,涉及算法找到只出现一次的整数

解答:

仍然和最原始的题目一样,它仍然是判断在不在的问题,只是多加了一个条件:只出现一次

我们可以将不同次数分个类

                                                        ❂ 出现 0 次

                                                        ❂ 出现 1 次

                                                        ❂ 出现两次及以上

位图建立在二进制的基础上,因此我们再用二进制数表示这三种情况:

                                                        ❂ 出现 0 次        ——————  00

                                                        ❂ 出现 1 次        ——————  01

                                                        ❂ 出现两次及以上 —————  10

两个位置的数都是0和1,因此我们可以用位图来表示

由于有两位,所以我们用两个位图来表示即可,再根据次数的变化,分别更新两个位图对应位的数字就好

2、给两个文件,分别由100亿个整数,我们只有1G内存,如何找到两个文件的交集

解答:

该题和上题一样,需要用到两个位图,把两个处理100亿个数据的问题分离出来,就是该文章第一个提的关于位图的问题,也就是我们只需要把两个文件中的数据都对应到自己所属的位图中去就可以了,最后遍历位图,如果两个位图的同一个位置都位1,则表明该数属于两个文件的交集

 布隆过滤器

引入

现在我们来思考一个问题:

我们学过哪些可以用来搜索数据的算法或者数据结构,它们有哪些缺点?

答:

1、暴力查找

      缺点:数量大了,效率就低

2、排序 + 二分查找

      缺点:排序有代价,时间复杂度、空间复杂度,学过位图我们也可以直到,面对数量特别大的情况下,虽然二分查找很快,但是在空间上有问题的话,再快的算法没有空间也进行不起来

3、搜索树(如AVL树、红黑树)

4、哈希

以上讲的所有方法,在数据量特别大的时候将无法进行

我们怎么优化呢?🤔🤔🤔

学完了位图,我们可以知道:

整型的数据,判断在不在 ——————> 可以用位图😯🤨😲

现在就提出一个问题,那其他类型的数据呢?

答:这里就要引入布隆过滤器的概念了

思想讲解

整型用位图很好处理,那我们是不是可以将其他的数据结构转化为整型来处理呢?

我将用字符串来举例,如果我们将字符串的ASCII的和作为一个key,我们就可以映射到特定的位置了,假如:

其实这种记录方法是可能会出错的,这里就需要大家思考一个问题 :判断在的情况是准确的呢?还是不在的情况是准确的呢?🤨😣🧐

解答:

判断不在的情况是准确的

因为判断结果并一定准确,因此:布隆过滤器用在可以接收误判的情况下 

我来举一个能接受误判的例子

我们注册用户时,通常会要求“用户名不能重复”,但是一个软件的用户成千上万,如果每次都去服务器上找某个昵称是否存在,那将非常低效,这个时候,就会在用户层 和 服务器层 之间加一个布隆过滤器

✦ 对于不在的情况,就不需要再去服务器查找了,直接就可以返回 ——————> 判断不存在时是准确的

✦ 对于在的情况,就需要再去服务器查找了,确认后再返回 ——————> 判断存在时是准确的,但是,如果不去服务器查找,也是可以的,因为这种误判存在的情况,并不影响运行结果(它并不会导致昵称重复而出错)-------> 这种情况是接受误判的

因为布隆过滤器是会误判的,因此很多读者会提出下列问题:

1、一个值映射多个位,不就可以减少误判了吗?

确实是的,但是它仍然存在误判,但是

(1) 只是降低了误判概率

(2) 布隆过滤器的涉及原因和位图一样,是为了节省空间而涉及的,但是如果为了减少误判,而增加位图数目,以达到一个值映射多个位的实现,这与 节省空间  这一点相冲突了

【拓展阅读】

因为布隆过滤器的结果并不准确,一个key可能是多个值的映射,所以布隆过滤器不能像位图一样设置Reset函数,因为可能影响其他的值,当然这种情况是可以解决的,我们可以用引用计数来解决,但是这样子扩大了空间消耗,因此布隆过滤器大多数情况下并不设置引用计数

经典问题

1、给两个文件,分别有100亿个字符串,我们只有1G内存,如何找到两个文件的交集?分别给出精确算法和近似算法

近似算法:布隆过滤器

精确算法:哈希切分

但是,即使哈希切分后,仍然有问题:如果某个小文件太大,仍然无法加载到内存

 可能有两种情况:

(1) 这个小文件大多是同一个字符串

(2)这个小文件是不同的字符串

第一种情况很好解决,将读取到的字符串放到set即可(set去重),Ai和Bi分别放到setA和setB中,再找交集

第二种情况会出现:不断插入set以后,内存不足,会抛异常,这个时候就需要换一个哈希函数,进行二次切分,再找交集

2、给一个超过100G的logfile,log文件中存折IP地址,设计算法找到出现次数最多的地址,与上题条件相同,如何找到topK的IP?

答:和上题一样,用哈希函数,将不同的IP映射到不同的 i ,相同的IP进入同一个小文件,这个时候我们只需要用map统计IP的次数就好了

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

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

相关文章

3-3 AUTOSAR RTE 对SR Port的作用

返回总目录->返回总目录<- 一、前言 RTE作为SWC和BSW之间的通信机构,支持Sender-Receiver方式实现ECU内及ECU间的通信。 对于Sender-Receiver Port支持三种模式: 显式访问:若运行实体采用显示模式的S/R通信方式,数据读写是即时的;隐式访问:当多个运行实体需要读取…

Docker安装与应用

前言 Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言开发。Docker 可以让开发者打包他们的应用以及依赖包到一个轻 量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互 之间…

关于Fake Location定位,运动世界校园问题

不好意思&#xff0c;之前那个文章其实是很早之前的&#xff0c;不知道为什么审核了很久一直没有通过&#xff0c;然后前几周莫名其妙点了一下重新发布&#xff0c;竟然发布成功了&#xff0c;这个方法已经失效了&#xff0c;要可以稳定&#xff0c;我建议是买一台root的手机&a…

鸿蒙开发(NEXT/API 12)【硬件(传感器开发)】传感器服务

使用场景 Sensor Service Kit&#xff08;传感器服务&#xff09;使应用程序能够从传感器获取原始数据&#xff0c;并提供振感控制能力。 Sensor&#xff08;传感器&#xff09;模块是应用访问底层硬件传感器的一种设备抽象概念。开发者可根据传感器提供的相关接口订阅传感器…

Docker容器的使用

前提条件 Linux环境安装好Docker&#xff0c;可参考Rocky Linux9下安装Docker和卸载Docker Docker命令图 帮助命令 帮助命令&#xff0c;查看有哪些命令可以用 [rootlocalhost ~]# docker --help ​ 查看某个命令的帮助&#xff0c;例如&#xff1a;run [rootlocalhost ~]# …

深入探索机器学习中的目标分类算法

在当今数据驱动的世界中&#xff0c;机器学习&#xff08;Machine Learning, ML&#xff09;正逐渐成为解决问题的重要工具。在众多机器学习任务中&#xff0c;目标分类&#xff08;Classification&#xff09;算法尤其受到关注。本文将深入探讨目标分类算法的基本概念、常见类…

【刷点笔试面试题试试水】 i++与++i哪个效率更高?

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: 都应该知道,i是先增加再参与计算. i是先计算再增加. 原理是i,是直接返…

免费的录屏软件有哪些?可以试试这4款。

录屏软件已经被用于很多的领域和场景当中&#xff0c;能够帮助我们进行在线教学&#xff0c;线上培训&#xff0c;游戏直播与分享&#xff0c;视频记录等等。并且很多的录屏软件都有免费的功能&#xff0c;它们让大家的录屏变得更加的方便。如果大家需要录屏工具的话&#xff0…

认知杂谈92《菜鸟的自我修炼:守住存款,识别诱惑》

内容摘要&#xff1a; “快速致富"的口号在网络和广告中无处不在&#xff0c;它们吸引着渴望改变生活的人。然而&#xff0c;这些诱惑常常是精心设计的骗局&#xff0c;利用人的贪婪本性。成功学导师们宣扬的"成功秘诀"和"快速通道”&#xff0c;让人陷入不…

【MATLAB代码】三维空间上的RSS(信号强度)定位,n个锚点自适应(锚点数>3即可)(源代码下载链接)

文章目录 代码概况源代码运行结果RSS定位原理讲解1.基本概念2.信号强度与距离关系3. 定位原理 其他情况 代码概况 基于MATLAB的定位程序&#xff0c;使用RSS&#xff08;接收信号强度&#xff09;来估计距离&#xff0c;再由距离计算位置&#xff0c;用于三维空间上的定位。调…

一行代码,AI大模型训练成本再降30%,混合精度训练再升级

FP8通过其独特的数值表示方式&#xff0c;能够在保持一定精度的同时&#xff0c;在大模型训练中提高训练速度、节省内存占用&#xff0c;最终降低训练成本。 AI大模型开发系统Colossal-AI的混合精度训练再度升级&#xff0c;支持主流的BF16(O2) FP8(O1)的新一代混合精度训练方…

基于php的民宿预订管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

SpringCloud入门(九)Feign实战应用和性能优化

一、Feign实战应用 Feign的客户端与服务提供者的controller代码非常相似&#xff1a; 有没有一种办法简化这种重复的代码编写呢&#xff1f; 方式一&#xff1a;继承 优点&#xff1a; 简单。实现了代码共享。 缺点&#xff1a;服务提供方、服务消费方紧耦合。参数列表中的注解…

25维谛技术面试最常见问题面试经验分享总结(包含一二三面题目+答案)

开头附上工作招聘面试必备问题噢~~包括综合面试题、无领导小组面试题资源文件免费&#xff01;全文干货。 【免费】25维谛技术面试最常见问题面试经验分享总结&#xff08;包含一二三面题目答案&#xff09;资源-CSDN文库https://download.csdn.net/download/m0_72216164/8979…

TDSQL-C电商可视化,重塑电商决策新纪元

前言&#xff1a; 在数字化浪潮席卷全球的今天&#xff0c;电子商务行业以其独特的魅力和无限潜力&#xff0c;成为了推动全球经济增长的重要引擎。然而&#xff0c;随着业务规模的急剧扩张&#xff0c;海量数据的涌现给电商企业带来了前所未有的挑战与机遇。如何高效地处理、…

02-ZYNQ linux开发环境安装,基于Petalinux2022.2和Vitis2022.2

petalinux安装 Petalinux 工具是 Xilinx 公司推出的嵌入式 Linux 开发套件&#xff0c;包括了 u-boot、Linux Kernel、device-tree、rootfs 等源码和库&#xff0c;以及 Yocto recipes&#xff0c;可以让客户很方便的生成、配置、编译及自定义 Linux 系统。Petalinux 支持 Ver…

秦巴山区SHP格式矢量范围

‌秦巴山区的shp范围包括河南、湖北、重庆、四川、陕西、甘肃六省市的80个县(市、区)。‌这一区域不仅地理范围广泛&#xff0c;而且生态多样性丰富&#xff0c;是国家重要的生物多样性和水源涵养生态功能区。秦巴山区的地貌类型以山地丘陵为主&#xff0c;间有汉中、安康、商丹…

告别背锅侠!29个空场景及测试方法的实战指南

想必大家在日常的测试工作中&#xff0c;经常会碰到以下这些场景&#xff1a; 场景一&#xff1a; 测试人员&#xff1a;有一个数据为空的场景还没有验证。 研发人员&#xff1a;这个场景不会出现&#xff0c;因为没有删除逻辑。 场景二&#xff1a; 研发人员&#xff1a;…

linux项目_c语言:Makefile编写、动态库生成、添加动态库路径

一直想搞懂Linux中Makefile是怎么管理项目的&#xff0c;知识积累到一定程度后&#xff0c;我就做了一个自己的缩小项目去把剩下的细节搞清楚 代码&#xff1a; Service.c: #include <stdio.h> #include "lib_sevr.h" int main(){printf("输入a, b的值…

【Linux网络】详解TCP协议(3)

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; Linux网络 &#x1f389;其它专栏&#xff1a; C初阶 | C进阶 | 初阶数据结构 小伙伴们大家好&#xff0c;本片文章将会讲解 TCP的流量控制和滑动窗口 的相关内容。 如果看到最后您觉得这篇…