算法导论5-3
读书笔记
本小节分为两部分,第一部分陈述随机算法的必要性,第二部分介绍了两种随机算法并且证明了它们的正确性;
一个算法的执行效率需要一个随机算法的输入来检验;
优先级排序随机算法
过程如下:
为数组每个元素 \(A[i]\)赋一个随机的优先级\(P[i]\),然后依据优先级对数组\(A\)中的元素进行排序。
伪代码如下:
n = A.length
let P[1..n] be a new array
for i = 1 to n
P[i] = RANDOM(1, n * n * n)
sort A, using P as sort keys
证明过程略
原址赋值随机算法
过程如下:
原址排列给定数组。在进行第\(i\)次迭代时,元素\(A[i]\)是从元素\(A[i]\)到\(A[n]\)中随机选取。第\(i\)次迭代以后,\(A[i]\)不再改变。
伪代码如下:
n = A.length
for i = 1 to n
swap A[i] with A[RANDOM(i,n)]
证明过程略
课后习题
5.3-1
初始化条件改为:对每个可能的1排列,字数组A[1..1]包含这个1排列的概率是1/n。
5.3-2
不能实现,\(A[i]\)的备选结果中不包含\(A[i]\)
5.3-3
不能实现,这样会导致结果集中的元素和原始集中的不同。
5.3-4
B[(i+offset) mod n]=A[i],这是一个循环,显然可以每个元素A[i]出现在B中任何特定位置的概率是1/n。但是却不是均匀随机排列,因为你并不能保证每个位置都被赋值了,会有重复。
5.3-5
\[P = \frac{A^n_{n^3}}{(n^3)^n} = \frac{n^3!}{(n^3-n)(n^3)^n}
\]
5.3-6
增加判断过程,如果生成的优先级与前面有重复,就重新生成一个优先级rank。
5.3-7
RANDOM-SAMPLE(m, n)
if m == 0
return null
else S = RANDOM-SAMPLE(m-1, n-1)
i = RANDOM(1, n)
if i in S
S = S combine {n}
else S = S combine {i}
return S