随机算法学习笔记
概率论
随机变量 \(X\) 的加权平均值称为期望,记作 \(E[X]\) 。
线性型
马尔科夫不等式
条件概率
在事件 \(B\) 发生的条件下,事件 \(A\) 发生的概率成为条件概率,记作 \(Pr[A|B]\) ,计算公式为:
如果 \(Pr[A|B]=Pr[A]\) ,则 \(A\) 和 \(B\) 是独立事件。
如果随机变量 \(X\) 和 \(Y\) 来说,所有可能的取值都是独立的,那么两者互为独立随机变量。
随机算法
Las Vegas 型
一定正确,但是最劣情况下,效率较低。
例一:随机快速排序
输入:包含 \(n\) 个元素的数组。
输出:经过排序的 \(n\) 个元素的数组。
若数组包含 \(0\) 或 \(1\) 个元素则返回。
从数组中随机选择一个元素作为枢轴元素把数组元素分为三个子数组,并且按照 \(A\),\(B\),\(C\) 顺序排列、
A. 包含比枢轴元素小的元素;
B. 包含与枢轴元素相等的元素;
C.包含比枢轴元素大的元素。
对A 和C 递归地执行上述步骤。
期望比较次数:\((n)\le 2n\ln n\) 。
证明:
然后可以用归纳加积分的方式证明精确上界,但是我不会。
例二:随机选择算法
RandSelect(A,p,r,k){ //从A[p..r]中选第k小
if p=r then return A[p]
i<-Random(p, r)
以A[i]为标准划分A
j<-划分后小于等于A[i]的数构成数组的大小
if k<=j
then return RandSelect(A,p,p+j-1,k)
else return RandSelect(A,p+j,r,k-j)
}
例三:皇后放置的随机选择
BoolQueen(n){
k<-1 //k皇后的行号
count<-0 //count 放好的皇后数
while k<=n do
for i<-1 to n do
检查 i 与先前皇后的相容性
如果相容将 i 加入 S
if S != 空集 then
j<-Random(1,|S|)
x_k<-S[j]
count<-count+1
k<-k+1
else k<-n+1
return count
}
过于随机,可能无法找到解,需要优化。
Tip 1
重复调用。
QueenLV(n){
p<-BoolQueen(n)
while(p<n) do
p<-BoolQueen(n)
}
Tip 2
与回溯算法相结合,部分使用回溯算法,部分是 \(Las Vegas\) 算法。
令 \(stopVegas\le n\) ,表示用 \(QueenLV\) 算法放置的皇后数。
改进算法的分析
对于不同的 \(stopVegas\) 值,设
\(p\) 为算法成功概率
\(s\) 为一次成功搜索访问的结点数的平均值
\(e\) 为一次不成功搜索访问的结点数的平均值
\(t\) 为算法找到一个解的平均时间
则可得等式:
根据 \(n=12\) 时的统计数据:\(stopVegas=5\) 时算法效率高。
食用方法
可以与确定的搜索算法相结合,将其中的确定选择改为不确定选择,然后两者结合运用。
Monte Carlo 型
不一定正确,效率较高。
主元素测试
主元素:出现次数超过了一半以上的元素 。
判断数组是否存在主元素。
Majority(T,n){
i<-Random(1,n)
x<-T(i)
k<-x在T中的个数
if(k>n/2) then return true
else return false
}
这个算法正确的概率是大于 \(\frac{1}{2}\) 的,然后我们就直接多跑几次就可以了。
串相等测试
长串 \(x\) 和 长串 \(y\) ,判断是否相等。
将两个字符串的二进制表示为正整数 \(I(x)\) 和 \(I(y)\) 。
选择素数 \(p\) ,指纹函数为(这不就是 \(\text{hash}\) 嘛。。。
这个算法的特点是相同的指纹函数必然是相同的,但是不相同的有可能被判断为相同的。
所以我们需要分析出错概率,然后观察是否可控,然后利用一定的技巧将出错概率大幅度降低。
比如此处的出错条件就是
有两个相关定理:
- 素数定理 \(\pi(n)\approx \frac{n}{\ln n}\) 。
- 若 \(k\le 2^n\) ,\(n\) 不太小,则整除 \(k\) 的素数个数 \(\le \pi(n)\) 。
所以选择 \(M\ge 2n^2\) 出错概率就是:
模式匹配
直接用 \(hash\) 来瞎搞,明白了。
素数判断
Fermart 小定理
如果 \(n\) 为素数,则对所有的正整数 \(a\ne 0\pmod n\) 有
但这个定理是必要条件,不是充分条件,满足上述情况的合数称为 \(Carmichael\) 数,但是数量非常少。
另一个必要条件
如果 \(n\) 为素数,则方程 \(x^2\equiv 1\pmod n\) 的根只有两个,即 \(x=1,x=n-1\) 。
具体方法
设 \(n\) 为奇素数,存在 \(q,m\) 使得 \(n-1=2^qm\) ,
然后对于 \(i\in [0,q-1]\) ,判断
是否为 \(1\) 或 \(n-1\) 且下一位是否为 \(1\) 。
如果其后项为 \(1\) ,但本项不等于 \(1\) 和 \(-1\) ,则这是非平凡的根,从而知道 \(n\) 非素数。
随机选择 \(a\) 进行上述测试。