算法的经验分析

来源 :电脑知识与技术·学术交流 | 被引量 : 0次 | 上传用户:yl1992zhangshu0804
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘要:我们以前应用过许多算法分析,虽然这些技术能够成功应用于许多简单的算法,但即使有许多高级技术的支持,数学也远不是万能的。实际上我们能够证明,即使许多貌似简单的算法也是很难用数学的精确性和严格性来分析的。除了可以对算法的效率做数学分析以外,另一种主要的方法是对算法的效率做经验分析。
  关键词:算法;效率;伪随机数;散点图
  中图分类号:TP302文献标识码:A文章编号:1009-3044(2008)20-30281-02
  
  Empirical Analysis of Algorithms
  LI Zhan-xin
  (Guangdong Technical School of Metallurgy,Guangzhou 511430,China)
  Abstract:Algorithmic analysis has been put into application in many ways.And it has been applied in many simple algorithm successfully. Though this technology has been supported by many other advanced techniques, mathematics are not definitely omnipotent. In fact it has been proved that it is difficult to analyze many seemingly simple algorithm through the accuracy and preciseness of mathematics.Besides mathematic analysis of efficiency of algorithm, we can focus on the empirical analysis of it.
  Key words:Algorithms;efficiency;pseudo-random number;scatter diagram
  我们常常希望算法具有许多良好的特性,除了正确性,最重要的的特性就是“效率”了。实际上,有两种算法效率:时间效率和空间效率。对特定算法设计技术使问题求解的有效策略。下面这个方案清楚地描述了算法分析中的经验分析。
  
  1 对算法效率做经验分析的通用方案
  
  (1)了解实验的目的。
  (2)决定用来度量效率的量度M和度量单位(操作次数还是直接时间)。
  (3)决定输入样本的特性(它的范围和大小等)。
  (4)为实验准备算法(或者若干算法)的程序实现。
  (5)生成输入样本。
  (6)对输入样本运行算法(或者若干算法),并记录观察到的实验数据。
  (7)分析获得的实验数据。
  在做算法的经验分析时,我们的目标往往不尽相同。可选的目标包括:检验算法效率理论上的结论的精确性,比较相同问题的不同算法或者相同算法的不同实现的效率,先假定算法的效率类型,然后在特定的计算机上确定实现该算法的程序效率。显而易见,这种实验的设计依赖于实验者打算探寻什么答案。
  2 对算法的效率进行度量的方法
  第一种方法就是在算法的程序实现中插入一些计数器来对算法执行的基本操作次数进行计数。这常常是一种简单的操作,我们只要留心程序的哪些地方可以会出现基本操作,并保证对每次基本操作都进行计数。虽然这项工作常常很简单,我们每次修改完程序以后还要对程序做测试,一方面保证它能够正确解决问题,另一方面保证它对基本操作的计数是正确的。
  第二种方法是记录待讨论算法的程序实现的运行时间。最简单的做法是利用系统命令,就像UNIX中的time命令一样。另一种测量程序段运行时间的做法是,在程序段德刚开始处(tstart)和才结束时(tfinish)查询系统的时间,然后计算着两个时间的差(tfinish—tstart)。再C和C++中,我们可以用clock函数来达到这个目的;在Java中,System类的currentTimeMillis()方法提供了这个功能。
  然而,我们应该了解这样一些事实。第一,一般来说,系统时间并不是十分精确的,对相同程序的相同输入重复运行多次,可能会得到有轻微差异的统计结果。一个明显的补救办法是进行多次这样的度量,然后取它们的平均值或中值作为该样本的观察值。第二,由于现代计算机的速度很快,程序的运行时间可能被报告为0,使得记录完全失败。解决这种困境的标准做法是用一个特定的循环多次运行這段程序,度量总运行时间,然后除以循环的重复次数。第三,在一个运行分时系统(像UNIX)的计算机上,所报告的时间很可能包含了CPU运行其他程序的时间,很明显这完全有悖于实验的初衷。所以我们应该引起注意,并要求系统提供专门用于运行我们的程序的时间(在UNIX中,这个时间称为“用户时间”,time命令中就提供了这个功能)。
  因此,度量物理运行时间存在着一些弊端,既有原则上的,也有技术上的,而统计基本操作的运行次数就没有这些缺陷。但另一方面,物理运行时间提供了特定运行环境下的算法性能的详细信息。这些信息对于实验者来说,要比算法的渐进效率类型更重要。另外,对程序不同部分的运行时间进行度量能够提示出程序性能的瓶颈,而对于算法基本操作进行抽象分析是做不到这一点的。搜这样的数据——称为剖面,对于算法运行时间的经验分析来说是宝贵的资源;大多数环境中都提供了相关的系统工具,我们通常可以使用这些工具来获得我们所需要的数据。
  
  3 对算法的效率进行度量的样本输入
  
  无论决定用计时方法还是用基本操作计数法来度量效率,我们都必须确定实验的输入样本。一般来说,我们的目标是用一个样本来代表一类“典型”的输入,所以,我们面临的挑战是理解什么输入是“典型”输入。对于有些类型的算法,比如旅行商问题算法,研究人员制定了一系列输入实例用来作为测试的基准。但更常见的情况是,输入样本必须由实验者来确定。一般来说,我们必须做几方面的决定:样本的规模(一种比较明智的做法是,先从一个相对较小的样本开始,以后如有必要再加大),输入样本的范围(一般来说,既不要小的没有意义,一不要过分大)以及一个在所选择范围为产生输入的程序。就最后一个方面来说,输入的规模即可以符合一种模式(例如,1000,2000,3000,……10000或者500,1000,2000,4000,……128000),也可以随机产生(例如,在最大值和最小值之间均匀分布)。
  根据一个模式来改变输入规模的主要高处是,我们很容易分析这种改变所带来的影响。例如,如果一个样本的规模每次都会翻倍,我们可以计算所观察到的度量M之间的比率M(2n)/M(n),看一看该比率所揭示的算法典型性能是否属于一个基本的效率类型。输入规模不随机变化的主要弊病是存在这种可能性,即我们所研究的算法在我们所挑选的样本上正好表现出非典型的行为。例如,如果所有样本的规模都是偶数,但所研究的算法对于奇数规模的输入却运行得十分缓慢,得出的经验结论就会使人误入歧途。
  对于实验样本的规模,我们需要重点考虑的另一个因素是,是否需要包括同样规模样本的多个不同实例。如果我们预测,对于相同规模的不同实例,我们观测到的度量值会有相当的不同,那么,让样本中的每一种规模都包括多个实例是比较明智的(统计学中有许多很成熟的方法帮助实验者来作这种决定)。当然,如果样本中包含相同规模的若干实验,应该计算并研究每种每种规模的观察结果的平均值或者中值,而不是仅仅研究单独的样本点。
  
  4 算法经验分析中的结果分析
  
  对于算法效率的实验分析来说,大多数情况下都需要产生一些随机数。即使我们决定对输入规模应用的一种模式,我们仍然希望输入的实例会自动随机产生。目前,在一台数字式的计算机上产生随机数还是一个难题,因为原理上,这个问题只能近似解决。这就是为什么计算机科学家倾向于把这种数称为伪随机数。从实用的角度看,获得这种数的最简单和最自然的方法是利用计算机语言的函数库提供的随机数发生器。典型情况下,它会输出一个均匀分布在0和1区间中的(伪)随机变量的值。如果需要一个另外一种随机变量,我们应该做一个相应的变换。例如,x是一个均匀分布在0≤x<1区间上的连续随机变量,变量y=l+x?骔(r-l)」就会均匀地分布在l和r-l间的整数上,其中l和r是两个整数(r<l)。
  另外,有几个已知的生成(伪)随机数的算法,我们可以选择一个来实现。它们中使用最广泛、研究最彻底的一个算法是所谓的线性同余法。
  
  这段简单的算法代码会令人误以为求伪随机数并不复杂,其实如何选择算法参数才是真正的难点。基于复杂的数学分析,这里给出一部分建议:seed可以任意选择,并且常常将它设为当前的日期或者时间;m应该是一个较大数,出于方便的考虑,可以把它定为2w,w是计算机的字长;a可以是0.01m和0.99m间的任何整数,除了a mod 8=5以外,它的值不要体现出任何模式;可以选择1作为b的值。
  作为实验结果的经验数据需要记录下来,然后拿来作分析。数据可以用数值的形式记录在表格中或者表现为散点图的形式,散点图就是在笛卡尔儿坐标系中用点将数据标出。任何时候只要可行,都应该同时使用这两种方法,因为这两种方法各有利弊。
  以表格呈现数据的主要优点是,我们可以很方便地对它们进行计算。例如,我们可以计算M(n)/g(n)的比率,其中g(n)是所讨论算法的效率类型的候选对象。如果该算法的确属于Θ(g(n)),那么很可能当n变得越来越大时,这个比率会趋向于一个大于0的常数(注意,一个粗心的新手有时会假设这个常数必须为1,这显然是不符合Θ(g(n))的定义的)。我们也可以计算M(2n)/M(n)的比率,看一看当输入的规模翻倍的时候,运行时间是如何变化的。
  另一方面,散点图这种形式也会帮助我们确定可能的算法效率类型。一个对数算法的散点图会具有一个上凸的形状,这把它同其它效率类型区分开来。一个线性算法的散点图趋向于分布在一条直线的周围,或者更一般地来说,包含在两根直线的当中区域。属于Θ(nlgn)和Θ(n2)的函数的散点图都会具有一个下凹的形状,使我们很难把它们区分开来。一个立方算法的散点图也具有一个下凹的形状,但它的量度值顯示出非常快速的增长。一个指数算法在垂直轴上很可能需要一种对数刻度,我们在图上标出的不是M(n),而是logaM(n)(2或者10常常被用作对数的底)。在这样一种坐标系中,一个真正的指数算法的散点图应该像一个线性函数,因为M(n)≈can意味着logbM(n)≈logbc+nlogba。
  经验分析的一种可能应用是:对于不包含在实验样本中的输入样本,我们可以试着去与测算法会表现出来的性能。例如,如果在样本实例中,我们观察到的M(n)/g(n)的比率接近某些常数c,对于n的其他值,我们可以用cg(n)的积来近似表示M(n)。这种做法虽然有道理,但我们应该小心使用,尤其对于那些在样本值范围以外的n值来说(相对于专门处理样本范围内的值内推法来说,数学家把
  这种方法称为外推法),而且,用这种方法得到的估计值常常不做精确度声明。当然,我们也可以使用标准的数据统计技术来做分析和预测。然而,请注意,大多数这种技术都是基于特定的概率假定,这种假定与所讨论的实验数据可能符合,也可能不符合。
  5 结语
  最后,我们应该指出算法的数学分析和经验分析的基本区别。数学分析的主要优点是它并不依赖于特定的输入,但它的主要缺点是适用性不强,这一点对于研究平均效率来说尤其明显。经验分析的主要优点是它能够适用于任何算法,但它的结论依赖于实验中使用的特定样本实例和计算机。
  
  参考文献:
  [1] 严蔚敏,吴伟民.数据结构(C语言版)[M].北京:清华大学出版社,2006.
  [2] Anany Levitin.算法设计与分析[M].潘彦,译.北京:清华大学出版社,2007.
其他文献
摘要:简要的介绍了UML建模技术,描述了公务员培训项目管理系统的设计与建模过程。在对系统进行需求分析的基础上,对系统进行需求模型、静态模型、动态模型的建模。  关键词:统一建模语言;培训项目管理;可视化;系统设计  中图分类号:TP311文献标识码:A文章编号:1009-3044(2008)20-20269-03    Application Study of UML in Train Proje
期刊
摘要:在线学习技术是现代教育发展的一个方向,如何有效地对学员进行管理也成为在线学习模式下一个亟待解决了问题。本文对在线学习模式下考勤管理进行了深入研究,针对在线学习中的学员流动频繁,考勤的实时性要求比较高的特点,以基于.NET的在线学习系统的实际开发为例,从考勤模块的总体设计到考勤信息的实时存取实现方法等方面进行了详细阐述。  关键词:在线学习;E-learning;在线考勤  中图分类号:TP3
期刊
针对国内公交环境下的客流统计进行研究,提出了一种乘客上下车运动目标的检测方法,先把整个运动对象提取出来,再用改进的分水岭算法,结合特征分析将运动对象中的各个目标分割开来。实验结果表明该方法就一般情况下对多人靠在一起也能有效检测目标,但是对于多人完全同色贴在一起的情况,光靠该算法就不太适用了,需要结合随后的跟踪算法进行处理。
期刊
摘要:为解决学生实验的可操作性和实验室安全管理的稳定性之间的矛盾,引入VMware,在单机上实现虚拟网络实验平台、独立安装运行多系统以及建立相对独立的软件测试环境等等,从而提高实验教学的课堂效果。  关键词:VMware;虚拟机;虚拟网络;CMOS  中图分类号:TP393文献标识码:A文章编号:1009-3044(2008)20-30323-03    The Virtual Machine T
期刊
摘要:本系统是实现一个药店采购、销售和库存管理的管理系统,采用C/S体系结构,该系统以Delphi为开发平台,支持Access数据库,设计了基础信息录入、业务单据处理、各种查询统计及系统日常维护四大模块。该系统功能全面、界面友好、操作方便,解决了中小型药店目前存在的药品销售管理难题。  关键词:药品管理;C/S;Delphi;模块结构  中图分类号:TP311文献标识码:A文章编号:1009-30
期刊
摘要:在自动考试系统的题库建设中,试题库设计及组卷策略是关键环节。试题库中试题的参数,不同的试题库不尽相同,这里定义为:试题=(编号、题型、题干、答案、分值、试题难度、区分度、知识点、使用次数);试卷=(标题、考试时间、考试日期、总分值、题型、试卷难度、试卷区分度、知识点、曝光度)。  关键词:题库;组卷策略;难度;区分度;知识点  中图分类号:TP311文献标识码:A文章编号:1009-3044
期刊
摘要:高等教育事业的发展离不开校园网,各类网络信息服务平台广泛应用于教育教学、管理科研和后勤服务。数据的规模呈爆炸性增长,信息数据已成为学校最重要的无形资产。由于病毒破坏、软硬件故障等多种原因,时刻威胁着数据的安全。重要数据的丢失必定会带来重大的损失。如何保障校园网数据的安全,切实采取有效措施做好数据备份与应急恢复,已成为网络管理员的重要工作。  关键词:计算机网络;数据;备份;策略  中图分类号
期刊
摘要:程序设计是计算机专业课程中的重要内容之一。在程序设计课程教学中,如何解决程序设计本身枯燥、难懂这个问题,找到一条比较新颖的教学方式,一直是广大计算机教师颇感兴趣的课题。结合几年来VB程序设计的实际经验,并进行深刻的反思,总结出一个四步教学法。  关键词:四步实例教学;照搬;修改;编写;能力培养  中图分类号:TP393文献标识码:A文章编号:1009-3044(2008)20-30294-0
期刊
本文根据车牌区域具有丰富的垂直纹理这一主要特征,并结合车牌尺寸和通过投影呈现的峰值在一定范围内较为固定等特点,提出一种基于综合特征的车牌分割新方法。实验结果表明:该方法能够较为准确地完成车牌区域的分割,整个算法复杂度低,能够满足实时分割的要求。
期刊
摘要:IEEE1451网络化智能传感器代表了未来传感器的发展方向,协议的提出很好的解决了传感器之间互换性与互操作性差的难题。本文简要概述了IEEE1451协议,对其中定义的电子数据表格 (TEDS) 进行了详细分析。通过基于片上系统ADuC812的智能传感器模块来说明电子数据表格的实际应用和作用,同时介绍了用VC设计的上层下载软件来实现表格的数据填写和下载。  关键词:IEEE1451;TEDS;
期刊