海量数据判断某个数据是否存在

1.布隆过滤器
	白名单拦截
	基于guava
	需要二进制向量和一系列随机映射的hash函数
	原理:
		数据经过一系列hash算法,计算出具体位置,置为1 
	经典场景
		字处理软件中,需要检查一个英语单词是否拼写正确(100w)
		在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上(100w)
		在网络爬虫里,一个网址是否被访问过(5亿个网站)

在这里插入图片描述

2.题目描述:

	在2.5亿个整数中判断一个数是否存在,注意,内存不足以容纳2.5亿个整数。

	分析解答:

	方法一:分治法

	对于大数据相关的算法题,分治法是一个非常好的方法。针对这一题来说,主要思路为:
	可以根据实际可用内存的情况,确定一个Hash函数,比如:hash(value)%1000,
	通过这个Hash函数可以把这2.5亿个数字划分到1000个文件中去(a1,a2……,a1000),
	然后再对待查找的数字使用同样的Hash函数求出Hash值,假设计算出的Hash值为i,
	如果这个数存在,那么它一定在文件ai中。通过这种方法就可以把题目转化为文件ai中
	是否存在这个数。那么接下来的求解过程中可以选用的思路计较多,有:

	(1)由于划分后的文件比较小了,就可以直接装载到内存中去,可以把
	文件中所有的数字都保存到hash_set中,然后判断待查找的数字是否存在。

	(2)如果这个文件中的数字占用的空间还是太大,那么可以用1相同的方法把这个
	文件继续划分为更小的文件,然后确定待查找的数字可能存在的文件,然后在相应
	的文件中继续查找。

	 

	方法二:位图法

	对于这一类判断数字是否存在、判断数字是否重复的问题,位图法是一种非常高效的方法。
	以32位整型为例,它可以表示数字的个数为2^32.可以申请一个位图,让每个整数对应的位图中
	的一个bit,这样2^32个数需要的位图的大小为512MB。具体实现的思路为:申请一个512MB的
	位图,并把所有的位都初始化为0;接着遍历所有的整数,对遍历到的数字,把相应的位置上的
	bit设置为1.最后判断待查找的数对应的位图上的值是多少,如果是0,那么表示这个数字不存在
	,如果是1,那么表示这个数字存在。
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值