牛客网常见算法思路 (八)位运算

有用麻烦点个赞哦

案例一

不安全网页的黑名单包含100亿个黑名单网页,每个网页的url最多占用64字节。现在想要实现一种网页过滤器,可以根据2网页的URL判断该网页是否在黑名单上,请设计该系统。(要求:允许有万分之一一下的判断失误率,额外空间不超过30g)
普通方法
黑名单存入hash表或者数据库(640G空间)

布隆过滤器
用于网页黑名单系统、爬虫的网址判断重复系统、容忍一定程度失误率、对空间要求严格
简介:可以精确代表一个集合、判断一个元素是否在此集合中,精确程度根据用户设计决定,不可能做到100%精确
优势:用很少的空间做到高精确
原理:
1、一个长度为m的bit数组bitarray,每个位置只占一个bit(0位白色,1为黑色);
2、有k个hash函数,相互独立
3、一个url,经过k个hash函数产生k个hash值,再对m取余,对应的位置涂黑
4、第二个url,同样hash取余,对应的位置涂黑,若之前是白色的则变黑,若是黑色的不变即可
5、检验时,只需要将待检验的url经过k和hash函数,再对m取余,若对应区域有一个白色,则不为黑名单,若都为黑色则有可能是黑名单(误差在于m过小,存放url,太多导致数组本来就很多黑的)
确定bitarray大小
大小为m,样本数量n,失误率p;如题n为100亿,p=0.01%
m=-(nlnp)/(ln2)²,求得m=20n=2000亿
向上取整;k=ln2
m/n=0.7*m/n,k=14,最终失误率=(1-e(-nk/m))k=0.006%

案例二

如何不用额外变量交换两个值
步骤(^ 为异或的意思)
1、a=ab(此时a=ab,b=b)
2、b=ab(此时a=ab,b=abb=a)
3、a=ab(此时a=ab^a=b,b=a)

案例三(建议看代码)

给定两个32位整数a、b,返回ab中较大的,但是不能用任何比较判断
方法一:得到a-b的符号(溢出会报错)
方法二:得到a符号,b符号,a-b符号,ab符号异或,ab符号同或,返回a*(a符号ab异或+b符号a-b符号)+b*-(a符号ab异或+b符号a-b符号 )
实质是分不同情况分析

案例四

给定一个整形数组arr,其中只有一个数出现奇数次,其他出现偶数次,打印这个数,时间复杂度O(N),空间复杂度O(1)
原理:n与0异或结果为n,n与n异或结果为0,异或运算满足交换律和结合律
创造一个e,遍历数组,e异或遍历的数组元素,最后剩下的值为奇数次的值

案例五

给定整形数组arr,其中有两个数a、b出现了奇数次,其他数都出现了偶数次,打印这个数。时间复杂度O(N),额外空间复杂度O(1)
创造一个e,遍历数组,e异或遍历的数组元素,最后剩下的值为a异或b,因为ab不等,所以e不为0,遍历e的位,出现1的值证明a和b第k位不一样,此时创造一个p,p再次遍历数组中第k位为1的值,最后的p必定是a,b中的一个,另一个数则为p与e的异或

案例六

设置加密过程完成text明文的加密解密过程
明文text,用户密码pw,密文cipher=text^pw
text=cipherpw=(textpw)^pw=text

有用麻烦点个赞哦

你可能感兴趣的:(算法)