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

文章目录

  • 前言
  • 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);}//将某一个数设置成1void 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.rhkb.cn/news/151926.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手机待办事项app哪个好?

手机是日常很多人随身携带的设备&#xff0c;手机除了拥有通讯功能外&#xff0c;还能帮助大家高效管理日常工作&#xff0c;借助手机上的待办事项提醒APP可以快速地帮助大家规划日常事务&#xff0c;提高工作的效率。 过去&#xff0c;我也曾经在寻找一款能够将工作任务清晰罗…

基于Java的4S店汽车商城系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

rsync 远程同步实现快速、安全、高效的异地备份

目录 1 rsync 远程同步 1.1 rsync是什么&#xff1f; 1.2 rsync同步方式 1.3 rsync的特性 1.4 rsync的应用场景 1.5 rsync与cp、scp对比 1.6 rsync同步源 2 配置rsync源服务器 2.1 建立/etc/rsyncd.conf 配置文件 3 发起端 4 发起端配置 rsyncinotify 4.1 修改rsync…

基于SpringBoot的网上摄影工作室

目录 前言 一、技术栈 二、系统功能介绍 用户信息管理 作品分类管理 轮播图管理 摄影作品管理 摄影作品收藏 摄影圈 摄影作品发布 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统…

基于卷积神经网络的图像识别-案例实施1

案例描述 学习如何搭建CNN卷积神经网络&#xff0c;训练cifar-10数据&#xff0c;识别图片中的内容。 案例分析 cifar-10是由Hinton的学生Alex Krizhevsky和Ilya Sutskever整理的一个用于识别普适物体的小型数据集。一共包含 10个类别的 RGB 彩色图 片&#xff1a;飞机&…

GPT系列论文解读:GPT-3

GPT系列 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一系列基于Transformer架构的预训练语言模型&#xff0c;由OpenAI开发。以下是GPT系列的主要模型&#xff1a; GPT&#xff1a;GPT-1是于2018年发布的第一个版本&#xff0c;它使用了12个Transformer…

最全解决docker配置kibana报错 Kibana server is not ready yet

问题复现&#xff1a; 在浏览器输入http://192.168.101.65:5601/ 访问kibana报错 Kibana server is not ready yet 问题报错&#xff1a; 首先查看kibana的日志 docker logs kibana 看到报错如下&#xff1a; {"type":"log","timestamp":&q…

java Spring Boot 手动启动热部署

好 接下来 我们讲一个对开发非常重要的东西 热部署 因为 我们在开发过程中总会希望快点看到效果 或者 你的企业项目一般很大很复杂&#xff0c;重启是一件非常麻烦的事 或者你在和前端同事联调&#xff0c;有一点小问题 你改完就要重启 前端还得等你&#xff0c;非常不友好 那…

[网鼎杯 2020 白虎组]PicDown python反弹shell proc/self目录的信息

[网鼎杯 2020 白虎组]PicDown - 知乎 这里确实完全不会 第一次遇到一个只有文件读取思路的题目 这里也确实说明还是要学学一些其他的东西了 首先打开环境 只存在一个框框 我们通过 目录扫描 抓包 注入 发现没有用 我们测试能不能任意文件读取 ?url../../../../etc/passwd …

10款录屏软分析与选择使用,只看这篇文章就轻松搞定所有,高清4K无水印录屏,博主UP主轻松选择

录屏软件整理 如下为录屏软件&#xff0c;通过思维导图展示分析介绍&#xff1a; https://www.drawon.cn/template/details/6522bd5e0dad9029a0b528e1 如下为整理的录屏软件列表 名称产地价格支持的平台下载地址说明OBS国外免费开源windows/linux/machttps://obsproject.co…

经典算法-----农夫过河问题(深度优先搜索)

目录 前言 农夫过河问题 1.问题描述 2.解决思路 位置编码 获取位置 判断是否安全 深度优先遍历&#xff08;核心算法&#xff09; 3.完整代码 前言 今天我们来解决一个有意思的问题&#xff0c;也就是农夫过河问题&#xff0c;可能这个问题我们小时候上学就听说过类似的…

Flink---10、处理函数(基本处理函数、按键分区处理函数、窗口处理函数、应用案例TopN、侧输出流)

星光下的赶路人star的个人主页 我的敌手就是我自己&#xff0c;我要他美好到能使我满意的程度 文章目录 1、处理函数1.1 基本处理函数&#xff08;ProcessFunction&#xff09;1.1.1 处理函数的功能和使用1.1.2 ProcessFunction解析1.1.3 处理函数的分类 1.2 按键分区处理函数&…

你的librosa和scikit-learn打架了吗?

被这个问题困扰好久&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 我的原来版本librosa0.7.1 和 scikit-learn1.3.1 一直拆了按&#xff0c;按…

【AI视野·今日Robot 机器人论文速览 第四十五期】Mon, 2 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Mon, 2 Oct 2023 Totally 42 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;PONG, Probabilistic Object Normals for Grasping 用于抓取的概率目标归一化&#xff0c;根据目标表面法向量获取的不确定…

抄写Linux源码(Day17:你的键盘是什么时候生效的?)

回忆我们需要做的事情&#xff1a; 为了支持 shell 程序的执行&#xff0c;我们需要提供&#xff1a; 1.缺页中断(不理解为什么要这个东西&#xff0c;只是闪客说需要&#xff0c;后边再说) 2.硬盘驱动、文件系统 (shell程序一开始是存放在磁盘里的&#xff0c;所以需要这两个东…

网络安全--安全认证、IPSEC技术

目录 1. 什么是数据认证&#xff0c;有什么作用&#xff0c;有哪些实现的技术手段&#xff1f; 2. 什么是身份认证&#xff0c;有什么作用&#xff0c;有哪些实现的技术手段&#xff1f; 3. 什么是VPN技术&#xff1f; 4. VPN技术有哪些分类&#xff1f; 5. IPSEC技术能够…

JavaScript-mooc(纯分享)

第一步下载软件 mooc_v1.3.2_windows_amd64.zip - 蓝奏云 解压后打开有这么多文件 用记事本的打开方式打开config的文件 第一个尖头改成你学校对应慕课英华网址 第二个箭头是你的账号 第三个箭头是你的密码 改好后点击文件保存 最后一步点击运行 {"global": {&qu…

一篇理解网络分层原理

一、网络分层的必要性。 如图是一个数据的传输过程&#xff0c;在这个途中会有很多的原因导致数据丢失&#xff0c;网络分层就要可以很大程度的避免这个现象。 网络分层的必要性体现在以下几个方面&#xff1a; 抽象复杂度&#xff1a;网络分层将网络功能按照不同的层次进行分…

基于Kylin的数据统计分析平台架构设计与实现

目录 1 前言 2 关键模块 2.1 数据仓库的搭建 2.2 ETL 2.3 Kylin数据分析系统 2.4 数据可视化系统 2.5 报表模块 3 最终成果 4 遇到问题 1 前言 这是在TP-LINK公司云平台部门做的一个项目&#xff0c;总体包括云上数据统计平台的架构设计和组件开发&#xff0c;在此只做…

C++ - C++11历史 - 统一列表初始化 - aotu - decltype - nullptr - C++11 之后 STL 的改变

目录 C的发展史了解 统一列表初始化 {}初始化 std::initializer_list 在 vector 的模拟实现当中加上 initializer_list 作为参数的构造函数 声明 aotu decltype nullptr C11 之后 STL 的一些变化 新容器 容器中的一些新方法 C的发展史了解 在2003年C标准委员会曾经提…