位图、布隆过滤器、一致性哈希

位图、布隆过滤器、一致性哈希

位图

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

答:40亿个数大概160GB,对于一般的计算机,直接放入内存不太可能。我们只需要判断一个数在不在,可以用一个bit来表示,那么无符号类型有232个整数,一个整数只需要占1bit,那么使用229B,即512MB即可记录无符号范围内的每个数是否出现。
那么给一个无符号整数,我们只需要看对应位置的那一个bit是否为1即可。

  1. 定义
    • 位图是一种紧凑的数据结构,用于表示一组布尔值(0或1)。
    • 它是一个连续的位(bit)数组,每个位代表一个元素的状态。
  2. 存储效率
    • 位图非常节省空间,因为每个位只占用一个二进制位(bit),而不是一个完整的字节(byte)。
    • 例如,一个包含100万个布尔值的位图只需要约125KB(1000000 / 8)的内存。
  3. 操作
    • 设置位(Set Bit):可以通过位运算来设置特定位置的位为1。例如,将第i位设置为1可以使用位操作 bitmap[i / 8] |= (1 << (i % 8))
    • 清除位(Clear Bit):可以通过位运算来清除特定位置的位为0。例如,将第i位清除为0可以使用位操作 bitmap[i / 8] &= ~(1 << (i % 8))
    • 检查位(Check Bit):可以通过位运算来检查特定位置的位是否为1。例如,检查第i位是否为1可以使用位操作 (bitmap[i / 8] & (1 << (i % 8))) != 0
  4. 应用
    • 集合操作:位图可以高效地表示和操作大集合,特别适用于只包含整数的集合。
    • 布隆过滤器(Bloom Filter):一种基于位图的概率数据结构,用于检索一个元素是否属于一个集合,具有很高的空间效率。
    • 快速查找:位图可以用于实现快速查找操作,如查找第一个为1的位或第一个为0的位。
    • 去重和计数:在大规模数据处理中,位图可以用于去重和计数,例如统计唯一用户数或检测重复元素。
  5. 性能
    • 位图操作通常非常高效,因为它们利用了低级位运算,位运算在现代处理器上执行速度非常快。
    • 位图的空间效率和操作效率使其成为许多高性能算法和系统中的关键组件。

综上所述,位图是一种强大且高效的数据结构,广泛应用于各种需要高效存储和操作布尔值或整数集合的场景中。

布隆过滤器

位图主要适合处理整形数据,那么对于海量的字符串数据或其他类型呢?这时候就有请布隆过滤器登场!

布隆过滤器(Bloom Filter)是一种空间效率极高的概率型数据结构,用于判断一个元素是否在一个集合中。它由布隆(Burton Howard Bloom)在1970年发明。**布隆过滤器有误判的风险(因为哈希碰撞的存在),即可能会误认为不存在的元素存在,但不会误认为存在的元素不存在(即它认为存在的不一定不存,它认为不存在的一定不存在)。**它主要用于需要快速判断元素是否在集合中的场景,如垃圾邮件过滤(检查词语或关键字是否存在垃圾词库中)、网页缓存等(判断请求的URL是否已缓存)。所以说布隆过滤器虽然比位图的应用类型广泛了,但是有可能会出现误判,而位图则不会。

工作原理

  1. 初始化:布隆过滤器由一个位数组(bit array)和一组相互独立的哈希函数(hash functions)组成。位数组初始时所有位都设为0。
  2. 插入元素
    • 对于要插入的元素,通过多个哈希函数分别计算哈希值。
    • 每个哈希值对应位数组中的一个位置,将这些位置上的值设为1。
  3. 查询元素
    • 对于要查询的元素,同样通过这些哈希函数计算哈希值。
    • 检查这些哈希值对应的位数组中的位置,如果所有这些位置上的值都是1,则认为该元素可能在集合中。
    • 如果任意一个位置上的值为0,则可以确定该元素不在集合中。

优点

  1. 空间效率高:布隆过滤器只需要少量的空间来存储大量元素的信息,特别适合存储大量数据时。
  2. 查询速度快:插入和查询操作的时间复杂度都是O(k),其中k是哈希函数的数量,通常是一个常数。

缺点

  1. 误判率:布隆过滤器可能会误认为一个不存在的元素在集合中,误判率随着插入元素的数量增加而增加。
  2. 不可删除:一旦元素被插入到布隆过滤器中,就不能简单地删除。虽然可以通过计数布隆过滤器(Counting Bloom Filter)解决这一问题,但会增加空间复杂度。

应用场景

  1. 网络缓存:布隆过滤器可以快速判断某个URL是否已经被缓存,以提高缓存的命中率。
  2. 垃圾邮件过滤:用于快速判断邮件是否为垃圾邮件,避免频繁查询黑名单。
  3. 数据库:在数据库查询中用于快速判断数据是否存在,以减少不必要的查询操作。

总的来说,布隆过滤器是一种高效且实用的数据结构,尤其在需要快速判断元素存在性的场景中,能显著提升性能。

一致性哈希

一致性哈希(Consistent Hashing)是一种用于分布式系统中的哈希算法,主要解决数据分布和负载均衡问题。它的设计初衷是应对动态变化的节点(如服务器)的场景,使得系统在添加或删除节点时,只需要重新映射少部分数据,从而保证系统的平稳运行。

问题1:节点的动态变化

在分布式系统中,服务器节点可能会随时增加或减少。如果每次节点变化都导致大量数据重新分配,会带来很高的成本和性能开销。

传统哈希方法的问题

  • 假设有N个节点,数据通过 hash(key) % N 分配到不同节点上。
  • 当节点数量变化时,几乎所有数据的映射位置都会发生变化。
问题2:数据分布不均衡

简单的哈希方法可能导致数据在节点之间分布不均衡,某些节点负载过重,而其他节点几乎没有负载。

一致性哈希的解决方案

一致性哈希算法通过将节点和数据都映射到一个“哈希环”上来解决上述问题。

  1. 哈希环
    • 将哈希值空间视为一个环形结构。例如,哈希值范围是0到2^32-1,则将其首尾相接形成一个环。
  2. 节点映射
    • 每个节点通过哈希函数映射到环上的一个点(节点哈希值)。
  3. 数据映射
    • 每个数据项(或数据块)也通过哈希函数映射到环上的一个点(数据哈希值)。
    • 数据项由顺时针方向上最近的节点负责存储(即数据项的哈希值落在节点的哈希值之间)。

举例说明

假设有三个节点A、B、C,它们通过哈希函数映射到哈希环上的位置如下:

  • 节点A:哈希值10
  • 节点B:哈希值50
  • 节点C:哈希值90

数据项通过哈希函数映射到以下位置:

  • 数据X:哈希值15(由节点B负责)
  • 数据Y:哈希值70(由节点C负责)
  • 数据Z:哈希值110(由节点A负责)

添加节点

当添加一个新节点D,哈希值为60时,只有一部分数据需要重新分配:

  • 节点C上的数据Y(70)转移到新节点D。

删除节点

当节点B下线时,它负责的数据需要重新分配:

  • 节点B上的数据X(15)重新分配给节点C。

虚拟节点

为解决数据分布不均衡的问题,一致性哈希引入了虚拟节点的概念:

  • 每个物理节点对应多个虚拟节点,虚拟节点通过不同的哈希值映射到环上。
  • 数据映射到虚拟节点,再由虚拟节点映射到物理节点。
  • 这样可以更均匀地分配数据,减少负载不均衡的情况。

一致性哈希的优势

  1. 数据重分布小:节点的增加或减少只影响少部分数据,减少了数据迁移的开销。
  2. 负载均衡:通过虚拟节点机制,可以较好地实现负载均衡。
  3. 高可扩展性:适用于大规模分布式系统,可以平滑地扩展和收缩节点。

应用场景

一致性哈希广泛应用于分布式缓存系统、分布式存储系统和分布式数据库中,如:

  • 分布式缓存系统(如Memcached)
  • 分布式存储系统(如Amazon Dynamo)
  • 分布式数据库(如Cassandra)

通过一致性哈希,分布式系统能够更高效地管理动态变化的节点,保证数据分布的均衡性和系统的高可用性。

题目

哈希切割

问:给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址?又如何找到top K的IP?

答:讲100G的大文件分成1000个小文件,如何分呢?将每个ip哈希映射到1000个小文件中,那么ip相同的一定在一个文件中。即可依次读入1000个小文件,在内存中进行排序再计算,维护出现次数最多的IP即可。

位图

1.问:给定100亿个整数,设计算法找到只出现一次的整数?

答:与最开始讲位图类似,不同的是这里我们使用两个bit来表示一个整数的状态,因为至少需要表示出现0次,出现1次,出现1次以上三种状态。

2.问:给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?

答:将每个文件的所有整数使用一个位图来表示,一个位图512MB两个位图刚好1G,再将两个位图与一下,最后看哪些位为1即是两个文件的交集。

3.问:1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数?

答:与第一问一样,还是使用两个bit即可表示4中状态,出现0次,出现1次,出现2次,出现超过2次。

布隆过滤器

问:给两个文件,分别有100亿个sql 查询语句,每个语句平均30B到60B大小,我们只有1G内存,如何找到两个文件交集?分别给出精确算法和近似算法

答:近似算法:将其中一个文件读入布隆过滤器中,再读取另一个文件,检查语句是否在布隆过滤器中,存在即为交集可能的成员。
精确算法:两个100亿语句的文件使用同一个哈希函数各自映射到10000个文件(A0-A9999,B0-B9999)中,随后A0和B0比,找交集,存set里,再A1和B1比,依次下去。

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

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

相关文章

Spring学习05-[AOP学习-AOP原理和事务]

AOP原理和事务 AOPAOP底层原理比如下面的代码案例手动模拟AOP 动态代理详解JDK动态代理具体实现 Cglib动态代理具体实现 jdk动态代理和cglib动态代理的区别 事务 AOP AOP底层原理 当实现了AOP,Spring会根据当前的bean创建动态代理(运行时生成一个代理类) 面试题&#xff1a;为…

JAVA之(static关键字、final关键字)

JAVA之&#xff08;static关键字、final关键字&#xff09; 一、 static关键字1、静态变量2、静态方法3、 静态代码块4、例子 二、final关键字1、final修饰类2、 final修饰方法3、修饰变量 一、 static关键字 1、静态变量 private static String str1“staticProperty”2、静…

适合中小企业的MES管理系统有哪些特点

在当今竞争激烈的商业环境中&#xff0c;中小企业对于高效、灵活的生产管理系统的需求日益凸显。面对这些企业的MES管理系统不仅成为监控生产过程的得力助手&#xff0c;还通过提供关键数据&#xff0c;构建起客户期望与制造车间实时订单状态之间的紧密桥梁&#xff0c;以下是对…

Vue3使用markdown编辑器之Bytemd

官网地址&#xff1a;https://bytemd.js.org/playground GitHub地址&#xff1a;https://github.com/bytedance/bytemd ByteMD 是字节跳动出品的富文本编辑器&#xff0c;功能强大&#xff0c;可以免费使用&#xff0c;而且支持很多掘金内置的主题&#xff0c;写作体验很棒。 …

【Unity2D 2022:Particle System】添加拾取粒子特效

一、创建粒子特效游戏物体 二、修改粒子系统属性 1. 基础属性 &#xff08;1&#xff09;修改发射粒子持续时间&#xff08;Duration&#xff09;为3s &#xff08;2&#xff09;取消勾选循环&#xff08;Looping&#xff09; &#xff08;2&#xff09;修改粒子存在时间&…

星网安全产品线成立 引领卫星互联网解决方案创新

2024年6月12日&#xff0c;盛邦安全&#xff08;688651&#xff09;成立星网安全产品线&#xff0c;这是公司宣布全面进入以场景化安全、网络空间地图和卫星互联网安全三大核心能力驱动的战略2.0时代业务落地的重要举措。 卫星互联网技术的快速发展&#xff0c;正将其塑造为全球…

leetcode:编程基础0到1

文章目录 交替合并字符串str.length();StringBuilder类型 ,toString()append() &#xff0c;chatAt()题目描述 交替合并字符串 str.length(); 输出字符串str的长度 StringBuilder类型 ,toString() append() &#xff0c;chatAt() 题目描述 class Solution {public String …

(译文)IRIG-B对时编码快速入门

原文 PDF&#xff1a;https://ww1.microchip.com/downloads/aemDocuments/documents/FTD/tekron/tekronwhitepapers/221223-A-guide-to-IRIG-B.pdf IRIG-B3 概论 Inter-Range Instrument Group 时间码&#xff08;简称IRIG&#xff09;是一系列标准时间码格式。用于将时间信…

俄罗斯VK Ads开户充值全流程!VK如何开户?VK如何注册?VK广告

在俄罗斯&#xff0c;VK&#xff08;VKontakte&#xff09;是一个广受欢迎的社交媒体平台&#xff0c;对于寻求进入该市场的企业来说&#xff0c;进行VK广告推广是一条有效途径。 首先&#xff0c;你需要明确自己要推广的产品或服务&#xff0c;并且确定目标市场和受众。 由于…

1.8.0-矩阵乘法的反向传播-简单推导

1相关资料 之前分享过一个博客里面写的&#xff0c;我们大致了解并记住结论的博客&#xff1a;【深度学习】7-矩阵乘法运算的反向传播求梯度_矩阵梯度公式-CSDN博客&#xff1b;这里再分享一下自然语言处理书上关于这部分的推导过程&#xff1a;3-矩阵相乘-梯度反向传播的计算…

如何下载jmeter旧版本

如何下载jmeter旧版本 推荐先用旧版本做好测试基本操作&#xff0c;因为高版本不适合做压力测试&#xff0c;需要证书&#xff0c;有点麻烦。 1.百度或直接打开jmeter官网&#xff1a;https://jmeter.apache.org/ 2.向下拖到Archives一栏&#xff0c;点击Apache Jmeter archi…

ICC2:ignore pin的设置

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 相关文章链接:

OS Copilot测评

1.按照第一步管理重置密码时报错了,搞不懂为啥?本来应该跳转到给的那个实例的,我的没跳过去 2.下一步重置密码的很丝滑没问题 3安全组新增入库22没问题 很方便清晰 4.AccessKey 还能进行预警提示 5.远程连接,网速还是很快,一点没卡,下载很棒 6.替换的时候我没有替换<>括…

六、快速启动框架:SpringBoot3实战-个人版

六、快速启动框架&#xff1a;SpringBoot3实战 文章目录 六、快速启动框架&#xff1a;SpringBoot3实战一、SpringBoot3介绍1.1 SpringBoot3简介1.2 系统要求1.3 快速入门1.4 入门总结回顾复习 二、SpringBoot3配置文件2.1 统一配置管理概述2.2 属性配置文件使用2.3 YAML配置文…

调制信号识别系列 (一):基准模型

调制信号识别系列 (一)&#xff1a;基准模型 说明&#xff1a;本文包含对CNN和CNNLSTM基准模型的复现&#xff0c;模型架构参考下述两篇文章 文章目录 调制信号识别系列 (一)&#xff1a;基准模型一、论文1、DL-PR: Generalized automatic modulation classification method b…

如何优化 PostgreSQL 中对于复杂数学计算的查询?

文章目录 一、理解复杂数学计算的特点二、优化原则&#xff08;一&#xff09;索引优化&#xff08;二&#xff09;查询重写&#xff08;三&#xff09;数据库配置调整&#xff08;四&#xff09;使用数据库内置函数的优势 三、具体的优化方案和示例&#xff08;一&#xff09;…

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【加密导入密钥(C/C++)】

加密导入密钥(C/C) 以加密导入ECDH密钥对为例&#xff0c;涉及业务侧加密密钥的[密钥生成]、[协商]等操作不在本示例中体现。 具体的场景介绍及支持的算法规格。 在CMake脚本中链接相关动态库 target_link_libraries(entry PUBLIC libhuks_ndk.z.so)开发步骤 设备A&#xf…

【机器学习】——决策树模型

&#x1f4bb;博主现有专栏&#xff1a; C51单片机&#xff08;STC89C516&#xff09;&#xff0c;c语言&#xff0c;c&#xff0c;离散数学&#xff0c;算法设计与分析&#xff0c;数据结构&#xff0c;Python&#xff0c;Java基础&#xff0c;MySQL&#xff0c;linux&#xf…

PHP宝藏神器多功能投票系统源码小程序

&#x1f389;发现宝藏神器&#xff01;一键解锁“多功能投票小程序”的无限可能✨ &#x1f308; 开篇安利&#xff1a;告别繁琐&#xff0c;拥抱高效&#xff01; Hey小伙伴们&#xff0c;是不是经常为组织活动、收集意见而头疼不已&#xff1f;&#x1f92f; 今天就要给大…

迭代器模式(大话设计模式)C/C++版本

迭代器模式 C #include <iostream> #include <string> #include <vector>using namespace std;// 迭代抽象类,用于定义得到开始对象、得到下一个对象、判断是否到结尾、当前对象等抽象方法&#xff0c;统一接口 class Iterator { public:Iterator(){};virtu…