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

2.1 问题样本的规模

问题样本是解决问题的程序所使用的特定输入数据集。在大部分问题中,随着这一数据集规模的增长,程序的执行时间也在不断增加。同时,过度地对样本数据进行编码(可能使用了压缩技术),可能会不必要地降低程序的执行效率。寻找一种最优的样本编码方式是极其困难的,因为问题发生在复杂的现实世界,而且还需要进行合理的翻译才能被程序求解。
在评估算法时,我们会尽量假定问题样本的编码并不是影响算法效率的决定性因素。问题样本的表现方式应当仅仅依赖于待执行操作的类型。设计高效的算法通常从选择一个合适的数据结构开始。
由于没法对问题样本给出正式定义,因此我们假设样本以一种简洁且可以普遍接受的方式对样本进行编码。例如,当对n个数字进行排序时,根据惯例,我们会假定数字可以存储在计算平台上32位的字长里,并且待排序的样本规模为n。假如某些数字需要用多于1个字长的空间存储,例如某个固定数量的字长,那么在衡量样本空间时会多乘上一个常量。
算法研究人员认为,即使给定编码方式,要精确计算出性能费用也是不切实际的。因此,他们断言,如果一些算法的性能费用仅仅是常数倍的差异,那么它们可以被认为是渐近等价的。换句话说,问题空间的不断增长所带来的算法性能差异是无关紧要的。举例来说,处理64位整数要比处理32位整数需要更长的处理时间,但是这些差异是可以忽略不计的。如果一个优秀的算法能够处理上百万的32位整数,那么它同样可以处理相同数量的64位整数。不过,这个假定在现实世界中是不可行的(谁会愿意将自己应付的账单乘上1000 呢?),因此这种方式只作为算法比较时的一种通用手段。
对于本书所涉及的算法,常量对所有平台的影响几乎都是很小的,但在产品代码中具体实现算法时,读者还必须要注意这些常数所带来的影响。这种渐近表示方式之所以非常实用,是因为它可以根据算法在小数据中的性能,来预测其在大数据中的性能。此外,它可以帮助决定特定算法实现能够处理的最大问题样本(Bentley,1999)。
大多数编程语言都支持使用数组存储数据集。数组是一块连续的内存区域,这些区域可以通过整数索引i直接和快速地存取第i个元素。当数组元素大小都在1个字长以内时,可以使用一维数组存储(例如整数数组和布尔数组)。当然,数组还可以扩展到多维来表示更为复杂的数据。

时间: 2024-09-16 08:51:05

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

《算法技术手册》一导读

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

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

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

《算法技术手册》一2.4 性能指标

2.4 性能指标 在比较算法时,我们使用了问题数据的规模n来评估算法的性能.这是过去半个世纪算法比较的标准方法.通过输入数据的规模评估算法的执行时间,我们可以知晓哪种算法能够更好地适应一些异常规模的问题.性能评估的第二种方法是考虑算法将会耗费多少内存或者存储空间.之后的小节详细讨论这个问题.常见的算法分类(按照效率降序排列)如下:常数级:O(1)对数级:O(log n)次线性级:O(nd),其中d < 1线性级:O(n)线性对数级:O(n log n)平方级: O(n2)指数级:O(2n)注意:

《算法技术手册》一2.4.2 对数级算法的性能

2.4.2 对数级算法的性能 酒保和顾客打了一个10 000 美元的赌.酒保说:"我会从1~1 000 000中挑选一个秘密数字,你有20次的机会来猜这个数字.每次猜完,我会告诉你结果是高了.低了,还是猜中了.如果你能在20个问题之内猜到我的秘密数字,我给你10 000美元,否则你给我10 000美元."你会打这个赌吗?回答当然是应该打,因为你能够稳赢.表2-1给出了范围为1~8的示例场景.表中展示了如何通过一系列的询问,每次将候选数据缩减一半.表2-1:在1~8之间猜数字的示例行为酒

《算法技术手册》一2.3.1 最坏情况

2.3.1 最坏情况 对于任一特定值n,算法或者程序在处理所有规模为n的样本时的执行时间可能会发生巨大的变化.对于一个给定的程序和一个给定的值,最坏的执行时间就是处理所有规模为n的数据所需要的最长执行时间.之所以关注算法的最坏情况,是因为它通常是最容易分析的情况.此外,它还能够说明程序在各种场景下到底会有多慢.更正式地说,如果Sn是所有规模为n的问题样本si构成的集合,t()代表算法对于每一个问题样本所需要的执行时间,那么算法在最坏情况下的执行时间为:t(si)对于所有si∈Sn的最大值.我们将

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

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

《算法技术手册》一2.3.4 上下界

2.3.4 上下界 在本书中,我们简化了"大O"表示法,目的是对不同问题样本在持续增长的规模n下算法性能进行分类.这种分类使用O(f(n))表示,其中f(n)是一些如n.n3或者2n的常见函数.例如,假设存在一个算法,当输入数据规模"足够大"时,它在最坏情况下的性能绝不大于和输入问题样本规模成比例的某个值.更加精确地说,对于所有的n > n0,存在某个常数c > 0,满足t(n) ≤ cn ,其中n0是每个问题样本"足够大时"的基本点

《算法技术手册》一2.4.5 线性对数算法的性能

2.4.5 线性对数算法的性能性能指标很好地描述了同类算法的共同行为.为了更好地阐述算法在实践中的行为,我们定义了一个函数t(n),用于表示算法解决样本规模为n的问题所需要的时间.分治法是解决问题的一个高效方法,它将规模为n的问题划分成(大致相等的)两个规模为n/2的子问题,并通过递归解决问题.这些子问题会通过线性时间方式合并在一起来解决原先规模为n的问题.使用数学表达式可以表示为:也就是说,t(n)包括了解决两个子问题和归并结果的费用,其中归并结果的费用不超过线性时间(即c*n).在等式的右边

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

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