《算法导论3rd第五章》概率分析和随机算法

前言

一个算法,随着输入顺序的不同,复杂度也会随之变化,如何分析算法的。

雇用关系

 问题描述

  假设雇用一名新的办公助理,先找一名雇用代理。雇用代理每天推荐一个应聘者,雇用者决定是否雇用。雇用者必须给雇用代理一小笔费用,以便面试应聘者。在面试完每个应聘者后,如果该应聘者比目前的办公助理更合适,就会辞掉当前的办公助理,然后聘用新的。

HIRE-ASSISTANT 过程表示雇用策略。假设应聘办公助理的候选人编号为 1 到 n 。该过程中假设雇用者在面试完应聘者 i 后,决定应聘者 i 是否是你目前见过的最佳人选。

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,然而雇用的费用较高,设为c_h。假设m是雇用的人数,那么该算法的总费用就是 O(c_in+c_hm)。不管雇用多少人,总会面试 n 个应聘者,于是面试产生的费用总是 c_in。因此我们只关注于分析 c_hm,即雇用的费用。这个量在该算法的每次执行中都不同。

最坏情况分析

在最坏情况下,应聘者质量按出现的次序严格递增时,雇用了n次,总的费用是 O(c_hn)

概率分析

即对所有可能输入产生的运行时间取平均。当报告此种类型的运行时间时,我们称其为平均情况运行时间

随机算法

如果一个算法的行为不仅由输入决定,而且也由随机数生成器产生的数值决定,则称这个算法是随机的。

概率分析和随机算法的区别:前者是假设输入是随机的,后者是将给定输入随机(不受输入影响)

练习

  1. 1-1 证明: 假设在过程HIRE-ASSISTANT的第4行中,我们总能决定哪一个应聘者最佳,则意味着我们知道应聘者排名的全部次序。
    如果一个偏序关系同时又是一个全关系,则称为全序或线性序。一个偏序关系,要求满足自反性、反对称性和传递性。
    
    假设这里的关系为 “是否好或更好于”,
    
    自反性:每个应聘者都比自己好或更好。满足
    反对称性:如果应聘者A好或更好于应聘者B,同时应聘者B又好或更好于应聘者A,则可知A和B一样好。满足
    传递性:如果应聘者A好或更好于应聘者B,应聘者B又好或更好于应聘者C,则A好或更好于C。满足
    所以该关系是一个偏序。又因为所有的应聘者出现的情况的关系,我们都可以判断,所以该关系又是一个全关系。因此,该关系是一个全序。
    
  2. 1-2 请描述RANDOM(a,b)过程的一种实现,它只调用RANDOM(0,1). 作为a和b的函数,你的过程的期望运行时间是多少?

  3. 1-3 假设你希望以1/2的概率输出0与1。 你可以自由使用一个输出0或1的过程BIASED-RANDOM。 它以某种概率p输出1,概率1-p输出0,其中0<p<1, 但是p的值未知。请给出一个利用BIASED-RANDOM做为子程序的算法,返回一个无偏的结果,能以概率1/2返回1。作为p的函数,你的算法的期望运行时间是多少?

指示器随机变量

指示器随机变量定义:给定一个样本空间S和事件A,那么事件A对应的指示器随机变量 I\{A\}定义为:

以一个例子简要说明如何应用指示器随机变量,并引出一个定理

  • 确定在抛一枚均匀硬币时正面朝上的次数,样本空间为 S{H,T}
  • H为正面朝上,T为反面朝上,即Pr{H}=Pr{T}=1/2
  • 定义指示器随机变量 X_H ,这个变量计算抛硬币时正面朝上的次数,正面朝上值为1,否则为0

则假设抛一枚硬币时,正面朝上的期望次数为 E[X_H] = E[I\{H\}] = 1* Pr\{H\}+ 0 * Pr\{T\} = 1/2

由上述可知, X_H 代表的是次数,所以抛一枚硬币时分布列为1和0,再分别乘对应的概率值即为期望值

引理5.1 给定样本空间S和S中的事件A,令 X_A = I\{A\} ,则 E[X_A]=Pr\{A\}

利用指示器随机变量分析雇佣问题 

  1.  概率分析的方法(高中时候常用的求期望的方法, E[X]=\sum_{x=1}^nxPr\{X=x\} )
  2.  用指示器随机变量来求期望

虽然面试了n个人,但实际上只雇佣他们其中的lnn个人.

引理 5.2 :假设应聘者以随机次序出现,算法 HIRE-ASSISTANT 总的雇用费用平均情形下为 O(c_h\ln n)

练习

  1. 2-1在HIRE-ASSISTANT中,假设应聘者以随机顺序出现,你正好雇佣一次的概率是多少?正好雇佣n次的概率是多少?
    雇用一次表示第一次应聘者为 n ,概率为1/n 。
    雇用n次表示应聘者顺序为<1,2,...,n> ,概率为1/n! 
    
  2. 2-2 在HIRE-ASSISTANT,假设应聘者以随机顺序出现,你正好雇佣两次的概率是多少?

    1.候选人1总是被录用的
    2.最好的候选人(排名为n的候选人)总是被录用
    
    即:
    
    假设rank值为1...n
    
    1. 候选人1为rank为i的事件为 p(Ei) = 1/n
    2. 如果满足题目的正好2次录用,则 i+1,i+2...n-1候选人必须在候选人n后面
    
    
    P(E) = Σ(i=1,n-1)P(Ei)* 1/n-i = Σ(i=1,n-1) 1/n * 1/n-i
    ps:累加只作到n-1,表示没包裹P(En)事件
    
    
  3. 2-3 利用指示器随机变量来计算掷n个骰子之和的期望值

  4. 2-4 利用指示器随机变量来解如下的帽子核对问题(hat-heck problem):n位顾客,他们每个人给餐厅核对帽子的服务生一顶帽子。服务生以随机顺序将帽子归还给顾客。请问拿到自己帽子的客户的期望数是多少?

  5. 2-5 设A[1…n]是由n个不同数构成的数列。假如i<j且A[i]>A[j],则称(i,j)对为A的一个逆序对(inversion)。假设A的元素构成<1,2,…,n>上的一个均匀随机排列。请用指示器随机变量来计算其中逆序对的数目期望。

随机算法

在上面,我们通过对m的分布分析出平均情况,但是在很多时候,我们是无法得知输入分布信息的。(ps:如果输入固定,通过概率分析结论则是错误的)。

针对上面的雇用问题,我们可以在算法运行前先随机地排列应聘者,以加强所有的排列都是等可能出现的。

Randomized-hire-assistant(n):
	randomly permute the list of candidate
	best = 0  //candidate 0 is the 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

通过这个简单的改变,我们已经建立 了一个随机算法,其性能和假设应聘者以随机次序所得的结果是一样的

引理 5.3 :过程 RANDOMIZED-HIRE-ASSISTANT 总的雇用费用期望是 O(c_h\ln n)

随机排列数组

很多随机算法通过对给定的输入变换排序使输入随机化。下面主要介绍2种。

  • 第一种算法是为数组的每个元素A[i]赋一个随机的优先级P[i],然后依据优先级对数组A中的元素进行排序。例如,如果初始数组A=(1,2,3,4),随机选择的优先级P=(36,3,62,19),则将产生一个数组B=(2,4,1,3),因为第2个优先级最小,接下来是第4个,然后第1个,最后第3个
    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^3)
        sort A, using P as sort keys
  • 第二种算法是原址排列给定数组。过程在O(n)时间内完成。在进行第i次迭代时,元素A[i]是从元素A[i]到A[n]中随机选取的。第i次迭代以后,A[i]不再改变。
    RANDOMIZE-IN-PLACE(A)
        n = A.length
        for i = 1 to n
            swap A[i] with A[RANDOM(i,n)]
    

以上两种算法都是一个均匀随机排列,而对于一个算法能否保证均匀随机排列数组,主要考查两点:

  1. 产生的排列个数是N!个
  2. 每种排列的概率相同,即都为1/N!

练习

  1. 3-1 (略)
  2. 3-2 Kelp教授决定写一个过程来随机产生除恒等排列(identity permutation)外的任意排列。他提出了如下过程

    PERMUTE-WITHOUT-IDENTITY(A)
    	n = A.length
    	for i = 1 to n-1
    		swap A[i] with A[RANDOM(i+1,n)]
    
    这里的恒等排列我理解为原数组本身的排列,即Kelp想要的排列情况有n!-1种,
    不能,因为每次置换都不可能出现第i个元素在相同的位置上,只会产生 (n−1)! 种不同的情况。
    
  3. 3-3 假设我们不将元素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!种排列。获得等同排列的概率是 1/(n^n*n!) ,不是 1/n! 
  4. 3-4 Armstrong教授建议用下面的过程来产生一个均匀随机排列,请说明每个元A[i]出现在B中任何特定位置的概率是1/n。然后通过说明排列结果不是均匀随机排列,表明Armstrong教授错了。

    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, 因为 P{dest}=P{offset}=1/n。
    这样做只是获得了一个在原数组A上的循环置换元素后的数组B ,产生数组排列也是1/n,所以不是均匀随机排列。
    
  5. 3-5 证明:在过程PERMUTE-BY-SORTING的数组P中,所有元素都唯一的概率至少是1−1/n。

  6. 3-6 请解释如何实现算法PERMUTE-BY-SORTING,以处理两个或更多优先级相同的情形。也就是说,即使有两个或更多优先级相同,你的算法也应该产生一个均匀随机排列

    思路就是要确保这几个优先级相同的项得到随机的排列:
    对几个优先级相同的项,再进行一轮随机优先级排序;
    
  7. 3-7假设我们希望创建集合{1,2,3,...,n}的一个随机样本,即一个具有m个元素的集合S, 其中0≤m≤n,使得每个m集合能够等可能地创建。一种方法是对i=1,2,...,n设A[i]=i,调用RANDOM-IN-PLACE(A),然后取最前面的m个数组元素。这种方法会对RANDOM过程调用n次。如果n比m大很多,我们能够创建一个随机样本,只对RANDOM调用更少的次数。请说明下面的递归过程返回{1,2,3,...,n}的一个随机m子集S,其中每个m子集是等可能的,然而只对RANDOM调用m次。

    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

概率分析和指示器随机变量的进一步使用

主要通过以下几个案例,进一步解释概率分析。

生日悖论

一个屋子里人数必须要达到多少人,才能使其中两人的生日相同的机会达到50%。你可能认为是365 / 2,但事实上,答案是一个很小的数值。

需要提前说明的是

    a. 我们对屋子里的k个人进行了从1~k的依次编号;

    b. 我们不考虑闰年的情况,即1年是N = 365天。我们对每一天也进行了编号,编号方式是一年中的第n天编号为n;

    c. 我们设bi表示编号为i的人的生日,bi = n表示编号为i的人的生日是编号为n的那天。显然有,1≤bi≤365。

    d. 我们还假设生日均匀分布在一年中的n天中,因此概率P(bi = n) = 1 / N;

方式1:我们直接从正面去思考,即存在两人生日相同的概率

记bi和bj分别表示i和j两人的生日,那么两人生日落在第n天的概率P(bi = bj = n) = P(bi = n) * P(bj = n) = 1 / N²。那么两人生日落在同一天的概率:

P(b_i=b_j)=\sum_{n=1}^NP(b_i=b_j=n)=\sum_{n=1}^N\frac{1}{N^2}=1/N

我们用计数变量Xij来表示i和j两人的生日是否相同(如果相同Xij = 1,否则Xij = 0),即P(X_{ij}) = 1 / N;设X表示生日相同两人对目的数随机变量

X=\sum_{i=1}^k\sum_{j=i+1}^kX_{ij}

其期望

E(X)=\binom{k}{2}\frac{1}{n}=\frac{k(k-1)}{2n}

由E(X) ≥1可解得,n≥28。这就是说,屋子里至少需要有28人,我们可以期望找到至少一对人生日相同。

方式2:我们再从对立面去考虑该问题,即任意两人生日都不同的概率。

我们设Ai表示对于所有j<i,i与j生日都不同的事件;设Bk表示k个人生日都不同的事件

B_k=Ak \bigcap B_{k-1}

即,k个人生日都不同 =   k-1个人生日都不同 * 第k人与其它人生日都不同 (由贝叶斯定理

P(B_k) = P(B_{k-1}) P(A_k|B_{k-1})

由此我们可以递归的得到:


  • P(B1)=1
  • P(Ak|Bk-1)=(n-k+1)/n(因为P(Ak|Bk-1)的意思是在k-1人生日都不同的情况下,第k个人生日与前面k-1个人不同的概率) 

有不等式 1+x \leq e^x,我们得出 

由1-P(Bk)<=50%得:k≥23。这就是说如果至少有23个人在一间屋子里,那么至少有两个人生日相同的概率至少是50%。 

练习

  1. 4-1一个屋子里必须要有多少人,才能让某人和你生日相同的概率至少为1/2?必须要有多少人,才能让至少两个人生日为7月4日的概率大于1/2?
  2. 4-2假设将球投入到b个盒子里,直到某个箱子中有两个球。每一次投掷都是独立的,并且每个球落入箱子机会均等,请问投球次数期望是多少
    与生日悖论方式1相同
    
    即 k(k-1)>=2b时,两球投入一箱子内至少2次
    
    => 厂2b +1
  3. 4-3在生日悖论的分析中,要求各人生日彼此独立是否很重要?是否只要两两成对独立就足够了
    随机独立,即两个随机数之间没有关系
    两两独立就足够了。从计算的结果都依赖与P(bi=bj)的条件 ,并不需要更前面的假设
  4. 4-4一次聚会需要邀请多少人,才能让其中3人的生日很可能相同
  5. 4-5(略,题目看不懂)
  6. 4-6假设n个球投入n箱子里,其中每次投球独立,并且每个球等可能落入箱子。空箱子的数目期望是多少?正好有一个不过的箱子数目期望是多少
  7. 4-7(略)

思考题 

 。。。

 

 

主要参考

利用指示器随机变量分析雇佣问题

算法导论第三版 第5章习题答案

概率分析和随机算法(1)——算法导论(5)

概率分析和随机算法(2)——算法导论(6)

 《《算法导论》第五章-第3节_练习(参考答案)

おすすめ

転載: blog.csdn.net/y3over/article/details/9211399