Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >面试题,如何在千万级的数据中判断一个值是否存在?

面试题,如何在千万级的数据中判断一个值是否存在?

作者头像
ImportSource
发布于 2019-05-06 07:58:44
发布于 2019-05-06 07:58:44
4.6K0
举报
文章被收录于专栏:ImportSourceImportSource

当你看到这个标题的时候,你也许会想我可以使用hashmap之类的来存储值,然后get就是了。又或者把数据存在数据库里然后去判断就可以了。

但你有没有想过数据量那么大全部存储起来是不是有点太重了。为了判断是否存在得把所有的数据都存储起来,这个数据量得有多大。

所以我们先把map这种数据结构先排除掉,去看看本期的主角:Bloom Filter。

Bloom Filter初识

在东方大地,它的名字叫:布隆过滤器。该过滤器在一些分布式数据库中被广泛使用,比如我们熟悉的hbase等。它在这些数据库中扮演的角色就是判断一个值是否存在。这些分布式数据库之所以青睐它,就是因为它有很强大的性能,而且存储空间又小。

布隆过滤器核心就是两点,bit数组和hash。

你听到这里是不是表示不屑,废话,map还不是一个数组和hash。没错,存放数据无非就是个数组和hash。但布隆过滤器的数组和hash有点不一样。

它的数组里的值只有两种可能,要么是1,要么是0,没有其他第三个值。1表示存在,0表示不存在。

它的hash有多个hash。注意,可以是多个hash,不是一个hash。

那布隆过滤器数据结构究竟是怎么存储的呢?我们简单的画个图你就明白了。

没错,就是一个数组,然后里边的值都是一些0和1。数组的初始状态是全部为0。然后每插入一个值,就会把该值的几个hash后的映射值改为1。如上图所示。

那如何去添加一个值进去呢?然后又如何判断该值是否存在呢?现在需要确定位置,这个道理和hashmap的道理是一样的,使用hash来确定位置。

比如我要判断x是否存在,那么我就通过生成的三个hash函数来分别hash到数组的三个位置去,然后获取这个三个位置的值是否都为1,如果是,就认为x是存在(极有可能)的。反之,如果有一个位置的值为0,那么x必然不存在。

那么你现在肯定纳闷,这个hash函数是固定几个hash函数吗?还是怎么样?

hash生成的规则

嗯,这是布隆过滤器核心思想之一,通过查找布隆过滤器的论文可知,它有一个公式,通过这个公式来计算hash。

gi(x) = h1(x) + i*h2(x);

首先是要有两个初始hash,分别为h1和h2,然后通过h1和h2生成新的hash。i表示hash函数个数。

在google guava库里的BloomFilter中就是按照这个公式来生成hash的。

另外可以看到hash1和hash2的生成规则,hash1是通过murmur算法来生成一个long值,然后通过转int来得到hash1,然后通过位运算得到hash2。

合适的数组大小和hash数量

此时你也许会纳闷一个事情,你不是说千万级数据量,那么hash后取模落到数组中,如果数组比较小,是不是就会重叠,那么此时即使每个hash函数查出来都为1也不一定就表示某值存在啊?

没错,确实有这个问题。为了解决这个问题,布隆过滤器引入了误报率这个概念,说的就是这个问题。

所以数组的大小至关重要。另外hash functions的个数也至关重要。既然这么重要,怎么才能计算出合适的数量呢?有下面两个公式,分别用来计算推荐的数组size以及hash functions的个数。这里数组的大小用m表示,hash functions的个数用k来表示。n则表示数据量的大小。

选择合适的hash算法

另外选择一个好的hash算法也是至关重要的,好的hash算法可以确保hash值比较均匀的分布。guava里的Bloom Filter使用的就是Murmur哈希算法。

MurmurHash 是一种非加密型哈希函数,适用于一般的哈希检索操作。由Austin Appleby在2008年发明,并出现了多个变种,都已经发布到了公有领域(public domain)。与其它流行的哈希函数相比,对于规律性较强的key,MurmurHash的随机分布特征表现更良好。

总之,Bloom Filter就三点:数组、hash生成规则、hash算法(Murmour)。

上代码

通过上面的介绍,相信你应该知道了布隆过滤器的基本原理,现在我们就以guava的Bloom Filter为例,体验一下,千万级的感觉吧:

返回结果:

上面的代码中我们设置了误报率以及预估数据量,然后生成了Bloom Filter实例,然后插入一个“importsource”字符串,然后判断是否存在,最后返回结果是存在。

使用场景

主要使用场景:

1、黑名单。如果某个IP或账号不存在,则允许通过;否则不让通过。

2、爬虫重复URL检测。爬取数据时,需要检测某个url是否已被爬取过。

3、字典纠错。检测单词是否拼写正确。

4、磁盘文件检测。检测要访问的数据是否在磁盘或数据库中。

5、CDN缓存。先查找本地有无cache,如果没有则到其他兄弟cache服务器上去查找。为了避免无谓的查询,在每个cache服务器上保存其兄弟服务器的缓存关键字,以bloomfilter方式存储。在去指定兄弟服务器查找之前,先检查boomfilter中是否有url,如果有,再去对应服务器查找。

总结

Bloom Filter核心就是数组和hash。数组中1表示存在,0表示不存在。Bloom Filter有一定的误报率。多个hash映射都为1,表示指定值极有可能存在(也有可能不存在),多个hash映射有一个为0,则该值必定不存在。选择合适的hash function数量以及数组大小以及合适的hash算法对于准确率至关重要。

误报率在线计算:https://hur.st/bloomfilter/

论文:http://www.eecs.harvard.edu/~michaelm/postscripts/tr-02-05.pdf

在线体验示例:https://llimllib.github.io/bloomfilter-tutorial/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-02-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ImportSource 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
LSTM时间序列预测
你可能经常会遇到这样的问题,给你一个数据集,要你预测下一个时刻的值是多少?如下图所示,这种数据往往并没有规律可言,也不可能用一个简单的n阶模型去拟合。老实说,以前我遇到这种问题都是直接上灰色模型,但是用的多了就感觉会有点问题。其它还有一些模型比方说ARAM、ARIRM我没有试过。这篇文章主要讲解用LSTM如何进行时间序列预测
mathor
2020/02/28
3.7K0
LSTM时间序列预测
Pytorch实现线性回归模型
💡在接下来的教程中,我们将详细讨论如何使用PyTorch来实现线性回归模型,包括代码实现、参数调整以及模型优化等方面的内容~
@小森
2024/04/25
3370
Pytorch实现线性回归模型
如何使用神经网络模型解决分类、聚类、回归和标注任务:基于 PyTorch 的实现与分析
文章链接:https://cloud.tencent.com/developer/article/2469162
小馒头学Python
2024/11/22
6890
如何使用神经网络模型解决分类、聚类、回归和标注任务:基于 PyTorch 的实现与分析
【PyTorch】PyTorch深度学习框架实战(一):实现你的第一个DNN网络
要深入了解大模型底层原理,先要能手撸transformer模型结构,在这之前,pytorch、tensorflow等深度学习框架必须掌握,之前做深度学习时用的tensorflow,做aigc之后接触pytorch多一些,今天写一篇pytorch的入门文章吧,感兴趣的可以一起聊聊。
LDG_AGI
2024/08/13
6630
【PyTorch】PyTorch深度学习框架实战(一):实现你的第一个DNN网络
pytorch笔记
pytorch刚上手确实不太容易适应。特别是Andrew给出的1.x的tensorflow代码,和当前torch的差异还是很大的。这里的用法挺琐碎的,用作备忘性质。
Sarlren
2022/10/28
2960
教程 | 从头开始了解PyTorch的简单实现
选自GitHub 机器之心编译 参与:路 本教程展示了如何从了解张量开始到使用 PyTorch 训练简单的神经网络,是非常基础的 PyTorch 入门资源。PyTorch 建立在 Python 和 Torch 库之上,并提供了一种类似 Numpy 的抽象方法来表征张量(或多维数组),它还能利用 GPU 来提升性能。本教程的代码并不完整,详情请查看原 Jupyter Notebook 文档。 PyTorch 使入门深度学习变得简单,即使你这方面的背景知识不太充足。至少,知道多层神经网络模型可视为由权重连接的节
机器之心
2018/05/08
3K0
教程 | 从头开始了解PyTorch的简单实现
Python深度学习框架:PyTorch、Keras、Scikit-learn、TensorFlow如何使用?学会轻松玩转AI!
总的来说,这四个工具箱各有各的优点,适合不同的任务和学习阶段。 你想盖什么样子的“房子”(解决什么问题),就选择合适的工具箱。 接下来让我们去了解一下他们吧
小白的大数据之旅
2024/11/26
2.2K0
Python深度学习框架:PyTorch、Keras、Scikit-learn、TensorFlow如何使用?学会轻松玩转AI!
主流机器学习库介绍及简要示例
本文将详细介绍四个主流的机器学习库:Scikit-learn、TensorFlow、PyTorch以及XGBoost。我们将探讨每个库的特点、安装方式以及如何通过具体的代码示例来使用这些库解决问题。
用户7353950
2024/11/23
3120
主流机器学习库介绍及简要示例
PyTorch使用------模型的定义和保存方法(带你讯速掌握构建线性回归,保存模型的方法!!!)
前面我们使用手动的方式来构建了一个简单的线性回归模型,如果碰到一些较大的网络设计,手动构建过于繁琐。所以,我们需要学会使用 PyTorch 的各个组件来搭建网络。
小言从不摸鱼
2024/09/10
2800
PyTorch使用------模型的定义和保存方法(带你讯速掌握构建线性回归,保存模型的方法!!!)
02-快速入门:使用PyTorch进行机器学习和深度学习的基本工作流程(笔记+代码)
我们将得到 torch 、 torch.nn ( nn 代表神经网络,这个包包含在 PyTorch 中创建神经网络的构建块)和 matplotlib 。
renhai
2023/11/24
1.7K0
02-快速入门:使用PyTorch进行机器学习和深度学习的基本工作流程(笔记+代码)
PyTorch与深度学习
PyTorch是一个开源的Python机器学习库,基于Torch,用于自然语言处理等应用程序。PyTorch既可以看作加入了GPU支持的numpy,同时也可以看成一个拥有自动求导功能的强大的深度神经网络。除了Facebook外,它已经被Twitter、CMU和Salesforce等机构采用。
正在走向自律
2024/12/18
1320
PyTorch与深度学习
【深度学习实验】线性模型(五):使用Pytorch实现线性模型:基于鸢尾花数据集,对模型进行评估(使用随机梯度下降优化器)
线性模型是机器学习中最基本的模型之一,通过对输入特征进行线性组合来预测输出。本实验旨在展示使用随机梯度下降优化器训练线性模型的过程,并评估模型在鸢尾花数据集上的性能。
Qomolangma
2024/07/29
1810
【深度学习实验】线性模型(五):使用Pytorch实现线性模型:基于鸢尾花数据集,对模型进行评估(使用随机梯度下降优化器)
【深度学习】与【PyTorch实战】
深度学习是机器学习的一个分支,主要通过多层神经网络进行数据特征的自动提取和建模。本文将通过PyTorch这个深度学习框架,从理论到实战,详细介绍深度学习的基本概念、模型构建、训练和评估的过程。我会包含实例和代码,以帮助理解。
小李很执着
2024/06/15
1590
【深度学习】与【PyTorch实战】
【机器学习】深度探索:从基础概念到深度学习关键技术的全面解析——梯度下降、激活函数、正则化与批量归一化
机器学习,作为人工智能学科内的一块瑰宝,其核心精髓在于利用复杂的算法体系,从众多数据中抽丝剥茧,提炼出隐含的规律与模式,从而使计算机系统无需详细的手动指令,即可自主地实现对未来结果的预测及对复杂决策问题的解决。简言之,此领域致力于赋予机器如同学生般的学习能力,使之能基于现有数据自我进化,掌握执行任务的技巧。
空白诗
2024/06/14
3390
【机器学习】深度探索:从基础概念到深度学习关键技术的全面解析——梯度下降、激活函数、正则化与批量归一化
深度学习Pytorch高频代码段
本文是PyTorch常用代码段合集,涵盖基本配置、张量处理、模型定义与操作、数据处理、模型训练与测试等5个方面,还给出了多个值得注意的Tips,内容非常全面。
皮大大
2024/08/07
3020
夯基数学:PyTorch 线性回归实践
线性回归是我们中学课本中学的最基础的概念之一,用于建立变量之间线性关系的统计方法;
掘金安东尼
2024/02/19
2090
夯基数学:PyTorch 线性回归实践
深度学习算法中的递归神经网络(Recursive Neural Networks)
深度学习算法是当今人工智能领域的热门话题,其在图像识别、自然语言处理等领域取得了令人瞩目的成果。递归神经网络(Recursive Neural Networks,简称RNN)作为深度学习算法中的一种重要变种,具有强大的建模能力,广泛应用于自然语言处理、计算机视觉等任务中。
大盘鸡拌面
2023/09/25
1K0
「Deep Learning」PyTorch初步认识
torch.where(condition, x, y): 按照条件从x和y中选出满足条件的元素组成新的tensor。
曼亚灿
2023/07/05
6300
「Deep Learning」PyTorch初步认识
PyTorch 2.2 中文官方教程(三)
介绍 || 张量 || 自动微分 || 构建模型 || TensorBoard 支持 || 训练模型 || 模型理解
ApacheCN_飞龙
2024/02/05
4630
PyTorch 2.2 中文官方教程(三)
神经网络以及简单的神经网络模型实现
下面是一个使用PyTorch构建简单线性回归的神经网络示例代码。这个示例展示了如何定义一个具有一个隐藏层的前馈神经网络,并训练它来逼近一些随机生成的数据点。
用户11315985
2024/10/16
1620
神经网络以及简单的神经网络模型实现
推荐阅读
相关推荐
LSTM时间序列预测
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档