WC Day1 第一课堂 随机算法
设数组含有
n
n
n 个不同元素,随即快速排序算法的期望比较次数
T
(
n
)
≤
2
n
ln
n
T(n) \leq 2 n\ln n
T(n)≤2nlnn
证明
显然随机选取的枢轴元素是等概率的。
T
(
n
)
=
(
n
−
1
)
+
∑
i
=
0
n
1
n
(
T
(
i
)
+
T
(
n
−
i
+
1
)
)
=
(
n
−
1
)
+
∑
i
=
1
n
2
n
T
(
i
)
T(n) = (n-1)+\sum_{i= 0}^n \frac{1}{n}(T(i) + T(n - i + 1))\\ = (n-1)+\sum_{i=1}^{n} \frac{2}{n} T(i)
T(n)=(n−1)+i=0∑nn1(T(i)+T(n−i+1))=(n−1)+i=1∑nn2T(i)
在数组中查找第 k k k 小的元素。
T ( n ) ≤ 1 n ( T ( n − 1 ) + T ( n − 2 ) + ⋯ + T ( n 2 + 1 ) + T ( n 2 ) + ⋯ ) ≤ 2 n ∑ i = n 2 n − 1 T ( i ) + O ( n ) T(n) \leq \frac{1}{n} (T(n-1) + T(n-2) + \cdots + T(\frac{n}{2} + 1) + T(\frac{n}{2}) + \cdots) \\ \leq \frac{2}{n} \sum_{i=\frac{n}{2}}^{n-1} T(i)+O(n) T(n)≤n1(T(n−1)+T(n−2)+⋯+T(2n+1)+T(2n)+⋯)≤n2i=2n∑n−1T(i)+O(n)
证明 T ( n ) ≤ c n T(n) \leq cn T(n)≤cn。
k <- 1
count <- 0
while (k <= n) do
for i <- 1 to n do
检查相容性 (能不能放)
如果相容将 i 加入 S
if S 不等于 空集 then
j <- 从 S 随机选择一个元素
x[k] <- S[j] // 第 k 个皇后的列
count++
k++
else k <- n+1
return count
LasVegas 随机算法
一般把算法的某步确定性选择变成随机选择。
一次运行可能得不到解,如果得到那么一定是正确的
可以与确定性算法相结合进行改进。
p p p 为算法成功的概率。
t t t 为找到一个解的平均时间。
s s s 为成功搜索访问结点数的平均值, e e e 为不成功。
t = p s + ( 1 − p ) ( e + t ) ⇒ t = s + e 1 − p p t = ps + (1 - p)(e + t) \Rightarrow t = s + e \frac{1-p}{p} t=ps+(1−p)(e+t)⇒t=s+ep1−p
当 n = 12 n=12 n=12 时, s t o p V e g a s = 5 stopVegas = 5 stopVegas=5 时算法效率最高。
Monte Carlo 随机算法
有时会给出错误的答案。
运行时间和出错概率都是随机变量,需要分析算法出错概率
主元素测试 有没有出现次数超过一半以上的元素
i <- random(1,n)
x <- T(i)
计数 x 在 T 中出现的个数 k
if (k > n / 2) return true
else return false
一次回答正确的概率 > 1 2 > \frac{1}{2} >21。
if Majority(T, n) return true;
else return Majority(T, n);
跑两次算法正确的概率为 p + ( 1 − p ) p = 1 − ( 1 − p ) 2 > 3 4 p + (1 - p)p = 1 - {(1-p)}^2 > \frac{3}{4} p+(1−p)p=1−(1−p)2>43。
调用
k
k
k 次 Majority 算法的正确概率为,这是一个等比数列求和
p
+
(
1
−
p
)
p
+
(
1
−
p
)
p
+
(
1
−
p
)
2
p
+
⋯
+
(
1
−
p
)
k
−
1
p
=
1
−
(
1
−
p
)
k
>
1
−
2
−
k
p + (1 - p)p + (1 - p)p + {(1-p)}^2p + \cdots + (1 - p)^{k-1} p \\= 1 - {(1-p)}^k > 1 - 2^{-k}
p+(1−p)p+(1−p)p+(1−p)2p+⋯+(1−p)k−1p=1−(1−p)k>1−2−k
调用
4
4
4 次的概率达到了
0.969
0.969
0.969。
如果使出错的概率不超过 ε \varepsilon ε,则调用的次数满足 k ≥ ⌈ log 1 ε ⌉ k \ge \lceil \log \frac{1}{\varepsilon}\rceil k≥⌈logε1⌉。
串相等测试 两个长串是否相等
A 用 x x x 导出一个短串 f ( x ) f(x) f(x) 发送给 B B B
B 用同样的方法导出相对于 y y y 的短串 f ( y ) f(y) f(y)
B 比较 f ( x ) f(x) f(x) 和 f ( y ) f(y) f(y)。
如果不相等,则 x ≠ y x \not= y x=y 否则不确定。
假设 x x x 和 y y y 都是二进制串,对应的正整数为 I ( x ) I(x) I(x) 和 I ( y ) I(y) I(y)。
选择质数
p
p
p,指纹函数
I
p
(
x
)
=
I
(
x
)
m
o
d
p
I_p(x)=I(x) \bmod p
Ip(x)=I(x)modp。
x
=
y
⇒
I
p
(
x
)
=
I
p
(
y
)
I
p
(
x
)
=
I
p
(
y
)
⇏
x
=
y
\begin{array}{l} x=y \Rightarrow I_{p}(x)=I_{p}(y) \\ I_{p}(x)=I_{p}(y) \not\Rightarrow x=y \end{array}
x=y⇒Ip(x)=Ip(y)Ip(x)=Ip(y)⇒x=y
改进方法:随机选择质数
p
p
p 进行测试
出错的必要条件
- x x x 和 y y y 的位数相等
- p ∣ ( I ( x ) − I ( y ) ) p|(I(x)-I(y)) p∣(I(x)−I(y)) 即为同余
令 π ( t ) \pi(t) π(t) 表示小于 t t t 的质数个数。
素数定理 π ( t ) ≈ t ln t \pi(t) \approx \frac{t}{\ln t} π(t)≈lntt
若 k < 2 n k < 2^n k<2n 且 n n n 不太小,整除 k k k 的素数个数 ≤ π ( n ) \leq \pi(n) ≤π(n)。
M
M
M 为素数随机的范围
{
p
∣
p
是小于2
n
的素数 且 p 整除
I
(
x
)
−
I
(
y
)
}
∣
π
(
M
)
≤
π
(
n
)
π
(
M
)
≈
n
ln
n
2
n
2
ln
(
2
n
2
)
≈
n
ln
n
2
n
2
2
ln
n
≤
1
n
\frac{\left\{p \mid p \text {是小于2}^{n}\text{的素数 且 p 整除 } I(x)-I(y)\right\} \mid}{\pi(M)} \\ \leq \frac{\pi(n)}{\pi(M)} \approx \frac{\frac{n}{\ln n}}{\frac{2 n^{2}}{\ln \left(2n^{2}\right)}} \approx \frac{\frac{n}{\ln n}}{\frac{2n^2}{2 \ln n}} \leq \frac{1}{n}
π(M){p∣p是小于2n的素数 且 p 整除 I(x)−I(y)}∣≤π(M)π(n)≈ln(2n2)2n2lnnn≈2lnn2n2lnnn≤n1
如果我们进行
j
j
j 次测试。令
j
=
⌈
log
log
n
⌉
j=\lceil\log \log n\rceil
j=⌈loglogn⌉,那么出错的概率为
1
n
⌈
log
log
n
⌉
\frac{1}{n^{\lceil\log \log n\rceil}}
n⌈loglogn⌉1。
模式匹配 kmp AC 自动机 串比较的随机算法
Miller_Rabin

浙公网安备 33010602011771号