算法的概率分析技术(取自算法导论)

对于一个算法,它可能会出现最佳情况比如O(n),也有可能出现最坏情况O(n^2),但更多的可能是出现一般情况O(nlgn)。那么是否采用这个算法取决于它的平均情况,也就是它的期望值,这是一种概率分析手段。

下面就来具体介绍这种分析手段,前提假设您已经了解了离散数学的概率论的随机变量和期望值的相关内容。

以一个雇用问题来说明:

假设你需要雇用一名新的办公室助理。你先前的雇用尝试都以失败告终,所以你决定找一个雇用代理。雇用代理每天给你推荐一个应聘者。你会面试这个人,然后决定要不要雇用他。你必须付给雇用代理一小笔费用来面试应聘者。要真正地雇用一个应聘者则要花更多的钱,因为你必须辞掉目前的办公室助理,还要付一大笔中介费用给雇用代理。你的诺言是在任何时候,都要找到最佳人选来担任这项职务。因此,你决定在面试完每个应聘者后,如果这个应聘者比目前的办公助理更有资格,你就会辞掉目前的办公室助理,然后聘请这个新的应聘者。你愿意为这种策略而付出费用,但希望能够预测这种费用会是多少。

面试的费用较低,譬如说为ci,而雇用的费用则较高,设为ch。假设m是已雇用的人数。那么这个算法的总费用就是O(nci+mch)。不管雇用多少人,我们永远会面试n个应聘者,所以面试的费用永远是nci。因此,我们只专注于分析mch,即雇用的费用上。这个量在算法的每次执行中都会改变。

最坏情况分析

在最坏情况下,我们雇用了每个面试的应聘者。当应聘者的资质逐渐递增时,就会出现这种情况,此时我们雇用了n次,总的费用是O(nch)。

但是,较为合理的预期是应聘者并非总是以资质递增的次序出现的。事实上,我们既不能得知他们的出现次序,也不能控制这个次序。因此,通常我们预期的是一般或平均情况。

概率分析

概率分析是在问题的分析中应用概率技术。大多数情况下,我们使用概率分析来分析一个算法的运行时间。

指示器随机变量

指示器随机变量为概率与期望之间的转换提供了一个便利的方法。给定一个样本空间S和事件A,那么事件A对应的指示器随机变量I{A}定义为

举一个简单的例子,确定在抛一枚均匀硬币时正面朝上的期望次数。样本空间为S={H,T},定义一个随机变量Y,取值H和T的概率各为1/2。接下来定义指示器随机变量XH,它对应于硬币正面朝上的情况即事件H。这个变量计算抛硬币时正面朝上的次数,如果正面朝上则其值为1,否则为0。写作:

在抛硬币时正面朝上的期望次数,就是指示器变量XH的期望值:

因此抛一枚均匀的硬币时,正面朝上的期望次数是1/2。如以下的引理所示,事件A对应的指示器随机变量的期望值等于事件A发生的概率。

我们令指示器随机变量X对应于第i 次抛硬币时正面朝上的事件;令Yi 表示第i 次抛硬币输出结果的随机变量,有Xi=I{Yi=H}。假设随机变量X表示n次抛硬币中出现正面的总次数,于是

我们希望计算正面朝上的期望次数,所以我们使用对上面的等式两边取期望,得

等式左边是n个随机变量总和的期望值。有引理5.1,容易计算出每个随机变量的期望值。根据反映了期望的线性性质的公式E[X+Y]=E[X]+E[Y],容易计算出总和的期望值:它等于n个随机变量期望值的总和。期望的线性性质利用了指示器随机变量作为有力的分析技术;即使随机变量之间存在依赖关系也成立。现在我们可以很容易地计算正面出现次数的期望值:

指示器随机变量极大地简化了计算过程。

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

此时,我们希望计算雇用一个新的办公助理的期望次数。为了利用概率分析,假设应聘者以随机的顺序出现。令X作为一个随机变量,其值等于雇用一个新的办公助理的次数。

为了利用指示器随机变量,我们不是通过定义与雇用一个新的办公助理的次数对应的变量来计算E[X],而是定义n个和每个应聘者是否被雇用对应的变量。特别地,令X对应于第i 个应聘者被雇用这个事件的指示器随机变量。所以,

并且

由引理5.1,有

如果应聘者i 胜过从1到i-1的每一个应聘者,则应聘者i 会被雇用。由于已经假设应聘者以随机的顺序出现,所以前i 个应聘者也是以随机的顺序出现的。这些前i 个应聘者中的任何一个都等可能地是目前最有资格的。应聘者i 比从应聘者1到i-1更有资格的概率是1/i,因此也以1/i 的概率被雇用。由引理5.1,可以得出结论

现在可以计算E[X]了:

即使面试了n个人,平均起来看,实际上大约只雇用他们之中的lnn个人。

时间: 2024-08-05 21:08:00

算法的概率分析技术(取自算法导论)的相关文章

Raising Modulo Numbers_快速幂取模算法

Description People are different. Some secretly read magazines full of interesting girls' pictures, others create an A-bomb in their cellar, others like using Windows, and some like difficult mathematical games. Latest marketing research shows, that

快速幂取余算法

下面是一个快速幂的介绍: 先贴一个秦九韶算法(Horner算法)的原理: 设有项的次函数 将前项提取公因子,得 再将括号内的前项提取公因子,得 如此反复提取公因子,最后将函数化为 令 ...... 则即为所求 下面是讲解快速幂的:(By  夜せ︱深   感谢作者) 快速幂取模算法 在网站上一直没有找到有关于快速幂算法的一个详细的描述和解释,这里,我给出快速幂算法的完整解释,用的是C语言,不同语言的读者只好换个位啦,毕竟读C的人较多~ 所谓的快速幂,实际上是快速幂取模的缩写,简单的说,就是快速的求

位运算之——按位与(&)操作——(快速取模算法)

由于位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快. 按位与(Bitwise AND),运算符号为& a&b 的操作的结果:a.b中对应位同时为1,则对应结果位也为1. 例如: 10010001101000101011001111000 & 111111100000000 --------------------------------------------- 10101100000000 对10101100000000进行右移8位得到的是101011,这就得

c++实现加密和解密算法以及JNI技术的应用实例

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86

贪婪技术与Prim算法

时间:2014.06.06 地点:基地 --------------------------------------------------------------------------- 一.简述贪婪技术 贪婪技术在贪婪过程中所做的每一步选择都满足如三个条件: 1.可行性:满足问题的约束 2局部优先:当前步骤中所有可行选择中最佳的局部选择 3不可取消:即选择一旦做出,在算法的后面步骤中无法改变 找零问题就是一个典型的贪婪技术应用:存在面额d1=25   d2=10  d3=5  d4=1的四

高速幂取余算法

以下是一个高速幂的介绍: 先贴一个秦九韶算法(Horner算法)的原理: 设有项的次函数 将前项提取公因子,得 再将括号内的前项提取公因子.得 如此重复提取公因子,最后将函数化为 令 ...... 则即为所求 以下是解说高速幂的:(By  夜せ︱深   感谢作者) 高速幂取模算法 在站点上一直没有找到有关于高速幂算法的一个具体的描写叙述和解释,这里,我给出高速幂算法的完整解释,用的是C语言.不同语言的读者仅仅好换个位啦,毕竟读C的人较多~ 所谓的高速幂.实际上是高速幂取模的缩写,简单的说,就是高

【转】C语言快速幂取模算法小结

(转自:http://www.jb51.net/article/54947.htm) 本文实例汇总了C语言实现的快速幂取模算法,是比较常见的算法.分享给大家供大家参考之用.具体如下: 首先,所谓的快速幂,实际上是快速幂取模的缩写,简单的说,就是快速的求一个幂式的模(余).在程序设计过程中,经常要去求一些大数对于某个数的余数,为了得到更快.计算范围更大的算法,产生了快速幂取模算法.我们先从简单的例子入手:求abmodc 算法1.直接设计这个算法: int ans = 1; for(int i =

快速乘法取模算法

原理: 32+16+4=52 1 LL qmul(LL x, LL y, LL mod) { // 乘法防止溢出, 如果p * p不爆LL的话可以直接乘: O(1)乘法或者转化成二进制加法 2 //快速乘法取模算法 3 4 LL ret = 0; 5 while(y) { 6 if(y & 1) 7 ret = (ret + x) % mod; 8 x = x * 2 % mod; 9 y >>= 1; 10 } 11 return ret; 12 } 原文地址:https://www

机器学习算法-PCA降维技术

机器学习算法-PCA降维 一.引言 在实际的数据分析问题中我们遇到的问题通常有较高维数的特征,在进行实际的数据分析的时候,我们并不会将所有的特征都用于算法的训练,而是挑选出我们认为可能对目标有影响的特征.比如在泰坦尼克号乘员生存预测的问题中我们会将姓名作为无用信息进行处理,这是我们可以从直观上比较好理解的.但是有些特征之间可能存在强相关关系,比如研究一个地区的发展状况,我们可能会选择该地区的GDP和人均消费水平这两个特征作为一个衡量指标.显然这两者之间是存在较强的相关关系,他们描述的都是该地区的