算法导论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
posted @ 2021-01-15 10:23  ijkzen  阅读(138)  评论(0编辑  收藏  举报