数据结构——哈希的应用之位图,布隆过滤器与哈希切割

news2024/11/23 21:45:46

文章目录

  • 前言
  • 1. 位图
    • 1.1 位图的概念
    • 1. 2 模拟实现stl位图
    • 位图的应用
  • 2.布隆过滤器
    • 2.1 布隆过滤器的概念
  • 布隆过滤器的查找
  • 布隆过滤器的删除问题
    • 布隆过滤器优点
    • 布隆过滤器缺陷
  • 哈希切割

前言

本篇博客主要讲述的是应用哈希的一些数据结构_位图和布隆过滤器,讲解了这两个数据结构的性质和意义所在,还有一个使用哈希的数据处理方法——哈希切割,最后给出了一些具体的使用场景。

1. 位图

1.1 位图的概念

其的作用更多的是在于对整型能够快速判断是否存在于海量数据中的场景,简单来说,所谓位图,就是用每一个比特位来存放某种状态,适用于海量数据数据无重复的场景,,通常是用来判断某个数据是否存在的。

1. 2 模拟实现stl位图

在C++中,我们可以用vector来模拟实现位图,每个int有32个比特位,在操作时,我们可以先用/来找到当前数字在第几个int,然后用%找到其在该int的第几个位,同时,可以采用非类型模板参数来指定位图的大小。

模拟代码如下:

template<size_t N>
class bitset
{
public:
	bitset()
	{
		//一个int可以存32个比特位,向上取等即可
		size_t num = N / 32 + 1;
		_set.resize(num);
	}
	//将某一个数设置成1
	void set(size_t n)
	{
		//先算出来在哪个数组,然后再算出来在哪一位
		size_t i = n / 32;
		size_t j = n % 32;
		//底层的第j位可能跟大小端有关系,但是上层不需要关心
		_set[i] |= (1 << j);
		
	}
	//将某一位数取消啊设置
	void reset(size_t n)
	{
		size_t i = n / 32, j = n % 32;
		_set[i] &= (~(1 << j));
	}

	bool text(size_t n)
	{
		size_t i = n / 32, j = n % 32;
		return (_set[i] >> j) & 1;
	}
private:
	vector<int> _set;
};

位图的应用

  1. 快速查找某个数据是否在集合中
  2. 排序 + 去重
  3. 求两个集合的交集,并集等
  4. 操作系统中磁盘快标记

具体实例:
5. 给定100亿个整数,设计算法找出只出现一次的整数?

首先分析题目,100亿个整数,如果直接全部放入内存之中,那么空间肯定是不够的,我们可以采用位图的思想,并且稍加修改,使用两个位图,如果一个整数只出现了一次在第一个位图的位置标记成1,如果出现了不止一次,就将第二个位图对应位置标记成1,同时将第一个位图的位置标记成0,最后遍历完成之后,我们只需要找位图1中是标记是1的数字即可。

2.布隆过滤器

2.1 布隆过滤器的概念

布隆过滤器是布隆在1970年提出的一种紧凑型的,比较巧妙的概率型数据结构,特点是能够高效的插入和查询,可以告诉你某样东西一定不存在或者可能存在,其本质如下:

多个哈希函数,将一个数据映射到位图结构中,这种方式不仅可以提升查询效率,也可以节省大量的内存空间。

考虑为什么不能直接用一个哈希然后映射到位图?
这是由于哈希冲突的原因,例如对于字符串的哈希,我们知道两个不同的字符串通过哈希函数哈希之后的出来的值是有可能会冲突的,这就导致了有可能会导致误判的情况,这种情况虽然不能避免,但是可以尽可能的减小其发生的概率

那就是布隆提出来的方法,利用多个哈希函数进行哈希将一个值映射到不同的位置,这样就算有一些值发生了冲突,但只要还有一个值没有被标记,那么这一数据就 肯定没有出现过!

在这里插入图片描述

布隆过滤器的查找

布隆过滤器的思想是将一个元素用多个哈希函数映射到一个位图中,因此被映射到的位置的比特 位一定为1。所以可以按照以下方式进行查找:分别计算每个哈希值对应的比特位置存储的是否为 零,只要有一个为零,代表该元素一定不在哈希表中,否则可能在哈希表中。

布隆过滤器的删除问题

试想一下,布隆过滤器能进行删除操作吗?
答案是不能!这是由于可能有哈希冲突的存在,所以删除某些数据之后可能同时会把其他数据哈希的比特位也置为0, 就会导致本来存在的数据变成了不存在。

有一种支持删除的方法如下:
将布隆过滤器中的每个比特位扩展成一个小的计数器,插入元素时给k个计 数器(k个哈希函数计算出的哈希地址)加一,删除元素时,给k个计数器减一,通过多占用几倍存储 空间的代价来增加删除操作。
但是这种计数方法也会引出一些问题:

  1. 消耗空间加大很多
  2. 存在计数回绕问题(用于计数的数据类型一般是无符号类型,不存在负数,所以会从0变到最大值)

布隆过滤器优点

  1. 增加和查询元素的时间复杂度: O(K)(K为哈希函数个数),与数据量无关
  2. 哈希函数之间没有关系,方便硬件并行运算
  3. 布隆过滤器不需要存储元素本身,对某些保密要求比较严格的场合有很大优势 你
  4. 在能够承受一定程度的误判时,布隆过滤器比其他数据结构有很大的空间优势
  5. 数据量很大时,布隆过滤器可以表示全集,其他数据结构不能
  6. 使用同一组哈希函数的布隆过滤器可以进行交,并,差运算

布隆过滤器缺陷

  1. 误判率,即存在假阳性(False Position),即不能准确判断元素是否在集合中(补救方法:再 建立一个白名单,存储可能会误判的数据)
  2. 不能获取元素本身
  3. 一般情况下不能从布隆过滤器中删除元素
  4. 如果采用计数方式删除,存在计数回绕问题

哈希切割

看下面例子,给一个超过100G大小的log file,log中存有ip地址,如何找到出现次数最多的IP地址?

首先,由于文件有100个G, 不可能直接放入一台电脑比较,那么肯定要分成多个文件,但是如果时普通的平均分,那么我们要找出现最多的ip那时间复杂度将会时 O ( n 2 ) O(n^2) O(n2),效率极低。
因此,我们需要使用哈希切割的方法,对用同一个哈希函数散列后相同的log放进同一个文件中,这样就能够保证相同的IP一定会出现在同一个文件,然后再用C++的unordered_map统计次数即可!

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

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

相关文章

常见算法-三色棋(Gossip)

常见算法-三色棋&#xff08;Gossip&#xff09; 1、说明 三色旗的问题最早由E.W.Dijkstra所提出&#xff0c;他所使用的用语为Dutch Nation Flag(Dijkstra为荷兰人)&#xff0c;而多数的作者则使用Three-Color Flag来称之。 假设有一条绳子&#xff0c;上面有红、白、蓝三种…

OpenCV3-Python(7)模板匹配和霍夫检测

模板匹配 膜版匹配不能匹配尺度变换和视角变换的图像 图片中查找和模板相似度最高的图像 计算相似程度最高的位置 res cv.matchTemplate(img , template, method) 该方法返回一个类似灰度图的东西&#xff0c;如果用的相关匹配&#xff0c;那么亮的地方就是可能匹配上的地方 …

【高等の数学】e^-3x的一阶导数

一、直接公式法 对于指数函数 f(x) e^g(x)&#xff0c;其中 g(x) 是关于 x 的函数&#xff0c;导数 f(x) 可以表示为 f(x) g(x) * e^g(x)。 在我们的情况下&#xff0c;g(x) -3x。 我们先求导 g(x) &#xff08;-3x&#xff09; -3。因此&#xff0c;我们有 g(x) -3。 现…

基于OpenCV设计的流媒体播放器(RTSP、RTMP)

一、前言 随着互联网的普及和发展,流媒体技术已成为日常生活中不可或缺的一部分。流媒体播放器作为流媒体技术的重要组成部分,其性能和功能直接影响到用户的观影体验。本文介绍使用OpenCV和Qt设计一款流媒体播放器,专门用于播放直播视频流,例如RTSP、RTMP。该播放器只播放…

【深度学习】UniControl 一个统一的扩散模型用于可控的野外视觉生成

论文&#xff1a;https://arxiv.org/abs/2305.11147 代码&#xff1a;https://github.com/salesforce/UniControl#data-preparation docker快速部署&#xff1a;https://qq742971636.blog.csdn.net/article/details/133129146 文章目录 AbstractIntroductionRelated WorksUniCo…

【微服务】八. 统一网关gateway

8.1 网关作用介绍 网关功能&#xff1a; 身份认证和权限校验服务路由、负载均衡请求限流 网关的技术实现 在SpringCloud中网关的实现包括两种&#xff1a; gatewayzuul Zuul是基于Servlet的实现&#xff0c;属于阻塞式编程。而SpringCloudGateway则是基于Spring5中提供的Web…

计算机竞赛 题目:基于深度学习的中文对话问答机器人

文章目录 0 简介1 项目架构2 项目的主要过程2.1 数据清洗、预处理2.2 分桶2.3 训练 3 项目的整体结构4 重要的API4.1 LSTM cells部分&#xff1a;4.2 损失函数&#xff1a;4.3 搭建seq2seq框架&#xff1a;4.4 测试部分&#xff1a;4.5 评价NLP测试效果&#xff1a;4.6 梯度截断…

strapi系列-如何去掉接口auth校验?秒解决接口401问题

配置了strapi接口settings-user-permissions的roles接口为public,但是访问接口依然是401该怎么处理&#xff1f;strapi接口401该怎么处理&#xff1f;如何去掉接口auth校验&#xff1f; 问题解决 必须保证以下几点 权限检查&#xff0c;api接口 手动开放 接口权限已经进行配…

如何对比github中不同commits的区别

有时候想要对比跨度几十个commits之前的代码区别&#xff0c;想直接使用github的用户界面。可以直接在官网操作。 示例 首先要创建一个就commit的branch。进入该旧的commit&#xff0c;然后输入branch名字即可。 然后在项目网址后面加上compare即可对比旧的branch和新的bran…

TensorFlow案例学习:对服装图像进行分类

前言 官方为我们提供了一个 对服装图像进行分类 的案例&#xff0c;方便我们快速学习 学习 预处理数据 案例中有下面这段代码 # 预处理数据&#xff0c;检查训练集中的第一个图像可以看到像素值处于0~255之间 plt.figure() # 创建图像窗口 plt.imshow(train_images[0]) # …

人工智能辅导程序 Mr. Ranedeer AI Tutor

人工智能技术正在不断发展&#xff0c;并在各个领域发挥着越来越重要的作用。在教育领域&#xff0c;人工智能也得到了广泛的应用&#xff0c;其中包括人工智能辅导程序。 Mr. Ranedeer AI Tutor 是一个开源的人工智能辅导程序&#xff0c;使用 OpenAI 的 GPT-4 语言模型来提供…

数据结构 第3章作业 栈和队列 西安石油大学

第3章 栈和队列 有5个元素&#xff0c;其入栈次序为&#xff1a;A,B,C,D,E&#xff0c;在各种可能的出栈次序中&#xff0c;以元素C、D最先出栈&#xff08;即C第一个且D第二个出栈)的次序有哪几个? 3个&#xff1a;CDEBA&#xff1b;CDBEA&#xff1b;CDBAE 此题考查的知识…

用ChatGPT做数据分析,提升10倍工作效率

目录 写报告分析框架报告框架指标体系设计 Excel 写报告 分析框架 拿到一个专题不知道怎么做&#xff1f;没关系&#xff0c;用ChatGPT列一下框架。 以上分析框架挺像那么回事&#xff0c;如果没思路的话&#xff0c;问问ChatGPT能起到找灵感的作用。 报告框架 报告的框架…

Django开发之进阶篇

Django进阶篇 一、Django学习之模板二、Django学习之中间件默认中间件自定义中间件 三、Django学习之ORM定义模型类生成数据库表操作数据库添加查询修改删除 一、Django学习之模板 在 Django 中&#xff0c;模板&#xff08;Template&#xff09;是用于生成动态 HTML&#xff…

Jmeter常用断言之断言持续时间简介

Duration Assertion&#xff1a;断言持续时间。 断言持续时间通常用于做性能测试&#xff0c;一般用于检查HTTP请求的响应时间是否超过预期值。而这个响应时间是性能测试中常关注的一个性能指标。 一、添加断言方式 根据需要可在【测试计划】、【线程组】、【线程请求】下添加…

VMware Horizon 8 运维系列(三)win10设置共享桌面图标

前言 在win10模板上用管理员帐号安装好软件之后&#xff0c;有的软件快捷图标不会出现在桌面上&#xff0c;有的即使有在桌面上出现&#xff0c;但是当发布云桌面池后&#xff0c;客户端登录的都是不同的域用户&#xff0c;当不同的用户登录系统的时候&#xff0c;很多软件快捷…

端粒/端粒酶生信切入点,6+端粒酶+泛癌+甲基化+实验。

今天给同学们分享一篇端粒酶泛癌甲基化实验的生信文章“Genomic, epigenomic, and transcriptomic signatures for telomerase complex components: a pan‐cancer analysis”&#xff0c;这篇文章于2022年10月31日发表在Mol Oncol期刊上&#xff0c;影响因子为6.6。 激活端粒酶…

提高战斗力+分享游戏干货,带你解锁无敌吃鸡技巧!

大家好&#xff01;作为吃鸡行家&#xff0c;我今天要和大家聊一些热门话题&#xff0c;包括如何提高战斗力和分享游戏干货&#xff0c;以及吃鸡作图、装备查询等技巧。 首先&#xff0c;让我们来谈谈提高战斗力。在绝地求生&#xff08;PUBG&#xff09;等吃鸡游戏中&#xff…

Flink---11、状态管理(按键分区状态(值状态、列表状态、Map状态、归约状态、聚合状态)算子状态(列表状态、广播状态))

星光下的赶路人star的个人主页 这世上唯一扛得住岁月摧残的就是才华 文章目录 1、状态管理1.1 Flink中的状态1.1.1 概述1.1.2 状态的分类 1.2 按键分区状态&#xff08;Keyed State&#xff09;1.2.1 值状态&#xff08;ValueState&#xff09;1.2.2 列表状态&#xff08;ListS…

H5逆向之远程RPC

引言前一讲说过H5 怎么去抓包,逆向分析。其中说到RPC。这一节详细讲一下。有一种情况,JS 比较复杂,混淆的厉害。 这个时候就用到RPC。原理就是,hook web 浏览器,直接调用js 里边的方法。 Node 服务。为什么用到Node 服务,先来看下这架构 Node 对外提供各种接口,外部可以…