算法导论5.1 Exercises 答案

5.1-1

如果我们可以确定排名最高的某个候选人;那么去掉这个人后,我们依旧可以确定出当前排名最高的某个候选人(也就是次高)……一直去掉最后一个人之后,那么就可以得到这些候选人的排名。

由于这种好的关系具有传递性,因此可以确定出这一些候选人的全序关系。

\(\star\) 5.1-2

1
2
3
4
5
6
7
8
9
10
11
RANDOM(a, b)
r = b - a + 1
// beta是r的比特数。
beta = ceil(log(2, r))
while True
s = 0
for i = 0 to beta
t = RANDOM(0, 1)
s = (s << 1) | t
if s < r
return s + a

RANDOM(a, b)中获取随机数,相当于从a + RANDOM(0, b - a)中获取随机数。令\(r=b-a+1,\beta=\lceil\lg r\rceil\)。考虑生成一个\(\beta\)比特数\(s\),如果\(s< r\),那么返回\(s+a\),否则重复进行即可。

那么,生成一个小于\(r\)\(\beta\)比特数的概率为\(\dfrac{r}{2^\beta}=2^{\lg r-\lceil\lg r\rceil}>\dfrac{1}{2}\)

可以发现第4行的while循环运行次数服从参数为\(\dfrac{r}{2^\beta}\)的指数分布,因此其期望运行次数为\(\dfrac{2^\beta}{r}\)。那么,RANDOM(0, 1)的被调用期望次数为\(\beta\cdot \dfrac{2^\beta}{r}<2\beta\)。因此RANDOM(a, b)的时间复杂度为\(O(\lg(b-a))\)

\(\star\) 5.1-3

1
2
3
4
5
6
RANDOM()
while True
x = BIASED-RANDOM()
y = BIASED-RANDOM()
if x != y
return x

在单次循环中,考虑两次调用BIASED-RANDOM(),其结果分别为\(x,y\)。可以发现一共有\(4\)种结果,分别为\(00,01,10,11\),那么接下来进行的操作如下:

  • \(00\),继续进行下一次循环。
  • \(01\),返回\(0\)
  • \(10\),返回\(1\)
  • \(11\),继续进行下一次循环。

这里用到的是输出\(01\)\(10\)的概率都是\(p(1-p)\)

将这两部分的概率值相加,可以发现这个while循环运行次数服从参数为\(2p(1-p)\)的指数分布,因此其期望运行次数为\(\dfrac{1}{2p(1-p)}\)。那么,BIASED-RANDOM的被调用期望次数为\(\dfrac{1}{p(1-p)}\)。因此RANDOM的时间复杂度为\(\Theta\left(\dfrac{1}{p(1-p)}\right)\)