布隆过滤器
网页黑名单系统
垃圾邮件过滤系统
爬虫的网址判断重复系统
…
容忍一定程度的失误率
对空间要求严格
布隆过滤器可以精确的代表一个集合
可精确判断某以元素是否在此集合中
精确程度由用户的具体设计决定
做到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
异或运算可完成简单的加密解密过程
密文=明文^密码
明文=密文^密码
如果明文>密码,循环使用密码与明文进行按位异或
这种可以找规律破解,明文中出现频率高的元素,在密文中也会出现相应的高频率元素