位图、布隆过滤器、海量数据处理

news/2025/1/18 6:37:26/

提示:
本文介绍了,位图、布隆过滤器、以及海量数据处理问题。
本节有很多关于大数处理的案例(已解答)。
在这里插入图片描述
——细雨斜风作晓寒,淡烟疏柳媚晴滩。(苏轼)

文章目录

  • 一、位图
    • 1.1 位图概念
    • 1.2 位图实现
    • 1.3 单位图的应用方面
  • 二、布隆过滤器
    • 2.1 基本概念
    • 2.2 映射关系与代码
    • 2.3 布隆过滤器的查找与删除
    • 2.4 布隆过滤器的优缺点
  • 三、海量数据处理题
    • 3.1 哈希切割
    • 3.2 位图应用
    • 3.3 布隆过滤器


一、位图

1.1 位图概念

在计算机的底层,所有的数据都是一段段二进制代码,都只有两个状态0/1,有或无两种状态,而无数个两种状态构成了缤纷多彩的计算机系统。
而位图便是与这种储存方式极其相似的一种数据结构,一般用来记忆、储存、查找。
位图适用于海量数据,通常用来判断某个数据存在与否。
位图:
位图结构仅需要三个数,就可以存储24组信息。
在这里插入图片描述

题目:

1.给40亿个不重复的无符号整数,如何判断某一个具体的数是否在这40亿之中。

我们第一时间想到的是那种解法呢?

  1. 遍历查找。
  2. 排序,利用二分查找。
  3. 位图解决(位图的概念刚好符号这个题目的定义,有或者无)

1.2 位图实现

//初始开辟大小N
template<size_t N>
class bitset
{
public:bitset(){//开辟空间_bit.resize(N / 8 + 1, 0);}void set(size_t x){size_t i = x / 8;size_t j = x % 8;//将x对应位置一_bit[i] |= (1 << j);}void reset(size_t x){size_t i = x / 8;size_t j = x % 8;//将x对应位置零_bit[i] &= ~(1 << j);}bool find(size_t x){size_t i = x / 8;size_t j = x % 8;//查找x对应位是否存在return _bit[i] &= (1 << j);}
private:vector<int> _bit;int _bitCount;
};

1.3 单位图的应用方面

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

二、布隆过滤器

2.1 基本概念

布隆过滤器的提出是为了弥补单位图在某些方面的不足。
布隆过滤器是由布隆(Burton Howard Bloom)在1970年提出的 一种紧凑型的、比较巧妙的概率型数据结构,特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”,它是用多个哈希函数,将一个数据映射到位图结构中。此种方式不仅可以提升查询效率,也可以节省大量的内存空间。
布隆过滤器就好像一种多映射数据关系,数据的插入与查询等等功能都依托多种映射关系定位。

布隆过滤器映射图:
在这里插入图片描述
就像这样的种种映射关系,一个具体的数字对应位图中多位,来构成多级索引,存储查询。

具体hash关系:

存入张三
在这里插入图片描述
存入李四
在这里插入图片描述
通过图片可以看到他们分别由三中hash关系映射,也有重合的值,但是不完全重合。

2.2 映射关系与代码

代码:

//都是很多权威的大佬研究出的位图中不易重合hash关系映射
//hash映射关系一
struct BKDRHash
{size_t operator()(const string& s){size_t value = 0;for (auto ch : s){value *= 31;value += ch;}return value;}
};
//hash映射关系二
struct APHash
{size_t operator()(const string& s){size_t hash = 0;for (long i = 0; i < s.size(); i++){if ((i & 1) == 0){hash ^= ((hash << 7) ^ s[i] ^ (hash >> 3));}else{hash ^= (~((hash << 11) ^ s[i] ^ (hash >> 5)));}}return hash;}
};
//hash映射关系三
struct DJBHash
{size_t operator()(const string& s){size_t hash = 5381;for (auto ch : s){hash += (hash << 5) + ch;}return hash;}
};

进入映射:

//不同的映射template
template<size_t N,size_t X = 5,class K = string,class HashFunc1 = BKDRHash,class HashFunc2 = APHash,class HashFunc3 = DJBHash>class BloomFilter
{
public:void Set(const K& key){//空间size_t len = X * N;//计算三种hash关系值indexsize_t index1 = HashFunc1()(key) % len;size_t index2 = HashFunc2()(key) % len;size_t index3 = HashFunc3()(key) % len;//位图记录_bs.set(index1);_bs.set(index2);_bs.set(index3);}bool Test(const K& key){//查找是否存在,单存在一定误判(极少)size_t len = X * N;size_t index1 = HashFunc1()(key) % len;if (_bs.test(index1) == false)return false;size_t index2 = HashFunc2()(key) % len;if (_bs.test(index2) == false)return false;size_t index3 = HashFunc3()(key) % len;if (_bs.test(index3) == false)return false;return true;  // 存在误判的}// 不支持删除,删除可能会影响其他值。void Reset(const K& key);
private:bitset<X* N> _bs;
};

2.3 布隆过滤器的查找与删除

删除:
首先布隆过滤器不支持删除,因为每个存入值并非一一对应关系,删除就预示着存在误删情况。
查找:
同时布隆过滤器的查找并非精确查找,有概率出现误差,布隆过滤器可以理解为一种粗略查找方式。
但是如果确定某一个数不存在于布隆过滤器中那就一定不在布隆过滤器中,但如果该数存在却又是一种不确定存在,因为哈希函数有一定程度的误判。

2.4 布隆过滤器的优缺点

优点:

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

缺点:

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

三、海量数据处理题

3.1 哈希切割

  1. 给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址?
  2. 与上题条件相同,如何找到top K的IP?如何直接用Linux系统命令实现?

3.2 位图应用

  1. 给定100亿个整数,设计算法找到只出现一次的整数?
  2. 给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?
  3. 位图应用变形:1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数。

3.3 布隆过滤器

  1. 给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件交集?分别给出
    精确算法和近似算法。
  2. 如何扩展BloomFilter使得它支持删除元素的操作。

http://www.ppmy.cn/news/103725.html

相关文章

Linux:LAMP的架构与环境配置

这里写目录标题 一、LAMP1.1 LAMP是什么1.2 安装顺序 二、编译安装Apache httpd服务2.1 关闭防火墙&#xff0c;将安装Apache所需软件包传到/opt目录下2.2 安装环境依赖包2.3 配置软件模块2.4 编译及安装2.5 优化配置文件路径2.6 添加httpd系统服务2.7 修改httpd 服务配置文件2…

springweb

SpringWeb 概述 springWeb 是 spring 框架的一个模块&#xff0c;springWeb 和 spring 无需通过中间整 合层进行整合。 springWeb 是一个基于 mvc 的 web 框架,方便前后端数据的传输. SpringWeb 拥有控制器&#xff0c;接收外部请求&#xff0c;解析参数传给服务层. SpringM…

枚举_源码_分析

枚举源码分析 前言 这是所有Java语言枚举类型的公共基类。关于枚举的更多信息&#xff0c;包括编译器合成的隐式声明方法的描述&#xff0c;可以在Java的第8.9节中找到™ 语言规范。 请注意&#xff0c;当使用枚举类型作为集合的类型或映射中键的类型时&#xff0c;可以使用专…

Java Spring概述

文章目录 1、Spring是什么&#xff1f;2、Spring 的狭义和广义3、Spring Framework特点4、Spring模块组成5、Spring6版本要求 1、Spring是什么&#xff1f; Spring 是一款主流的 Java EE 轻量级开源框架 &#xff0c;Spring 由“Spring 之父”Rod Johnson 提出并创立&#xff…

推荐一波免费的ChatGPT镜像,助力开发,事半功倍!

目录 核桃 andisearch 小杰AI zw7 AI万能助手 核桃 ​​​​​​​https://chat.jubianxingqiu.com/ 这个网站的使用和回答都是快速和准确的&#xff0c;只要提问的问题越具体&#xff0c;回答的答案就会更精准。而且这个网站还有一个好处就是不用充值也能用&#xff…

Java 集合、数组、字符串的相互转换(关于list.toArray(new String[0])的源码分析)

在 Java 中&#xff0c;可以通过以下方式实现集合、数组和字符串之间的相互转换。 一、集合和数组的相互转化 ①、将集合转为数组&#xff1a;&#xff08;toArray 方法&#xff09; List<String> list new ArrayList<>(); list.add("apple"); lis…

七个合法学习黑客技术的网站,让你从萌新成为大佬

合法的学习网站&#xff0c;以下这些网站&#xff0c;虽说不上全方位的满足你的需求&#xff0c;但是大部分也都能。能带你了解到黑客有关的技术&#xff0c;视频&#xff0c;电子书&#xff0c;实践&#xff0c;工具&#xff0c;数据库等等相关学习内容。以上这些网站我都是用…

在 AWS EC2 Linux 服务器上部署Gunicorn

在 AWS EC2 Linux 服务器上部署 Flask 应用的步骤类似&#xff0c;你也可以使用 Gunicorn。以下是具体步骤&#xff1a; 1. 连接到你的 AWS EC2 实例。你可以通过 SSH 进行连接&#xff0c;如&#xff1a; ssh -i /path/to/your/key.pem ec2-useryour-ec2-ip-address 2. 在你…