面试相关之位运算

来源:互联网 发布:绝地求生什么时候优化 编辑:程序博客网 时间:2024/06/07 18:54

bloom过滤器的原理和使用

1.不安全的网页黑名单包括100亿个黑名单网页,每个黑名单网页最多占用64个字节,现在想要实现一种网页过滤技术,可以根据的URL判断该网页是否存在黑名单上,请设计该系统,允许有万分之一以下的误差,并且使用的额外空间不要超过30G。

简单地把URL通过哈希表或者数据库保存下来,大概需要640G的空间。
遇到网页黑名单系统,垃圾邮件过滤系统,爬虫的网址判断重复系统。并且容忍一定的失误率,而且对空间的要求比较严格,则很可能使用到Bloom过滤器。

布隆过滤器精确地代表一个集合可以精确判断某一个元素是否在这个集合中,精确程度由具体的用户设计决定。

bloom过滤器原理:
长度为m的bit数组,有k个hash函数,它们的输出域都大于或等于m,对于一个URL经过k和hash函数算出的结果,都对m取余,在比特数组上将对应的取余结果位置为1。

若要检查URL是否在集合中,经过k个hash函数,检查对应位是否都为1。

bit数组的大小:m = n*lnp/(ln2)^2 p为失误率 n为样本大小
m=19.19n = 约25G
hash函数的个数:
k = ln2*m/n

生成过滤器的过程:
1.注意题目允许有一定的失误率
2.根据 样本的个数n,和允许失误率p,算出m大小
3.算出hash函数的个数

给定两个32位整数a,b,返回其中较大的,并且不能用任何比较判断

方法一:
得到a-b的符号,根据符号正负,确定大小
方法二:

给定一个整型数组arr,其中只有一个数出现了奇数次,其他数出现了偶数次,打印这个数

eo =0,将e0与数组中的元素分别异或,最终eo的值为出现奇数次的数字

给定一个整型数组arr,其中有两个数出现了奇数次,其他数都出现了偶数次,打印这两个数a,b。

方法同上,最后e0的结果是a ^b,e0的32个位上不为0的某一位,记为K,说明ab的第k位不相同,重新设置整数eo’ = 0,
eo’分别于arr中第k位为1的数字进行异或,最后e0’的结果为a,
eo’^eo的结果为b

0 0