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

news2024/11/26 10:27:04

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

文章目录

  • 一、位图
    • 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关系值index
		size_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.coloradmin.cn/o/585853.html

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

相关文章

深度学习12—VGG19实现

目录 VGG19实现 1.为数据打标签的generate_txt.py 2.对图像进行预处理的data_process.py 3.VGG19的网络构建代码net_VGG19.py 4.训练得到pth模型参数文件的get_pth_file.py 5.预测代码predict.py 6.预测VGG16与VGG19结果对比 VGG19实现 1.为数据打标签的generate_txt.p…

【git教程】

这里写目录标题 git是什么集中式版本控制系统和分布式版本控制系统git的优势git能做什么(常用)基础教程流程图介绍小节 常用Git命令速查表详解1、HEAD2、add3、commit4、branch5、merge6、rebasemerge和rebase区别7、reset8、revertrevert与reset的区别 git是什么 git是目前世…

【Java算法题】剑指offer_数据结构之02树

前言 刷题链接&#xff1a; https://www.nowcoder.com/exam/oj/ta?page2&tpId13&type265 2. 树 JZ55 二叉树的深度 思路&#xff1a;dep max_deepth(left,right)1&#xff0c;二叉树的深度为根节点到叶子节点&#xff0c;使用递归访问根节点的左孩子和右孩子&…

想要让数据更生动?试试这5种图表工具

在当今大数据时代&#xff0c;数据的利用和分析在各个领域的工作中起着重要的作用。因此&#xff0c;数据可视化图形工具已经成为数据分析的好帮手。事实上&#xff0c;数据可视化的本质是视觉对话。它通过图形手段清晰直观地表达信息&#xff0c;从数据中获得价值。然而&#…

Netty实战(九)

单元测试 一、什么是单元测试二、EmbeddedChannel 概述三、 使用 EmbeddedChannel 测试 ChannelHandler3.1 测试入站消息3.2 测试出站消息 一、什么是单元测试 单元测试的基本思想是&#xff1a;以尽可能小的区块测试代码&#xff0c;并且尽可能地和其他的代码模块以及运行时的…

Java: IO流

1.定义 IO流:存储和读取数据的解决方案 用于读写文件中的数据&#xff08;可以读写文件&#xff0c;或网络中的数据...) 2.IO流的分类 1.按着流的方向 1.输入流&#xff1a;读取 2.输出流&#xff1a;写出 2.按照操作文件类型 1.字节流&#xff1a;所有类型文件 体系&…

Redis:缓存击穿、缓存穿透与缓存雪崩的区别、解决方案

0、前言 近期学习redis相关原理&#xff0c;记录一下开发过程中Redis的一些常见问题及应对方法。 1、缓存穿透 一句话总结&#xff1a;先查redis发现没数据&#xff0c;再去数据库查发现还是没数据。 这种情况下缓存永远不会生效&#xff0c;数据库将承担巨大压力。 我们知道&…

前端食堂技术周刊第 84 期:第 96 届 TC39 会议、Deno 五周年、JavaScript 安全最佳实践、2023 Node.js 性能现状

By Midjournery 美味值&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f; 口味&#xff1a;葡萄冰萃美式 食堂技术周刊仓库地址&#xff1a;https://github.com/Geekhyt/weekly 本期摘要 第 96 届 TC39 会议Deno 五周年JavaScript 安全最佳…

FreeRTOS:信号量

目录 一、信号量是什么二、二值信号量2.1二值信号量简介2.2创建二值信号量2.2.1函数 vSemaphoreCreateBinary()2.2.2函数xSemaphoreCreateBinary()2.2.3 函数 xSemephroeCreateBinaryStatic()2.2.4二值信号量创建过程分析 2.3释放信号量2.3.1函数 xSemaphoreGive ()2.3.2函数 x…

【MySQL学习6:多行输入函数——聚合函数及SQL书写和执行规则】

之前做的笔记都在有道云&#xff0c;之后会一点点将以前的笔记分享出来~ &#xff08;配图在笔记中查看&#xff09; MySQL学习6&#xff1a;多行输入函数——聚合函数及SQL书写和执行规则 SQL书写顺序&#xff1a;SQL99执行顺序&#xff1a;一、常见的聚合函数1. 常见的聚合函…

算法当中的时间、空间复杂度?

1.究竟什么是时间复杂度 时间复杂度是一个函数&#xff0c;它定性描述该算法的运行时间 时间复杂度就是用来方便开发者估算出程序运行的答题时间。 通常会估算算法的操作单元数量来代表程序消耗的时间&#xff0c;这里默认CPU的每个单元运行消耗的时间都是相同的。 假设算法的…

微服务架构之服务监控与追踪

与单体应用相比&#xff0c;在微服务架构下&#xff0c;一次用户调用会因为服务化拆分后&#xff0c;变成多个不同服务之间的相互调用&#xff0c;每个服务可能是由不同的团队开发&#xff0c;使用了不同的编程语言&#xff0c;还有可能部署在不同的机器上&#xff0c;分布在不…

【MySQL】MySQL间隙锁--幻读解决原理

文章目录 一、间隙锁概念二、测试间隙锁范围加锁三、测试等值间隙锁 一、间隙锁概念 当我们用范围条件而不是相等条件检索数据&#xff0c; 并请求共享或排他锁时&#xff0c;InnoDB 会给符合条件的已有数据记录的索引项加锁&#xff1b;对于键值在条件范围内但并不存在的记录…

八、视图集ModelViewSet(重点)

上一章&#xff1a; 七、Django DRF框架GenericAPIView--搜索&排序&分页&返回值_做测试的喵酱的博客-CSDN博客 下一章&#xff1a; 九、DRF生成API文档_做测试的喵酱的博客-CSDN博客 一、视图集ModelViewSet与ReadOnlyViesSet ModelViewSet视图集 与 ReadOnly…

第13届蓝桥杯Scratch国赛真题集锦

编程题 第 1 题 问答题 LED屏幕 题目说明 编程实现 LED屏幕 具体要求: 1).点击绿旗,在舞台中心区域出现由10 x 10方格组成的LED屏幕; 2).按下空格键,LED屏幕最外环方格全部点亮 (方格变为黄色) 3).LED屏幕每秒向内点亮一层,其它LED灯熄灭; 4).直到LED灯在最中心点亮2秒…

games101作业5

作业要求 • Renderer.cpp 中的 Render()&#xff1a;这里你需要为每个像素生成一条对应的光 线&#xff0c;然后调用函数 castRay() 来得到颜色&#xff0c;最后将颜色存储在帧缓冲区的相 应像素中。 • Triangle.hpp 中的 rayTriangleIntersect(): v0, v1, v2 是三角形的三个…

字节跳动测开岗面试居然这么简单....

因为读者里有不少刚入门测试的同学&#xff0c;这两天抽空整理了一份字节测开实习的面试题答案&#xff0c;说实话这个题目真挺简单的&#xff0c;如果你面大厂碰到此类面试题&#xff0c;也算是运气很好啦。大家也可以先自测一下&#xff0c;看看自己能不能答上来。 如果觉得…

vscode 插件 remote-ssh的安装及使用

文章目录 vscode 插件 remote-ssh的安装及使用windows VSCode(clangdremote-ssh) linux(clangd server) 开发环境问题问题1 : getPlatformForHost was canceled问题2 : host 主机不能联互联网问题3 : 每次都要输入密码 vscode 插件 remote-ssh的安装及使用 需要用到的东西1. r…

安装nodejs环境搭建vue项目的框架

说明&#xff1a;想要搭建一个vue项目的框架&#xff0c;先要安装nodejs环境&#xff1b;我的电脑已经安装过&#xff0c;先卸载掉&#xff0c;重新装一遍&#xff08;卸载nodejs参考&#xff1a;http://t.csdn.cn/jHmCU&#xff09; 一、安装nodejs环境 第一步&#xff1a;下…

ssh无密码链接

ssh的基本语法为 ssh host 然后输入密码才可以 如果a想要免密登录b&#xff0c;则a需要将自己的公钥放在b上&#xff0c;原理如下图&#xff1a; 例如&#xff0c;以aricoder这个用户登录的情况下&#xff0c;在服务器01上生成密钥&#xff0c;命令为 ssh-keygen -t rsa然后连…