第五章围绕概率分析,随机算法,概率与期望展开了一系列有趣的讨论,其中许多有趣概率习题。

------------------------------------------------------------------------------------------------------------------------------------------------

雇佣问题描述:

假设你要雇佣一个新的办公室助理,雇佣代理每天想你推荐一个应聘者(连续推荐n个),你面试这个人,如果这个应聘者比目前的办公室助理更优秀,你就会辞掉当前的办公室助理,然后聘用这个新的。面试一个人需付给雇佣代理一笔费用,聘用办公助理也需要费用。

假设面试费用为Ci,雇佣的费用为Ch,假设整个过程中雇佣了m次,于是总的费用是 nCi+mCh。由于n是固定值,总费用的变化取决于m值。

这个场景用来当做一般计算范式的模型,通常情况下我们需要检查队列中的每个成员,并且维护一个目前的获胜者,来找出序列中的最大或最小值。雇佣问题是对哪一个成员当前获胜的更新频繁程度建立模型。

最坏情况

最坏情况下,我们雇佣了每一个应聘者,m=n。

HIRE-ASSISTANT(n)
1  best ← 0     ® candidate 0 is a least-qualified dummy candidate
2  for i ← 1 to n
3       do interview candidate i
4          if candidate i is better than candidate best
5             then besti
6                  hire candidate i

注意n个人总是要全部面试完的,所以面试的费用是一定的,关键在于雇佣几次是不确定的,取决于n个人的排名及先后顺序。

---------------------------------------------------------------------------------------------------------------------------------------------------

概率分析

事实上,我们既不能得知应聘者出现的顺序,也不能控制这个顺序,因此我们使用概率分析。概率分析就是在问题的分析中使用概率技术。为了使用概率分 析,必须使用关于输入分布的知识或者对其做假设,然后分析算法,计算出一个期望的运行时间

有些问题,我们对所有可能的输入集合做某种假设。对于其他问题,可能无法描述一个合理的输入分布,此时就不能使用概率分析方法。

在雇佣问题中,可以假设应聘者是以随机顺序出现的。假设可以对任何两个应聘者进行比较并确定哪个更优;换言之,在所有的应聘者之间存在这一个全序关 系。因此可以使用从1到n的唯一号码来标志应聘者的优秀程度。用rank(i)来表示应聘者i的名次。这个有序序 列<rank(1),rank(2),..., rank(n)>是序列<1,2,...,n>的一个排列。说应聘者以随机的顺序出现,就等于说这个排名列表是1到n的n!中排列中的 任何一个,每种都以相等的概率出现。

随机算法

在许多情况下,我们对输入分布知识知之甚少;即使知道关于输入分布的某些信息,也无法对这种分布建立模型。然而通过使一个算法中的某些部分的行为随机化,就常常可以利用概率和随机性作为算法设计和分析的工具

比如在雇佣问题中,如果雇佣代理给我们一份应聘者的名单,每天我们随机地挑选一个应聘者进行面试,从而确保了应聘序列的随机性。

更一般地,如果一个算法的行为不只有输入决定,同时也由随机数生成器所产生的数值决定,则称这个算法是随机的。

由以上描述可知概率分析和随机算法的区别:

概率分析是对输入做假设,假设输入服从某种分布(例如假设输入是随机的),然后根据假设的概率前提来分析期望情况。

而随机算法是通过一个算法来重新排列输入,使得输入变的随机化。

--------------------------------------------------------------------------------------------------------------------------------------------------

几道习题还是相当有难度的,网上可以搜到相关的解答

练习5.1.2

假设Random(a,b)以相同概率返回a到b之间的任何一个数字,描述Random(a,b)过程的一种实现,它只调用现有实现Random(0,1)。作为a和b的函数,你的程序的期望运行时间是多少?假设Ramdom(0,1)的运行时间是常数。

http://bbs.chinaunix.net/thread-1192193-1-1.html    上有一个讨论

思路1:

这个题目相当于在能随机生成 0, 1 的前提下,要求随机生成 n 个整数。(每个数生成的概率相等)
把要生成的数标记为 0,1,2,..., n-1
取最小的 m,使得 2^m >= n-1
通过随机生成 0,1 的函数生成一个  m 比特整数(随机生成每一位),这样能随机生成 [0, 2^m) 内的整数。
随机生成一个 [0,2^m) 中的整数,如果这个数大小在 [0,n-1] 内,则取这个数为结果。
如果这个数在 [0,n-1] 外,则丢弃它,重新生成一个。

思路2:

k = b-a+1,如果k为偶数,则将S均分成两组,通过一次R(0,1)来淘汰其中一组;如果S为奇数, 则用上述方法来分组,将占多数的一组淘汰。可以证明这个算法后也是正确的。只要在某一轮的测试中R(0,1)的输出为全0或全1,问题的规模就可以缩小一 半。

思路3:

或者用二分的方式,根据Ramdom(0,1)是0还是1进入[a,b]区间的前半部分或者后半部分,这样同样面临如果区间长度不是2的整数次方,会导致每个数生成的概率不一样,应该再做一点处理,扩大生成的范围,像思路1中把不是范围内的数丢掉。

-------------------------------------------------------------------------------------------------------------------------------------------------

练习5.1.3

假设你希望以各1/2的概率输出0和1。你可以自由使用一个输出0或1的过程 BIASED-RANDOM。它以概率p输出1,以概率1-p输出0,其中0<p<1,但是你并不知道p的值。给出一个利用BIASED- RANDOM作为子程序的算法,返回一个无偏向的结果。你的算法的期望运行时间是多少?

分析:设计的思路是利用对称性。 假设有两个基于BIASED-RANDOM的伯努利试验序列A、B。每个试验序列都会产生0,1值序列;每一轮A和B各进行一次,如果该轮试验的结果是 ai>bi(即ai=1,bi=0)则算法结束,结果为1;如果ai<bi则算法结束结果为0;如果ai=bi则开始下一轮迭代。

由于每一轮试验都是独立的,所以只要能够证明每一轮在得出结果的条件下,得出1和得出0的概率相等就可以了。

while TRUE
do
x = BIASED-RANDOM
y = BIASED-RANDOM
if x != y
then return x

得出1的概率是p*q    (x得出1,y得出0)

得出0的概率是q*p  (x得出0,y得出1)

精妙!

-------------------------------------------------------------------------------------------------------------------------------------------------

总结:

第五章有许多有意思的习题,值得思考

参考:

算法导论

http://blog.csdn.net/longhuihu/article/details/5864442   csdn上某人的算法导论学习笔记

http://bbs.chinaunix.net/thread-1192193-1-1.html

算法导论5.1 雇用问题相关推荐

  1. 算法导论中C语言代码,算法导论-学习笔记与进度

    算法导论 阅读进度 第一部分 基础知识 第一章 计算中算法的角色 Done 1.1 算法 输入与输出 算法可以解决哪些问题 数据结构 技术 一些比较难的问题 1.2 作为一种技术的算法 效率 算法和其 ...

  2. 算法导论中英文版下载

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 算法导论 ...

  3. 算法导论Java实现-构建MaxHeap

    package lhz.algorithm.chapter.six; /** * "构建堆",<算法导论>6.3章节 Building a heap * 利用之前实现的 ...

  4. 算法导论读书笔记-第十九章-斐波那契堆

    算法导论第19章--斐波那契堆 可合并(最小)堆(mergeable min-heap) : 支持以下5种操作的一种数据结构, 其中每一个元素都有一个关键字: MAKE-HEAP(): 创建和返回一个 ...

  5. 《算法导论》读书笔记--第三章 函数的增长

    好长时间了,继续算法导论. 当输入规模足够大时,并不计算精确的运行时间,倍增常量和低阶项被舍去.我们要研究的是算法的渐近效率,即在输入规模无限量时,在极限中,算法的运行时间如何随着输入规模的变大而增加 ...

  6. 《算法导论》中parallel for 的时间复杂度

    最近在看<算法导论>,看到多线程算法这章中,有一个parallel for循环的例子,如下: parallel for i = 1 to n        parallel for j = ...

  7. 算法导论中求解时间复杂度的三种方法

    这一章讲的是递归式(recurrence),递归式是一组等式或不等式,它所描述的函数是用在更小的输入下该函数的值来定义的. 本章讲了三种方法来解递归式,分别是代换法,递归树方法,主方法. 1.代换法( ...

  8. 算法导论Java实现-随机化数组的两种方式(5.3章节)

    package lhz.algorithm.chapter.five; /** * 随机数组两种实现,<算法导论>第五章第三节 * 本文地址:http://mushiqianmeng.bl ...

  9. 《算法导论》读书笔记(七)

    <算法导论>读书笔记之第16章 贪心算法-活动选择问题 前言:贪心算法也是用来解决最优化问题,将一个问题分成子问题,在现在子问题最优解的时,选择当前看起来是最优的解,期望通过所做的局部最优 ...

  10. 算法导论chapter6 堆排序的代码

    按照<算法导论>上的伪代码实现了,刚开始没注意index的问题,导致错误,看来对于伪代码实现C还是要注意下啊!! #include<iostream> #include < ...

最新文章

  1. mysql更新索引不影响业务_mysql索引更新要多久
  2. Titanium 列表显示TableView
  3. 关于oracle数据库论文,Oracle数据库研究论文 有关Oracle数据库的论文
  4. ES aggr terms nested study
  5. Kafka 源码环境搭建
  6. poj1860Currency Exchange(bell_fordmoban)
  7. 云开发打工人必备上班摸鱼划水微信小程序源码
  8. java获取当前目录_java获得当前文件路径
  9. android 2k屏分辨率是多少,手机2k屏幕是什么意思 2k屏幕几大问题
  10. blast2go下载和本地安装
  11. JAVA线程中的sleep()、wait()、yield()、join()作用
  12. 爆音(杂音)问题的推论与解决
  13. 【工具分享】任意坐标系CAD范围线多点配准及准确导入导入LSV
  14. 【KSQL引擎 介绍】
  15. Attention is all you need 论文精读笔记 Transformer
  16. C语言---集合---合取-析取-异或-条件语句-双条件语句
  17. cocos2dx lua优化总结
  18. 用树结构描述和计算数据
  19. Python IDLE 以及常用函数
  20. Elasticsearch摄取节点(三)——管道处理器(Processor)介绍

热门文章

  1. 走进爆发中的AIOps
  2. 祝威廉 :Rust FFI 实践
  3. 京东量化平台宣告下线,其他平台该何去何从?
  4. 弹性计算安全组最佳实践及新特性介绍
  5. 【重磅】这家技术贼牛的开源公司开始狂招人啦!
  6. 毕设题目:Matlab语音去噪
  7. 【优化调度】基于matlab粒子群算法求解经济调度优化问题【含Matlab源码 1489期】
  8. 【优化算法】混沌单纯形法算子布谷鸟搜索优化算法【含Matlab源码 1193期】
  9. 【虹膜识别】基于matlab GUI滤波器虹膜识别【含Matlab源码 917期】
  10. 【水果识别】基于matlab GUI苹果质量检测及分级系统【含Matlab源码 896期】