算法导论(3)概率分析和随机算法

算法导论(3)概率分析和随机算法

1.雇用问题

首先我们来考虑一个简单的问题,雇用问题。加入你需要雇用一名新的办公经理,你需要在n个候选人中挑选。我们建立理想化模型,假设雇用问题以如下流程进行:

HIRE-ASSISTANT(n)

best =0
for i=1 to n
    interview candidate i
    if candidate i is better than candidate best
        best =i
        hire candidate i

这个过程本身很简单,有点像是在一个序列中找最大值,但不同的是我们并不关心运行时间,而是总费用。假设面试费用为 c i c_i ci,雇用费用比面试费用高很多,为 c k c_k ck,若这个过程中我们雇用了m人(一个职位,但只要看到更优秀的候选人就马上雇用它并解雇之前雇用的人),这样我们的总费用为O( c i n + c k m c_in+c_km cin+ckm)。面试费用是固定的,所以我们可以不看面试费用。

由于面试候选人的顺序是不定的,所以有最好的情况和最坏的情况。

最坏的情况自然是面试的应聘者的顺序按应聘者的质量严格递增的顺序,这时我们雇用了n次,总费用为O( c k n c_kn ckn),但实际上我们并不知道应聘者的顺序也无法控制他们的顺序。我们只能考虑这个问题的平均情况。所以我们需要用概率分析来分析这个问题。

2.平均情况分析

假设应聘者的顺序是随机的,即n!种可能的排序中每一种出现的概率相等。

我们稍微修改一下规则,前面我们并不知道应聘者的顺序是不是随机的,现在我们假设得到了应聘者名单,每天随机安排一个应聘者来面试。

如果一个算法的行为不仅由输入决定,也由随机数生成器(random-number generator)产生的数值决定,则这个算法是随机的。由RANDOM(a,b)返回一个介于a和b之间的整数,且每个整数等概率出现。(通常编程语言中会提供一个伪随机数生成器)。

接下来出现了一个非常有意思的数学问题,应聘者的顺序随机的情况下,总费用的期望值是多少,也就是雇用次数m为多少。这个问题看似简单,却有一些值得思考的点,结果是什么也只有通过计算。这时看问题的角度很关键,只有找到合适的角度才能理解最终的结果。这个问题中,最大的问题是理解,第i个应聘者被应聘的概率为 1 i \frac{1}{i} i1。比如,第一个应聘者是必定被应聘的,这个是规定,第二个应聘者被应聘的概率为1/2这个还好理解,但第三个应聘者被应聘的概率为1/3,想想假设从n个人中随机依次抽出3个人,而这三个人质量是有差异的,由于是随机的所以其中任何一个人质量最高的概率是相等的,所以最后抽出的那个人质量最高的概率就是1/3,一次类推,这样就可以理解了。

我们要求的期望:
E = ∑ i = 1 n 1 n = ln ⁡ n + O ( 1 ) E=\sum_{i=1}^n\frac{1}{n}\\=\ln n+O(1) E=i=1nn1=lnn+O(1)
所以我们的结论是前面的算法在平均情况下的总花费为 O ( c k ln ⁡ n O(c_k\ln n O(cklnn)。

3.随机算法

根据前面的分析,我们知道在应聘者顺序随机的情况下我们的总花费是 O ( c k ln ⁡ n O(c_k\ln n O(cklnn),这个花费是可以接受的,但实际上我们并不知道顺序是不是随机的,实际的顺序既有可能是最好情况也有可能是最坏情况,为了使结果趋于稳定我们就强行让它随机。我们对于输入的分布如何不去管他,将随机性体现在算法上。这样一来理论上结果为最坏情况的概率就极大降低了。(妙啊!)。我们的算法在前面的算法的基础上稍做修改:

RANDOMIZED-HIRE-ASSISTANT(n)

randomly permute the list of candidates
best=0
for i=1 to n
	interview candidate i
    if candidate i is better than candidate best
    best=i
    hire candidate i

随机排列数组

我们这里讨论两种随机化方法,假定输入一个大小为n的数组。

一个一般的方法是为数组的每个元素赋予一个随机的优先级,过程如下

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

范围是1~ n 3 n^3 n3是为了让P中的所有数尽可能唯一。(书上是这么说,但是为了保证为了唯一增加一个循环判断过程就行了,如果不唯一的花算法不就有点问题了,另外由兴趣的可以证明一下所有元素都唯一的概率至少是1-1/n,也可以考虑一下在一些优先级相同时怎么实现算法)我们假定所有优先级是唯一的。

这个过程耗时的是第5步的排序,如果使用比较排序,耗时为Ω( n lg ⁡ n n\lg n nlgn)。

一个更好的方法是原址排列给定数组。

RANdOMIZE-IN-PLACE(A)

n=A.length
for i =1 to n
	swap A[i] with A[RANDOM(i,n)]
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
算法导论 第3版》是一本经典的计算机科学教材,由Thomas H.Cormen、Charles E.Leiserson、Ronald L.Rivest和Clifford Stein合著,主要介绍了算法设计与分析的基本原理和技巧。 这本教材分为六个部分,共29章。第一部分概述了算法设计与分析的基本概念和方法。第二部分介绍了基本的排序和选择算法,包括插入排序、归并排序、堆排序等。第三部分讨论了数据结构,包括栈、队列、二叉树等,以及各种基本数据结构的实现和应用。第四部分重点介绍了动态规划算法和贪心算法,涵盖了最长公共子序列、最优二叉查找树等问题。第五部分深入讲解了图算法,包括最短路径、最小生成树等。第六部分介绍了一些高级主题,如NP完全性以及近似算法。 每一章都包含了大量的例子和习题,这些习题有助于读者巩固知识,并提供了解决实际问题的思路。此外,书还有丰富的附录和参考资料,供读者进一步学习和探索。 《算法导论 第3版》有着简洁明了的表达和深度而完整的内容,适合作为大学本科生和研究生学习计算机科学基础的教材。无论是作为算法入门的起点,还是作为算法设计与分析的参考书,都具有很高的价值。 总之,《算法导论 第3版》是一本经典权威的算法教材,涵盖了算法设计与分析的基础知识和方法,并提供了大量的例子和习题,对计算机科学相关专业的学生和从业者来说,是一本不可多得的学习资料。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值