前言
一个算法,随着输入顺序的不同,复杂度也会随之变化,如何分析算法的。
雇用关系
问题描述
假设雇用一名新的办公助理,先找一名雇用代理。雇用代理每天推荐一个应聘者,雇用者决定是否雇用。雇用者必须给雇用代理一小笔费用,以便面试应聘者。在面试完每个应聘者后,如果该应聘者比目前的办公助理更合适,就会辞掉当前的办公助理,然后聘用新的。
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
面试的费用较低,比如为,然而雇用的费用较高,设为。假设m是雇用的人数,那么该算法的总费用就是 。不管雇用多少人,总会面试 n 个应聘者,于是面试产生的费用总是 。因此我们只关注于分析 ,即雇用的费用。这个量在该算法的每次执行中都不同。
最坏情况分析
在最坏情况下,应聘者质量按出现的次序严格递增时,雇用了n次,总的费用是 。
概率分析
即对所有可能输入产生的运行时间取平均。当报告此种类型的运行时间时,我们称其为平均情况运行时间。
随机算法
如果一个算法的行为不仅由输入决定,而且也由随机数生成器产生的数值决定,则称这个算法是随机的。
概率分析和随机算法的区别:前者是假设输入是随机的,后者是将给定输入随机(不受输入影响)
练习
- 1-1 证明: 假设在过程HIRE-ASSISTANT的第4行中,我们总能决定哪一个应聘者最佳,则意味着我们知道应聘者排名的全部次序。
如果一个偏序关系同时又是一个全关系,则称为全序或线性序。一个偏序关系,要求满足自反性、反对称性和传递性。 假设这里的关系为 “是否好或更好于”, 自反性:每个应聘者都比自己好或更好。满足 反对称性:如果应聘者A好或更好于应聘者B,同时应聘者B又好或更好于应聘者A,则可知A和B一样好。满足 传递性:如果应聘者A好或更好于应聘者B,应聘者B又好或更好于应聘者C,则A好或更好于C。满足 所以该关系是一个偏序。又因为所有的应聘者出现的情况的关系,我们都可以判断,所以该关系又是一个全关系。因此,该关系是一个全序。
-
1-2 请描述RANDOM(a,b)过程的一种实现,它只调用RANDOM(0,1). 作为a和b的函数,你的过程的期望运行时间是多少?
-
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对应的指示器随机变量 定义为:
以一个例子简要说明如何应用指示器随机变量,并引出一个定理
- 确定在抛一枚均匀硬币时正面朝上的次数,样本空间为 S{H,T}
- H为正面朝上,T为反面朝上,即Pr{H}=Pr{T}=1/2
- 定义指示器随机变量 ,这个变量计算抛硬币时正面朝上的次数,正面朝上值为1,否则为0
则假设抛一枚硬币时,正面朝上的期望次数为
由上述可知, 代表的是次数,所以抛一枚硬币时分布列为1和0,再分别乘对应的概率值即为期望值
引理5.1 给定样本空间S和S中的事件A,令 ,则
利用指示器随机变量分析雇佣问题
- 概率分析的方法(高中时候常用的求期望的方法, )
- 用指示器随机变量来求期望
虽然面试了n个人,但实际上只雇佣他们其中的lnn个人.
引理 5.2 :假设应聘者以随机次序出现,算法 HIRE-ASSISTANT 总的雇用费用平均情形下为
练习
- 2-1在HIRE-ASSISTANT中,假设应聘者以随机顺序出现,你正好雇佣一次的概率是多少?正好雇佣n次的概率是多少?
雇用一次表示第一次应聘者为 n ,概率为1/n 。 雇用n次表示应聘者顺序为<1,2,...,n> ,概率为1/n!
-
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)事件
-
2-3 利用指示器随机变量来计算掷n个骰子之和的期望值
-
2-4 利用指示器随机变量来解如下的帽子核对问题(hat-heck problem):n位顾客,他们每个人给餐厅核对帽子的服务生一顶帽子。服务生以随机顺序将帽子归还给顾客。请问拿到自己帽子的客户的期望数是多少?
-
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 总的雇用费用期望是
随机排列数组
很多随机算法通过对给定的输入变换排序使输入随机化。下面主要介绍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)]
以上两种算法都是一个均匀随机排列,而对于一个算法能否保证均匀随机排列数组,主要考查两点:
- 产生的排列个数是N!个
- 每种排列的概率相同,即都为1/N!
练习
- 3-1 (略)
-
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 假设我们不将元素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!
-
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,所以不是均匀随机排列。
-
3-5 证明:在过程PERMUTE-BY-SORTING的数组P中,所有元素都唯一的概率至少是1−1/n。
-
3-6 请解释如何实现算法PERMUTE-BY-SORTING,以处理两个或更多优先级相同的情形。也就是说,即使有两个或更多优先级相同,你的算法也应该产生一个均匀随机排列
思路就是要确保这几个优先级相同的项得到随机的排列: 对几个优先级相同的项,再进行一轮随机优先级排序;
-
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²。那么两人生日落在同一天的概率:
我们用计数变量Xij来表示i和j两人的生日是否相同(如果相同Xij = 1,否则Xij = 0),即 = 1 / N;设X表示生日相同两人对目的数随机变量
其期望
由E(X) ≥1可解得,n≥28。这就是说,屋子里至少需要有28人,我们可以期望找到至少一对人生日相同。
方式2:我们再从对立面去考虑该问题,即任意两人生日都不同的概率。
我们设Ai表示对于所有j<i,i与j生日都不同的事件;设Bk表示k个人生日都不同的事件
即,k个人生日都不同 = k-1个人生日都不同 * 第k人与其它人生日都不同 (由贝叶斯定理)
由此我们可以递归的得到:
- P(B1)=1
- P(Ak|Bk-1)=(n-k+1)/n(因为P(Ak|Bk-1)的意思是在k-1人生日都不同的情况下,第k个人生日与前面k-1个人不同的概率)
有不等式 ,我们得出
由1-P(Bk)<=50%得:k≥23。这就是说如果至少有23个人在一间屋子里,那么至少有两个人生日相同的概率至少是50%。
练习
- 4-1一个屋子里必须要有多少人,才能让某人和你生日相同的概率至少为1/2?必须要有多少人,才能让至少两个人生日为7月4日的概率大于1/2?
- 4-2假设将球投入到b个盒子里,直到某个箱子中有两个球。每一次投掷都是独立的,并且每个球落入箱子机会均等,请问投球次数期望是多少
与生日悖论方式1相同 即 k(k-1)>=2b时,两球投入一箱子内至少2次 => 厂2b +1
- 4-3在生日悖论的分析中,要求各人生日彼此独立是否很重要?是否只要两两成对独立就足够了
随机独立,即两个随机数之间没有关系 两两独立就足够了。从计算的结果都依赖与P(bi=bj)的条件 ,并不需要更前面的假设
- 4-4一次聚会需要邀请多少人,才能让其中3人的生日很可能相同
- 4-5(略,题目看不懂)
- 4-6假设n个球投入n箱子里,其中每次投球独立,并且每个球等可能落入箱子。空箱子的数目期望是多少?正好有一个不过的箱子数目期望是多少
- 4-7(略)
思考题
。。。