《算法技术手册》一2.3.2 平均情况

2.3.2 平均情况

考虑设计一个支持n个电话的电话系统,其中n是一个非常大的数——要求在最坏情况下,系统必须能够完成n/2位用户同时呼叫另外n/2位用户。虽然这个系统永远不会由于过载而崩溃,但构造它还是需要花费很高的代价。因为现实生活中,n/2位用户同时呼叫另外n/2位用户发生的概率极小。相反,我们可以设计一个非常容易构建的系统,并借助数学工具来计算由过载导致的系统崩溃的概率。
对于规模为n的样本集合,我们用一个概率分布Pr{si}表示样本分布的概率。其中,单个样本的出现概率为0到1,所有样本的概率的和为1。更加正式一点的定义为,如果Sn是所有规模为n的样本集合,那么:

如果t()表示算法在单个样本上的执行时间,那么在Sn上的平均执行时间是:

也就是说,样本si的实际执行时间t(si)会与它作为输入数据的概率加权。如果Pr{si}=0,那么t(si)的实际值将不会影响程序的期望执行时间。我们用Tac(n)表示算法在Sn上的平均执行时间,那么Tac(n)的增长率则表示算法在平均情况下的复杂度。
回忆一下,在描述工作量和时间的增长率时,我们总是会忽略常数,因此顺序搜索n个元素平均情况需要次查找(这符合之前的假设)。按照惯例,在符合这些假设的前提下,顺序搜索需要检查线性数量或者说n阶的元素。

时间: 2024-09-14 21:34:48

《算法技术手册》一2.3.2 平均情况的相关文章

《算法技术手册》一导读

前言 修订一本书向来都是一项艰巨的任务.我们既希望保留第1版(于2009年出版)中的精华,也希望弥补其中的一些不足并增加一些新的篇幅.在第2版中,我们延续了第1版中列出的原则,包括: 使用实际代码而非伪代码来描述算法. 将算法独立于解决的问题之外. 恰到好处地介绍数学知识. 以经验主导支撑数学分析. 在更新修订过程中,我们精简了文字描述,简化了一些布局,从而有助于补充新的算法和其他内容.我们相信,从概括的角度介绍计算机科学的一个重要领域,会对实用软件系统有着深远影响. 第2版的变动 在修订过程中

《算法技术手册》一2.3.3最好情况

2.3.3最好情况 即便最好情况在现实中很少发生,但是了解它还是有必要的.在很多情况下,最好情况能展示算法的最优状况.例如,线性搜索的最好情况是当它在n个元素中搜索v时,第一个元素恰好就是要找的那个.考虑另外一个稍有不同的算法--我们称之为计数搜索(counting search)--它会统计v在列表中出现的次数.如果v的计数是0,那么这个值是不存在的,会返回false:否则返回true.注意,计数搜索总是会搜索整个列表,因此,它在最坏情况下的执行时间是O(n)--和顺序搜索一样--最好情况也是

《算法技术手册》一2.4.8 指数级算法性能

2.4.8 指数级算法性能 考虑有一种锁,它由3个连续的数字拨盘组成,每个拨盘包含0~9的数字,并且都可以独立设置10个数字中的一个.假如你发现了这种锁,并且没有能将其打开的数字组合.你可能认为这不过是耗费一些体力工作的问题,只要尝试从000~999的1000种组合中可能的每一种即可.为了归纳这个问题,假定锁有n个表盘,那么总的可能性总数为10n.用穷举方法解决这个问题被认为是指数级性能或者O(10n),这个例子以10作为基数,但是更常见的指数底数一般是2.不过,对于任意的基数b(b> 1),它

《算法技术手册》一3.2 伪代码模板的格式

3.2 伪代码模板的格式 本书中的每个算法都可以用主流的编程语言实现,例如Python.C.C++ 和Java.由于有些读者不熟悉这些语言,我们会先用伪代码描述算法,并辅以一个小例子来解释运行过程.下面的例子给出了描述算法性能的模板,它包含算法名称,以及第2章中所述的算法的三个性能指标(最好情况.平均情况和最坏情况).伪代码的描述应当尽可能得简洁.其中关键字和函数名称用粗体字表示,所有变量采用小写字母,数组名称大写,元素采用A[i]这样的表示形式.条件语句和循环语句需要缩进.在阅读代码实现之前,

《算法技术手册》一2.2 函数的增长率

2.2 函数的增长率 我们将算法执行时间的增长率描述为一个与输入问题样本规模相关的函数.使用这种方法描述算法性能会比较抽象,因为它忽略了大量的细节问题.所以,在使用这种方法时,需要对抽象背后的细节有一个清醒的认识.程序都必须运行在某个平台上,在这里,广义的平台定义包括: 运行程序的计算机,包括CPU.数据缓存.浮点运算单元(FPU)以及其他芯片特性. 程序编写所使用的编程语言.编译器/解释器以及用于生成代码的优化设置. 操作系统. 其他后台进程. 改变上述组成平台的任何条件都只会对程序的执行时间

《算法技术手册》一2.1 问题样本的规模

2.1 问题样本的规模 问题样本是解决问题的程序所使用的特定输入数据集.在大部分问题中,随着这一数据集规模的增长,程序的执行时间也在不断增加.同时,过度地对样本数据进行编码(可能使用了压缩技术),可能会不必要地降低程序的执行效率.寻找一种最优的样本编码方式是极其困难的,因为问题发生在复杂的现实世界,而且还需要进行合理的翻译才能被程序求解. 在评估算法时,我们会尽量假定问题样本的编码并不是影响算法效率的决定性因素.问题样本的表现方式应当仅仅依赖于待执行操作的类型.设计高效的算法通常从选择一个合适的

《算法技术手册》一3.5.4 解决方案

3.5.4 解决方案 如果手动计算凸包,你应该可以很轻松地处理好各种极端情况.但是如果需要用计算机语言来描叙每一个步骤,我们可能会觉得比较困难.Graham扫描算法的关键点在于计算和最低点的极角大小.一旦计算并且排序之后,算法只需要遍历所有的点,不断地构建凸包并且根据新发现的信息调整结构即可.代码见例3-1. 例3-1:Graham扫描算法的实现 public class NativeGrahamScan implements IConvexHull { public IPoint[] comp

《算法技术手册》一1.3 高明做法

1.3 高明做法 本书介绍的大量算法都是在现有代码基础上对高效解法不懈追求的结果.我们努力地将这些算法实现为可用的代码,并尽量给出一些能够解决现实问题的算法.例如,对于凸包问题,就有许多不同的方法可以使用.在简述这些方法后,我们会在后续章节给出相应的示例.

《算法技术手册》一2.4.7 性能不明显的计算

2.4.7 性能不明显的计算 在很多情况下,仅仅通过算法的描述(如加法和乘法)就可以分辨出算法的性能是线性级还是平方级的.例如,平方级的主要特征是嵌入的循环结构.但是,这样的直接分析对某些算法却无法使用.例2-5给出了GCD算法,该算法是由欧几里德设计,用于计算两个整数的最大公约数. 例2-5:欧几里得GCD 算法 public static void gcd (int a[], int b[], int gcd[]) { if (isZero (a)) { assign (gcd, a); r