必知C++算法之位运算基本操作

布隆过滤器

网页黑名单系统

垃圾邮件过滤系统

爬虫的网址判断重复系统

容忍一定程度的失误率

对空间要求严格

布隆过滤器可以精确的代表一个集合
可精确判断某以元素是否在此集合中
精确程度由用户的具体设计决定
做到100%的精确即正确是不可能的
优势:利用很少的空间可以做到精确率较高

布隆过滤器的bitarray大小如何将确定?

大小为m,样本数量为n,失误率为p
n=100亿,p=0.01%
单个样本大小不影响布隆过滤器大小,只影响了哈希函数的实现细节
公式一:m = -(n*lnp)/(ln2)的平方
m = 19.19n向上取整为20n
2000亿bit,约为25G
k为哈希函数个数
公式二:k = ln2*m/n = 0.7*m/n = 14

真实失误率p计算
公式三:p =(1-e的(-nk/m)次方)的k次方
位运算交换两个整数a和b的值
    int a = 3;
    int b = 4;
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
//c/c++支持以上交换形式
//不同编译器对一句话实现交换两整数【a^=b^=a^=b;】可能不支持。
2个32位整数a和b,位运算返回较大一个
int flip(int n) {
    return n ^ 1;
}
int sign(int n) {
    return flip((n >> 31));
}

//方法一: 当a-b溢出时,会发生错误
int getMax(int a, int b) {
    int c = a - b;
    int scA = sign(c);
    int scB = flip(scA);
    return a * scA + b * scB;
}
//方法二:
int getMax2(int a, int b) {
    int c = a - b;
    int as = sign(a);
    int bs = sign(b);
    int cs = sign(c);
    int difab = as ^ bs;
    int sameab = flip(difab);
    int returnA = difab * as + sameab * cs;
    int returnB = flip(returnA);
    return a * returnA + b * returnB;
}

异或找出arr数组中唯一一个出现奇数次的元素

1.异或运算满足交换律

2.异或运算满足结合律

方法:只要初始x = 0 ,依次与arr数组中的元素异或,最后计算结果即为那个元素。

异或找出arr数组中两个出现奇数次的元素(a,b)

只要初始x = 0 ,依次与arr数组中的元素异或,最后计算结果即为x = a^b

(a,b)不同所以x != 0,说明a和b的第k位一定不一样

设置一个y = 0,y与arr中第k位为1的那些整数进行异或

异或完成后,y为a或b中的一个

另一个数等于y^x

异或运算可完成简单的加密解密过程

密文=明文^密码

明文=密文^密码

如果明文>密码,循环使用密码与明文进行按位异或

这种可以找规律破解,明文中出现频率高的元素,在密文中也会出现相应的高频率元素

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值