算法导论 学习笔记 第五章 概率分析和随机算法

雇佣问题:假如你要雇佣一名新的办公助理,你决定找一个雇用代理,雇用代理每天推荐一名应聘者,而你要付钱给雇用代理以便面试应聘者,如果面试通过,你要付一大笔中介费给雇用代理,并且要辞掉目前的办公助理,估算该策略的费用。

以上雇佣过程的伪代码,假设应聘办公助理的候选人编号为1到n:

HIRE-ASSISTANT(n)
	best = 0    // candidate 0 is a least-qualified dummy candidate
	for i = 1 to n
		interview candidate i
		if candidate i is better than candidate best
			best = i
			hire candidate i

此问题关注的不是以上代码的执行时间,而是面试和雇佣所产生的费用,两者采用的分析技术是相同的,都是计算特定基本操作的执行次数。

面试的费用较低,设为c i _{i} i,而雇佣的费用较高,设为c h _{h} h,假设m是雇佣的人数,则该算法总费用为O(c i _{i} i*n+c h _{h} h*m)。

在最坏情况下,我们会雇佣每个面试的应聘者,即应聘者质量按出现次序严格递增。

平均情况是应聘者以随机顺序出现,假设所有应聘者存在一个全序关系(集合中的任两个元素之间都可以比较),因此可以使用从1到n的唯一号码对应聘者,用rank(i)表示应聘者i的名次,应聘者随机出现等价于排名列表是rank(i)的n!种排列中的任一个,每种排列以等概率出现。

雇佣问题中,应聘者好像以随机顺序出现,但我们不知道是否的确如此,因此我们必须对应聘者的次序有更大控制,我们稍稍改变这个模型,假设雇佣代理有n个应聘者,而且他们事先给我们一份应聘者名单,每天随机选择一个应聘者来面试,这样不像以前依赖于猜测应聘者以随机次序出现,而是获得了对流程的控制并加强了随机次序。

更一般地,如果一个算法的行为不仅由输入决定(上例中的n个应聘者名单),而且也由随机数生成器产生的数值决定(每天随机选一个应聘者来面试),则称这个算法是随机的。

我们将一个随机算法的运行时间称为期望运行时间,以此区分随机算法和那些输入是随机的算法,一般而言,当概率分布是在算法的输入上时,我们讨论的是平均情况运行时间,当算法本身做出随机选择时,我们讨论其期望运行时间。

为分析雇佣算法这类随机算法,我们采用指示器随机变量,给定一个样本空间S和一个事件A,那么事件A对应的指示器随机变量I{A}定义为:
在这里插入图片描述
如确定抛掷一枚硬币,正面朝上的期望次数时,样本空间S={H,T},其中Pr{H}=Pr{T}=1/2,之后定义一个指示器随机变量XH,对应于硬币正面朝上的事件H,这个变量计数抛硬币时正面朝上的次数,如果正面朝上则值为1,否则为0:
在这里插入图片描述
在一次抛掷硬币时,正面朝上的期望次数就是指示器变量XH的期望值:
在这里插入图片描述
在这里插入图片描述
证明:
在这里插入图片描述
虽然指示器随机变量看起来很麻烦,比如在计算单枚硬币一次投掷的正面次数期望时,但它在分析重复随机试验时是有用的,如计算抛掷n次硬币时正面朝上的次数时,可以设Xi=I{第i次抛掷硬币时出现事件H},设随机变量X表示n次抛硬币中出现正面的总次数,于是:在这里插入图片描述
我们希望计算正面朝上次数的期望,对上面等式两边取期望,得到:
在这里插入图片描述
以上等式给出了n个指示器随机变量总和的期望值,由于期望的线性性质:
在这里插入图片描述
其中E[X]与E[Y]需有定义,且即使X与Y不独立,该性质也成立。由以上两式可得:
在这里插入图片描述
回到雇佣问题上,我们希望计算雇佣一个新的办公助理的期望次数。设应聘者以随机顺序出现,设X是一个随机变量,其值等于我们雇佣一个新办公助理的次数,由于离散随机变量X的期望值(期望或均值)是:
在这里插入图片描述
因此雇佣一个新办公助理的次数的期望是:
在这里插入图片描述
但这种计算很麻烦,取而代之,我们可以采用指示器随机变量大大简化计算。

为了利用指示器随机变量,我们不是通过定义一个与雇用一个新办公助理所需次数对应的一个变量来计算E[X],而是定义n个变量,与每个应聘者是否被雇用对应,假设Xi对应于第i个应聘者被雇佣事件的指示器随机变量:
在这里插入图片描述
以及:
在这里插入图片描述
根据引理5.1:
在这里插入图片描述
应聘者i被雇佣,意味着应聘者i比从1到i-1的每个应聘者优秀,我们已经假设应聘者以随机顺序出现,所以前i个应聘者也以随机次序出现,前i个应聘者都是等可能的是目前最有资格的,应聘者i比应聘者1到i-1更有资格的概率是1/i,因此:
在这里插入图片描述
现在就可以计算E(X)了:
在这里插入图片描述
在这里插入图片描述
证明:根据上式E[X]的值,可以立即推出这个界,雇佣的人数的期望值大约是lgn。

平均情形下的雇用费用比最坏情况下的雇用费用O(c h _{h} hn)有了很大改进。

n位顾客,每个人给餐厅核对帽子的服务生一顶帽子,服务生以随机顺序将帽子归还给顾客,拿到自己帽子的顾客的期望数为多少?
设Xi为第i个顾客拿到自己帽子的随机变量指示器,由于是随机发的帽子,因此E(Xi)=1/n。
用指示器随机变量计算由n个不同数随机排列构成的数列中逆序对的数目。任意一对数是逆序对的概率是1/2,而数列中有n(n+1)/2对数,因此逆序对的数目期望为n(n+1)/4。

进一步探索概率分析和随机算法之间的区别:雇佣问题中,聘用一个新办公助理的期望次数大约是lnn,但这个算法是确定性的,对于任何特定输入,雇佣一个新办公助理的次数始终相同,而算法的费用依赖于各个应聘者的排名的顺序,因此每个输入的花费可能是昂贵的(雇佣n次),也可能是便宜的(雇佣1次)。可以考虑先对应聘者随机排列,此时,我们让随机发生在算法上,而不是输入分布上,此时对于同一个输入,每次运行算法时的花费依赖于随机选择,而且很可能和前一次算法的执行不同,这样没有一个特别的输入总会引出它的最坏情况行为,只有在随机数生成器产生一个不走运的排列时,随机算法才会运行得很差。

对于雇佣问题,代码只需要作出一行改动,以随机排列应聘者序列:

RANDOMIZED-HIRE-ASSISTANT(n)
randomly permute the list of candidate
best = 0
for i = 1 to n
	interview candidate i
	if candidate i is better than candidate best
		best = i
		hire candidate i

通过以上简单改变,就建立了一个随机算法。
在这里插入图片描述
引理5.2中,我们在输入上作了一个假设,在引理5.3中,我们没有作这种假设,尽管随机化输入会花费一些额外时间。为保持术语的一致性,我们用平均情形下的雇佣费用来表达引理5.2,用期望雇佣费用来表达引理5.3。

构造一个数组的随机排列的一个通常方法是为数组的每个元素赋一个随机的优先级,然后根据优先级对数组A中的元素进行排序:

PERMUTE-BY-SORTING(A)
n = A.length
let P[1 ... n] be a new array
for i = 1 to n
	P[i] = RANDOM(1, n³)    // 选取在1~n³之间的数,让所有优先级尽可能唯一,此处假设所有优先级都唯一
sort A, using P as sort keys

以上过程所有优先级都唯一的概率至少是1-1/n,以下是证明过程:设Pr{j}=下标j所在位置的元素对应的优先级唯一的概率,求Pr{1∩2∩···∩n}:
在这里插入图片描述
以上证明中,Pr{1}由于只有一个元素,因此优先级唯一的概率是1;而Pr{2|1}表示在位置1的优先级唯一的条件下,位置1和2的优先级都唯一的概率,由于一共有n3种优先级,在位置1已经有一个优先级的条件下,位置2只剩n3-1种优先级可选,因此Pr{2|1}=1(1-1/n3);后面的概率同理。

以上证明的最后一步中,对于x>0,有(1−x)n≥1−nx,带入此式即可。

我们先假设以上过程中产生的所有优先级都是唯一的。

以上过程中耗时的步骤是第5行的排序,如果使用第8章将要看到的比较排序,将花费Ω(nlgn)的时间。我们现在已经可以达到这个下界,归并排序时间代价为Θ(nlgn)。排序后,如果P[i]是第j个最小的优先级,那么A[i]将出现在输出位置j上。

引理 5.4 假设所有优先级都不同,则过程PERMUTE-BY-SORTING产生输入的均匀随机排列。

证明:我们从考虑每个元素A[i]分配到第i个最小优先级的特殊排列开始,并说明这个排列正好发生的概率是1/n!。对i=1,2,···,n,设E i _{i} i代表元素A[i]分配到第i个最小优先级的事件,我们想计算对所有的i,事件E i _{i} i发生的概率,即:
在这里插入图片描述
这个概率等于:
在这里插入图片描述
因为Pr{E 1 _{1} 1}是从一个n元素的集合中随机选取的优先级最小的概率,所以有Pr{E 1 _{1} 1}=1/n。接下来,Pr{E 2 _{2} 2}=1/(n-1),因为假定元素A[1]有最小的优先级,余下来的n-1个元素都有相等的可能成为第二小的优先级。一般地,对i=2,3,···,n,我们有Pr{E i _{i} i|E i − 1 _{i-1} i1∩E i − 2 _{i-2} i2∩···∩E 1 _{1} 1}=1/(n-i+1),因为给定元素A[1]到A[i-1]有前i-1小的优先级,剩下的n-(i-1)个元素中,每一个都等可能具有第i小优先级,所以有:
在这里插入图片描述
我们可以扩展这个证明,使其对任何优先级的排列都有效。考虑集合{1,2,···,n}的任意一个确定排列σ=<σ(1),σ(2),···,σ(n)>,我们用r i _{i} i表示赋予元素A[i]优先级的排名,其中优先级第j小的元素名次为j。如果定义E i _{i} i为元素A[i]分配到优先级第σ(i)小的事件(即r i _{i} i=σ(i)),同样的证明仍适用。因此,如果要计算得到任何特定排列的概率,其计算与前面的计算完全相同,于是得到此排列的概率也是1/n!。

证明一个排列是均匀随机排列时,只证明对于每个元素A[i]排在位置j的概率是1/n这个弱条件是不充分的。

以下方式可产生不重复的优先级:

let P[1..n] be a new array
for i = 1 to n
    P[i] = i
for i = 1 to n
    swap P[i] with P[RANDOM(i, n)]

产生随机排列的另一个更好方法是原址排列给定数组,以下过程在O(n)时间内完成。在进行第i次迭代时,元素A[i]是从元素A[i]到A[n]中随机选取的,在第i次迭代后,A[i]不再改变:

RANDOMIZE-IN-PLACE
n = A.length
for i = 1 to n
	swap A[i] with A[RANDOM(i, n)]

以上过程产生一个均匀随机排列。一个具有n个元素的k排列是包含这n个元素中的k个元素的序列,并且不重复,一共有n!/(n-k)!种可能的k排列。

引理 5.5 过程RANDOMIZE-IN-PLACE可计算出一个均匀随机排列。

证明:我们使用以下循环不变式:
在第2~3行for循环的第i次迭代前,对于每个可能的(i-1)排列,子数组A[1…i-1]包含这个(i-1)排列的概率是(n-i+1)!/n!。

我们需要说明这个不变式在第1次循环迭代前为真,循环的每次迭代能够维持此不变式,且循环终止时,这个不变式能提供一个有用的性质来说明正确性。

初始化:考虑正好在第1次循环迭代前的情况,此时i=1,由循环不变式可知,对每个可能的0排列,子数组A[1…0]包含这个0排列的概率是(n-i+1)!/n!=n!/n!=1。子数组A[1…0]是一个空子数组,且0排列也没有元素,因而,A[1…0]包含任何0排列的概率是1,在第1次循环迭代前循环不变式成立。

保持:假设在第i次迭代前,每种可能的(i-1)排列出现在子数组A[1…i-1]中的概率是(n-i+1)!/n!,我们要说明在第i次迭代后,每种可能的i排列出现在子数组A[1…i]中的概率是(n-i)!/n!。

对于第i次迭代,考虑一个特殊的i排列,以<x 1 _{1} 1,x 2 _{2} 2,…,x i _{i} i>表示其中的元素。这个排列中包含一个(i-1)排列<x 1 _{1} 1,x 2 _{2} 2,…,x i − 1 _{i-1} i1>,且后面接着算法在A[i]中放置的值x i _{i} i。设E 1 _{1} 1表示前i-1次迭代已经在A[1…i-1]中构造了特殊(i-1)排列的事件,根据循环不变式,Pr{E i _{i} i}=(n-i+1)/n!。设E 2 _{2} 2表示第i次迭代在位置A[i]放置x i _{i} i的事件。当E 1 _{1} 1和E 2 _{2} 2都发生时,i排列<x 1 _{1} 1,x 2 _{2} 2,…,x i _{i} i>出现在A[1…i]中。因此,我们希望计算Pr{E 2 _{2} 2∩E 1 _{1} 1},我们有:
在这里插入图片描述
由于在算法第3行,从A[i…n]的n-i+1个值中随机选取x i _{i} i
在这里插入图片描述
终止:终止时,i=n+1,子数组A[1…n]是一个给定n排列的概率为(n-(n+1)+1)/n!=0!/n!=1/n!。因此,RANDOMIZE-IN-PLACE产生一个均匀随机排列。

以上证明中,如果不是将元素A[i]与子数组A[i…n]中的一个随机元素交换,而是将它随机与数组任何位置上的元素交换:

PERMUTE-WITH-ALL(A)
n = A.length
for i = 1 to n
    swap A[i] with A[RANDOM(1, n)]

以上代码不会产生均匀随机排列,以上有n个独立同分布的选择(n个位置每个都有n种选择),一共nn种终止状态,但排列数只有n!种,n3除n!不能保证除尽。

以上证明的初始化部分中,有人质疑其是否为真,因为一个空数组不包含任何排列,因此,一个空数组包含一个0排列的概率是0,从而第1次迭代前循环不变式无效,可修改RANDOMIZE-IN-PLACE:

RANDOMIZE-IN-PLACE-MODIFY
n = A.length
swap(A[1], A[RANDOM(1, n)])
for i = 2 to n
    swap(A[i], A[RANDOM(i, n)])

修改后初始化:考虑正好在第2次循环迭代前的情况,此时i=2,由循环不变式可知,对每个可能的1排列,子数组A[1…1]包含这个1排列的概率是(n-i+1)/n!=(n-1)!/n!=1/n。根据RANDOMIZE-IN-PLACE-MODIFY算法第4行,从n个元素中随机选择一个放在第1个位置,因而,A[1…1]包含任何1排列的概率是1/n,在第2次循环迭代前循环不变式成立。

有人写出以下过程来随机产生除恒等排列外的任意排列:

PERMUTE-WITHOUT-IDENTITY(A)
n = A.length
for i = 1 to n - 1
    swap A[i] with A[RANDOM(i + 1, n)]

但以上代码没有实现其意图,其意图是生成除自身排列外的所有排列,但每次循环都将当前迭代到的元素与其后的任意元素进行交换,所以第一次循环时将除第一个元素外的任意一个元素放到第一个位置,之后第一个元素就不会变化了,就不能产生第一个元素是原来第一个元素的所有排列。

有人建议用以下过程产生均匀随机排列:

PERMUTE-BY-CYCLIC(A)
n = A.length
let B[1..n] be a new array
offset = RANDOM(1, n)
for i = 1 to n
    dest = i + offset
    if dest > n
        dest = dest - n
    B[dest] = A[i]
return B

但以上过程不产生均匀随机排列,虽然A中任意元素出现在B中特定位置的概率是1/n。

对于上例,首先说明A中任意元素出现在B中特定位置的概率是1/n,对于一个位置j和一个下标i,如果在排序后原下标i的元素出现在j位置,需要满足i+offset=j或(i+offset)%n=j,offset为一个范围为1~n的随机数,因此概率是1/n。其次说明它不产生随机排列,如A为[1,2,3],则有以下三种offset情况:
1.offset=1,结果B为[3,1,2]。
2.offset=2,结果B为[2,3,1]。
3.offset=3,结果B为[1,2,3]。
但没有结果[1,3,2],因此以上过程不产生均匀随机排列。

如果我们希望创建集合{1,2,···,n}的一个随机样本,即一个具有m个元素的集合S,其中0<=m<=n,使得每个m集合都被等可能地创建。我们可以调用RANDOMIZE-IN-PLACE,然后取最前面的m个元素,但如果m很小,n很大会多调用多次RANDOM函数,以下递归过程返回{1,2,···,n}的一个随机m子集S,且只调用m次RANDOM函数:

RANDOM-SAMPLE(m, n)
if m == 0
    return ∅
else S = RANDOM-SAMPLE(m - 1, n - 1)
    i = RANDOM(1, n)
    if i ∈ S
        S = S ∪ {n}
    else S = S ∪ {i}
    return S

可用数学归纳法证明以上过程是正确的。当m=0时,即取一个空集合作为随机样本,显然是正确的。假设S是集合{1,2,···,n-1}的一个具有m-1个元素的随机样本,对于任意的j∈{1,2,···,n-1},Pr{j∈S}=(m-1)/(n-1)。令S’为以上过程最后要返回的集合,i为最外层递归时取到的随机数,对于任意j∈{1,2,···,n-1},计算:
在这里插入图片描述
对于Pr{n∈S’},需要在最后一次随机选到n或前m-1个随机样本中的任一数字,概率还是m/n。因此,随机样本中包含任意元素的概率都是m/n。

一个屋子里人数要达到多少人,才能使其中两个人生日相同的机会达到50%。我们用整数1,2,···,k对屋子里的人编号,其中k是屋子里的总人数,不考虑闰年的情况,且假设所有年份都有n=365天。设b i _{i} i为编号为i的人的生日,其中1<=b i _{i} i<=n。还假设生日均匀分布在一年的n天中,因此对于i=1,2,···,k和r=1,2,···,n,Pr{b i _{i} i=r}=1/n。

两个人i和j的生日正好相同的概率依赖于生日的随机选择是否独立,假设生日是独立的,于是i和j的生日都落在同一天r上的概率是:
在这里插入图片描述
因此,他们的生日落在同一天的概率是:
在这里插入图片描述
得到上式的过程中,我们认为i和j的生日两两独立即可得出5.6的结果,在后面的分析中,并不需要所有人的生日相互独立。两两独立并不意味着相互独立,相互独立必定两两独立。对于事件A 1 _1 1、A 2 _2 2…A n _n n,相互独立要求P(第1个事件∩第2个事件∩…∩第k个事件)=P(第1个事件)P(第2个事件)…P(第k个事件),其中2<=k<=n,因此相互独立要求两两独立、三三独立,一直到nn独立。

更直观地说,一旦选中bi,bj被选在同一天的概率是1/n。因此,i和j有相同生日的概率与他们其中一个的生日落在给定一天的概率相同,这一巧合依赖于各人的生日是独立的这一假设。

k个人中至少有两人生日相同的概率等于1减去所有人生日都不相同的概率,k个人生日互不相同的事件为:
在这里插入图片描述
其中A i _{i} i指对所有j<i,编号i的人与编号j的人的生日不同的事件。上式可写为B k _{k} k=A k _{k} k∩B k − 1 _{k-1} k1,根据条件概率的定义:
在这里插入图片描述
以及交换律A∩B=B∩A,对于两个概率不为0的事件A和B,有:
在这里插入图片描述
因此:
在这里插入图片描述
其中取Pr{B 1 _{1} 1}=Pr{A 1 _{1} 1}=1为初始条件。因此:
在这里插入图片描述
由不等式1+x<=ex
在这里插入图片描述
上图中最后一步当-k(k-1)/(2n)<=ln(1/2)时成立,如果此时n=365,必有k>=23,因此,如果至少有23人在一间屋子里,那么至少有两个人生日相同的概率是1/2。

以上问题也可以使用指示器随机变量进行近似的分析,对屋子里k个人中的每一对(i,j),对1<=i<j<=k,定义指示器随机变量X i j _{ij} ij如下:
在这里插入图片描述
两个人生日相同的概率为1/n,根据引理5.1:
在这里插入图片描述
设X表示计数生日相同两人对数目的随机变量,有:
在这里插入图片描述
两边取期望,并应用期望的线性性质:
在这里插入图片描述
因此,对于n为365,人数k至少为28时E[X]大于1。仅用概率分析时,计算出的结果是23人,虽然两种结果不同,但它们在渐进阶数上是相等的,都是Θ( n \sqrt{n} n )。

我们可以把掷硬币看做伯努利试验的一个例子。伯努利试验有两种可能结果:成功,其概率为p;失败,其概率为q=1-p。当讨论多个伯努利试验时,约定这些试验是相互独立的,且除非特殊说明,每个试验具有相同的成功概率p。从伯努利试验可得出几何分布与二项分布。

几何分布:假定我们有一系列伯努利试验,其中每一次的成功概率为p,失败概率为q=1-p。为求在获得一次成功前需进行多少次试验,定义随机变量X为获得一次成功所需试验次数,X的取值范围为{1,2···},且对于k>=1,因为一次成功前有k-1次失败,因此:
在这里插入图片描述
满足上式的概率分布称为几何分布。下图描绘了这样一个分布:
在这里插入图片描述
上图中,分布的期望可通过次数乘次数对应概率的和计算,含义是几何分布中伯努利试验的次数(即成功一次的期望次数),计算步骤如下,假设q<1:
在这里插入图片描述
以上级数求和使用了以下公式,假设|x|<1,有:
在这里插入图片描述
因此,获得一次成功平均要1/p次试验。几何分布的方差是:
在这里插入图片描述
几何分布的例子:假如我们反复掷两个骰子,直到两个骰子的和为7或11,每次投掷可能有36种可能结果,其中6种可以得到7,2种可以得到11,因此成功的概率p=8/36=2/9,因此我们平均掷1/p=4.5次才能获得一次和为7或11。

二项分布:令伯努利试验的成功率为p,失败率q=1-p,求n次伯努利试验中有几次会成功。我们定义随机变量X为n次试验中成功的次数,X的取值范围为{0,1,···,n},X=k时的概率为:
在这里插入图片描述
上式中大括号里上n下k表示组合数,上式中的组合数等于n!/(k!(n-k)!),满足上式的概率分布称为二项分布,为方便起见,用下面符号定义一族二项分布:
在这里插入图片描述
二项分布名称中的二项来源于(p+q)n,此式的二项展开式中的第k项等于C.35式中的右边部分,由于p+q=1:
在这里插入图片描述
下图描述了一个二项分布:
在这里插入图片描述
二项分布的期望的含义是成功的次数,计算过程如下:
在这里插入图片描述
在这里插入图片描述
以上证明过程中等式C.8为:
在这里插入图片描述
其中0<k<=n。

通过期望的线性性质,可得出相同结论,同时大幅减少运算量。令X i _{i} i是描述第i次试验中成功次数的随机变量,则E[X i _{i} i]=p*1+q*0=p,且根据期望的线性性质,n次试验中成功次数的期望为:
在这里插入图片描述
把相同的球随机投到b个箱子里,箱子编号1,2,···,b。每次投球都是独立的,每次投球,球等可能地落在每个箱子中。球落在任一箱子中的概率是1/b,因此投球过程是一组伯努利试验,每次成功的概率是1/b,成功指球落入指定的箱子中。

落在给定箱子里的球数服从二项分布b(k; n, 1/b)。如果投n个球,落在给定箱子里的球的期望值是n/b。

平均我们要投多少个球才能在给定箱子里投进一个球的过程符合几何分布,成功的投球次数期望是1/(1/b)=b。

我们需要投几次球,才能保证每个箱子中至少有一个球?我们将一次投球落在空箱子里称为一次命中,问题转换成为获得b次命中,所需的投球次数期望n。

以上问题可将n次投球分为几个阶段,第i阶段表示从第i-1次命中到第i次命中,第1阶段包含第1次投球,可以保证一次命中;对第i阶段的每一次投球,有i-1个箱子有球,b-i+1个箱子为空,因此命中的概率为(b-i+1)/b。用n i _{i} i表示第i阶段的投球次数,每个随机变量n i _{i} i服从几何分布,因此:
在这里插入图片描述
根据期望的线性性质:
在这里插入图片描述
以上过程中,等式A.7如下:
对于正整数n,第n个调和数(即首n个正整数的倒数和)是:
在这里插入图片描述
期望每个箱子中都有一个球需要大约投blnb次。这个问题也称为礼券收集者问题,一个人如果想要收集齐b种不同礼券的每一种(每种礼券收到的概率相同),大约需要blnb张随机得到的礼券。

假设抛投一枚标准的硬币n次,最长连续正面的序列的期望长度是Θ(lgn),证明如下:首先证明最长的连续正面的特征序列的长度期望是O(lgn),每次抛硬币时是一次正面的概率为1/2,设A i k _{ik} ik为这样的事件:长度至少为k的正面特征序列开始于第i次抛掷,其中1<=k<=n,1<=i<=n-k+1,因为每次抛硬币是互相独立的,对于任何给定事件A i k _{ik} ik,其概率为:
在这里插入图片描述
对于k=2⌈lgn⌉:
在这里插入图片描述
因此,长度至少为2⌈lgn⌉,起始于位置i的一个正面特征序列的概率是很小的,这种序列起始位置最多有n-2⌈lgn⌉+1个,所以长度至少为2⌈lgn⌉的正面特征序列开始于任一位置的概率为:
在这里插入图片描述
以上证明的第一步用了布尔不等式:对于有限或可数无限事件序列A 1 _{1} 1、A 2 _{2} 2···,有:
在这里插入图片描述
根据上式,一组事件并集的概率至多是各个事件的概率之和(即使这些事件不独立,布尔不等式依然成立)。

利用以上不等式5.9来给出最长特征序列的长度界,对于j=0,1,2,···,n,令L j _{j} j表示最长连续正面的特征序列长度正好是j的事件,并设最正面长特征序列的长度是L,由期望值的定义:
在这里插入图片描述
我们可以用每个Pr{L j _{j} j}的上界来估计这个和,但这种方法将导致弱的界。对于j=0,1,···,n,事件L j _{j} j是不相交的,因此长度至少为2⌈lgn⌉的连续正面特征序列起始于任一位置的概率为:
在这里插入图片描述
根据不等式5.9,我们有:
在这里插入图片描述
另外,由于:
在这里插入图片描述
我们有:
在这里插入图片描述
因此,我们得到:
在这里插入图片描述
连续正面特征序列长度超过r⌈lgn⌉的概率随着r的增加快速减少。r>=1时,至少r⌈lgn⌉次连续正面向上的序列开始于位置i的概率是:
在这里插入图片描述
因此,最长连续正面序列长度至少是r⌈lgn⌉的概率最多是n/n r ^{r} r=1/n r − 1 ^{r-1} r1,或者说,最长连续正面序列长度小于r⌈lgn⌉的概率至少是1-1/n r − 1 ^{r-1} r1

一个例子,抛掷n=1000次硬币,最少出现2⌈lgn⌉=20次连续正面的几率至多是1/n=1/1000;长度超过3⌈lgn⌉=30次连续正面特征序列的几率至多是1/n 2 ^2 2=1/1000000。

现在证明一个补充的下界,在n次硬币抛掷中,最长的正面特征序列的长度期望为Ω(lgn)。为证明这个界,我们通过把n次抛掷划分成大约n/s个组,每组s次抛掷,如果选择s= ⌊ ( l g n ) / 2 ⌋ \lfloor (lgn)/2 \rfloor (lgn)/2,可以说明这些组中至少有一组可能全是正面,因而可能最长特征序列的长度至少是s=Ω(lgn)。然后将表明最长特征序列的长度期望是Ω(lgn)。

我们把n次硬币抛掷划分成至少 ⌊ n / s ⌋ \lfloor n/s \rfloor n/s个组,每组的连续抛掷次数s为 ⌊ ( l g n ) / 2 ⌋ \lfloor (lgn)/2 \rfloor (lgn)/2,然后对每组全是正面的概率求界,根据等式5.8,从位置i开始都是正面的概率是:
在这里插入图片描述
所以长度至少为 ⌊ ( l g n ) / 2 ⌋ \lfloor (lgn)/2 \rfloor (lgn)/2的正面特征序列不从位置i开始的概率至多是1-1/ n \sqrt{n} n 。既然 ⌊ n / s ⌋ \lfloor n/s \rfloor n/s个组是由彼此互斥、独立的抛掷硬币构成,其中每个组都不是长度为 ⌊ ( l g n ) / 2 ⌋ \lfloor (lgn)/2 \rfloor (lgn)/2的正面序列的概率最多是:
在这里插入图片描述
对于以上论证,用到了不等式3.12,对所有实数x:
在这里插入图片描述
以及以下不等式,对足够大的n:
在这里插入图片描述
因此,最长正面特征序列超过 ⌊ ( l g n ) / 2 ⌋ \lfloor (lgn)/2 \rfloor (lgn)/2的概率为:
在这里插入图片描述
现在可以计算最长特征序列的长度期望的一个下界:
在这里插入图片描述
和生日问题一样,可以采用指示器随机变量得到一个简单而近似的分析。设X i k _{ik} ik=I{A i k _{ik} ik}表示对应于特征序列长度至少为k,开始于第i次抛掷硬币的指示器随机变量,为计数这样的正面特征序列的总数,定义:
在这里插入图片描述
两边取期望并利用期望的线性性质:
在这里插入图片描述
通过代入不同的k值,可以计算出长度为k的特征序列的数目期望。如果这个数大(远大于1),那么我们期望很多长度为k的正面特征序列会出现,而且出现一个的概率很高。如果这个数小(远小于1),那么我们期望很少的长度为k的正面特征序列会出现,而且出现的概率很低。如果对某个正常数c,有k=clgn,那么可以得到:
在这里插入图片描述
如果c较大,长度为clgn的正面特征序列的数目期望将很小,并且我们的结论是它不太可能发生。如果c=1/2,那么:
在这里插入图片描述
此时期望会有大量长度为(1/2)lgn的连续正面特征序列,所以这种长度的特征序列很可能发生。通过这些粗略估计,可得出最长特征序列的长度期望是Θ(lgn)的结论。

雇佣问题中,如果我们不希望面试所有应聘者,也不愿意不停地雇佣新人解雇旧人,取而代之,我们愿意雇用接近最好的应聘者,只雇佣一次。每次面试后,立即提供职位给应聘者,或马上拒绝应聘者,可通过如下方式对该问题建模以在最小化面试次数和最大化雇佣应聘者的质量两方面取得平衡:在面试一个应聘者后,给每人一个分数,假设每个人的分数都不同,在面试完j个人后,我们知道这j个人中哪一个分数最高,但不知道在剩余n-j个应聘者中会不会有更高分数的应聘者,我们采用这样的策略,即选择一个正整数k<n,面试然后拒绝前k个应聘者,再雇佣其后比前面的应聘者有更高分数的第一个应聘者,如果最好的应聘者在前k个面试之中,那么将雇佣第n个应聘者。以下是上述过程的伪代码,它将返回我么希望雇用的应聘者下标:

ON-LINE-MAXIMUM(k, n)
bestscore = -∞
for i = 1 to k
	if score(i) > bestscore
		beststore = score(i)
for i = k + 1 to n
	if score(i) > bestscore
		return i
return n

对每个可能的k,我们希望确定能雇用最好应聘者的概率,然后选择最佳的k值,暂时先假设k是固定的。设:
在这里插入图片描述
表示表示应聘者1~j中的最高分数。设S表示成功选择最好应聘者的事件,S i _{i} i表示最好的应聘者是第i个面试者时的事件。既然不同的S i _{i} i不相交,我们有:
在这里插入图片描述
当最好的应聘者是前k个应聘者中的一个时,我们不会成功,于是对i=1,2,···,k,有Pr{S i _{i} i}=0,因而得到:
在这里插入图片描述
现在计算Pr{S i _{i} i},为了当第i个应聘者是最好时成功,两件事必须发生:一是最好的应聘者必须在位置i上,用事件B i _{i} i表示;二是算法不能选择从位置k+1~i-1中任何一个应聘者,而这个选择当且仅当满足k+1<=j<=i-1时发生,换句话说,所有score(k+1)到score(i-1)的值都必须小于M(k),如果其中有大于M(k)的数,则将返回第一个大于M(k)的数的下标。我们用O i _{i} i表示从k+1到i-1中没有任何应聘者入选的事件,幸运的是,两个事件B i _{i} i和O i _{i} i是独立的,事件O i _{i} i仅依赖于位置1到i-1中值的相对次序,而B i _{i} i仅依赖于位置i的值是否大于所有其他位置的值。从位置1到i-1的排序并不影响位置i的值是否大于之前所有值,并且位置i的值也不会影响从位置1到i-1的值的次序。又由于以下事件独立的定义:
在这里插入图片描述
因而:
在这里插入图片描述
Pr{B i _{i} i}的概率显然是1/n。若事件O i _{i} i要发生,从位置1到i-1的最大值必须在前k个位置的一个,并且最大值等可能地在这i-1个位置中的人一个,于是Pr{O i _{i} i}=k/(i-1),Pr{S i _{i} i}=k/(n(i-1))。利用5.12,我们有:
在这里插入图片描述
我们利用积分来近似约束这个和数的上界和下界。假如f(x)是单调递减函数,则有:
在这里插入图片描述
因此有:
在这里插入图片描述
求解此定积分可得下面的界:
在这里插入图片描述
这提供了Pr{S}的一个相当紧确的界。因为我们希望最大化成功的概率,所以关注如何选取k值使Pr{S}的下界最大化,以k为变量对下界求导可得:
在这里插入图片描述
该式单调递减,令其为0可得lnk=lnn-1=ln(n/e),当k=n/e时,概率下界最大化。因而如果k选择n/e时,选到最好应聘者的概率最大,将以至少1/e的概率成功雇佣到最好的应聘者。

一个屋子里必须有多少人,才能让某人和你生日相同的概率至少为1/2?假设一年有n天,一个人与你生日不在同一天的概率为(n-1)/n,k个人与我生日不在同一天的概率为((n-1)/n) k ^{k} k,令其小于等于1/2再两边取对数解得:
在这里插入图片描述
一个屋子里必须有多少人,才能让至少两个人生日为7月4日的概率大于1/2?至少两个人生日在7月4日的概率为1减去只有一个人的生日在7月4日的概率再减去没有人的生日在7月4日的概率,即:
在这里插入图片描述
令其大于1/2解得最小的n为115。

假设我们将球投入到b个箱子里,直到某个箱子中有两个球,每一次投球都是独立的,且每个球落入任何箱子的机会均等,投球的期望次数是多少?这个问题是上述生日问题的另一种描述,直到某个箱子里有两个球相当于有两个人的生日出现在同一天。设E[X]为两个球投入同一个箱子的期望次数,设Pr{i}为第i次投掷使同一个箱子中有两个球事件发生的概率,最多只会投b+1次,因此:
E [ X ] = ∑ i = 0 b + 1 i P r { i } E[X]=\sum_{i=0}^{b+1}iPr\{i\} E[X]=i=0b+1iPr{i}
对于随机变量在自然数集N={0,1,2,···}上取值时,有以下期望计算公式:
在这里插入图片描述
以上推导的最后一步中,每一项Pr{X>=i}被加了i次,又被减了i-1次(除了i=0,它被加了0次,没有被减过)。因此:
E [ X ] = ∑ x = 1 b + 1 P r { X ≥ x } E[X]=\sum_{x=1}^{b+1}Pr\{X≥x\} E[X]=x=1b+1Pr{Xx}
由于:
Pr{x>1}=1(投两次以上才会出现两个球到同一箱子里的情况)
Pr{x>2}= b − 1 b \frac{b-1}{b} bb1(第二次投进球的箱子与第一次投进球的箱子不同才会投两次以上)
Pr{x>3}= ( b − 1 ) ( b − 2 ) b ² \frac{(b-1)(b-2)}{b²} b²(b1)(b2)(在Pr{x>2}的基础上,第三次投进球的箱子必须与前两次的不同才会投三次以上)
因此投球的期望次数为:
P r { x > i } = b ! b i ( b − i ) ! Pr\{x>i\}=\frac{b!}{b^i(b-i)!} Pr{x>i}=bi(bi)!b!
将其带入:
E [ X ] = ∑ x = 1 b + 1 P r { X ≥ x } ( 求 和 上 限 从 无 穷 变 为 投 球 最 大 次 数 b + 1 ) = ∑ x = 0 b P r { X > x } = ∑ x = 1 b b ! b i ( b − i ) ! + P r { X > 0 } = ∑ x = 1 b b ! b i ( b − i ) ! + 1 \begin{aligned} E[X] &= \sum_{x=1}^{b+1}Pr\{X≥x\}(求和上限从无穷变为投球最大次数b+1)\\ &= \sum_{x=0}^{b}Pr\{X>x\} \\ &= \sum_{x=1}^{b}\frac{b!}{b^i(b-i)!}+Pr\{X>0\} \\ &= \sum_{x=1}^{b}\frac{b!}{b^i(b-i)!}+1\end{aligned} E[X]=x=1b+1Pr{Xx}b+1=x=0bPr{X>x}=x=1bbi(bi)!b!+Pr{X>0}=x=1bbi(bi)!b!+1
假设一年有n天,三个人同一天生日的概率为 1 n 2 \frac{1}{n^2} n21,因为3个人生日都是一年中第一天的概率为 1 n 3 \frac{1}{n^3} n31,一年有n天,因此3个人生日都在一年中第一天概率需要乘n才是3个人同一天生日的概率。

我们需要邀请多少人,才能使3个人生日很可能相同?首先令X i j k _{ijk} ijk为一个指示器随机变量,表示索引为i、j、k的三个人同一天生日(其概率为 1 n 2 \frac{1}{n^2} n21)的事件,假设邀请了m人,则:
E [ X ] = ∑ i = 1 m ∑ j = i + 1 m ∑ k = j + 1 m X i j k = ∑ i = 1 m ∑ j = i + 1 m ∑ k = j + 1 m 1 n 2 = ( m 3 ) 1 n 2 ( m 个 人 中 任 选 3 个 ) = m ( m − 1 ) ( m − 2 ) 6 n 2 \begin{aligned} \text E[X] & = \sum_{i = 1}^m\sum_{j = i + 1}^m \sum_{k = j + 1}^m X_{ijk} \\ & = \sum_{i = 1}^m \sum_{j = i + 1}^m \sum_{k = j + 1}^m \frac{1}{n^2} \\ & = \binom{m}{3}\frac{1}{n^2} (m个人中任选3个)\\ & = \frac{m(m - 1)(m - 2)}{6n^2} \end{aligned} E[X]=i=1mj=i+1mk=j+1mXijk=i=1mj=i+1mk=j+1mn21=(3m)n21m3=6n2m(m1)(m2)
令上式大于1,n取365,解得m最小为94。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值