|
|
|
|
移动端

2.3 要分析的问题

《数据结构与算法分析:Java语言描述(原书第3版)》第2章算法分析,本章对如何分析程序的复杂性给出一些提示。遗憾的是, 它并不是完善的分析指南。简单的程序通常给出简单的分析, 但是情况也并不总是如此。本节为大家介绍要分析的问题。

作者:冯舜玺/陈越 译来源:机械工业出版社|2016-04-13 11:27

有奖调研 | 1TB硬盘等你拿 AI+区块链的发展趋势及应用调研


2.3 要分析的问题

通常, 要分析的最重要的资源就是运行时间。有几个因素影响着程序的运行时间。有些因素(如所使用的编译器和计算机)显然超出了任何理论模型的范畴, 因此, 虽然它们是重要的, 但是我们在这里还是不能考虑它们。剩下的主要因素则是所使用的算法以及对该算法的输入。

典型的情形是, 输入的大小是主要的考虑方面。我们定义两个函数Tavg(N)和Tworst(N), 分别为算法对于输入量N所花费的平均运行时间和最坏情况的运行时间。显然, Tavg(N)≤Tworst(N)。如果存在多于一个的输入, 那么这些函数可以有多于一个的变量。

偶尔也分析一个算法最好情形的性能。不过, 通常这没有什么重要意义, 因为它不代表典型的行为。平均情形性能常常反映典型的行为, 而最坏情形的性能则代表对任何可能输入的性能的一种保证。还要注意, 虽然在这一章我们分析的是Java程序, 但所得到的界实际上是算法的界而不是程序的界。程序是算法以一种特殊编程语言的实现, 程序设计语言的细节几乎总是不影响大O的答案。如果一个程序比算法分析提出的速度慢得多, 那么可能存在低效率的实现。这在类似C++的语言中很普遍, 比如, 数组可能当作整体而被漫不经心地拷贝, 而不是由引用来传递。不管怎么说, 这在Java中也可能出现; 在12.7节的最后两段有一个极其巧妙的例子来说明这个问题。因此, 在后面各章我们将分析算法而不是分析程序。

一般说来, 若无相反的指定, 则所需要的量是最坏情况的运行时间。其原因之一是它对所有的输入提供了一个界限, 包括特别坏的输入, 而平均情况分析不提供这样的界。另一个原因是平均情况的界计算起来通常要困难得多。在某些情况下, “平均”的定义可能影响分析的结果。(例如, 什么是下述问题的平均输入?)

作为一个例子, 我们将在下一节考虑下述问题:

最大子序列和问题

给定(可能有负的)整数A1,A2,…,AN,求∑jk=iAk的最大值。(为方便起见, 如果所有整数均为负数,则最大子序列和为0)。

例如: 对于输入-2,11,-4,13,-5,-2, 答案为20(从A2到A4)。

这个问题之所以有吸引力, 主要是因为存在求解它的很多算法, 而这些算法的性能又差异很大。我们将讨论求解该问题的四种算法。这四种算法在某台计算机上(究竟是哪一台具体的计算机并不重要)的运行时间如图2-2所示。

在表中有几个重要的情况值得注意。对于小量的输入, 这些算法都在眨眼之间完成, 因此如果只是小量输入的情形, 那么花费大量的努力去设计聪明的算法恐怕就太不值得了。另一方面, 近来对于重写那些不再合理的基于小输入33量假设而在五年以前编写的程序确实存在巨大的市场。现在看来, 这些程序太慢了, 因为它们用的是一些低劣的算法。对于大量的输入, 算法4显然是最好的选择(虽然算法3也是可用的)。

其次, 表中所给出的时间不包括读入数据所需要的时间。对于算法4, 仅仅从磁盘读入数据所用的时间很可能在数量级上比求解上述问题所需要的时间还要大。这是许多有效算法的典型特点。数据的读入一般是个瓶颈; 一旦数据读入, 问题就会迅速解决。但是, 对于低效率的算法情况就不同了, 它必然要占用大量的计算机资源。因此只要可能, 使得算法足够有效而不至成为问题的瓶颈是非常重要的。

注意到具有线性复杂度的算法4表现很好,当问题的规模增长了十倍的时候,其运行时间也增长十倍。而具有平方复杂度的算法2就不行了,34十倍的规模增长导致运行时间大约有百倍(102)的增长。而立方级复杂度的算法1的运行时间则有千倍(103)的增长。对于N=100000,我们可以预期算法1将花费近乎90000秒(或一天)的时间。类似地,我们可预期算法2用大约333秒来完成N=1000000。然而,算法2也可能花更多的时间,因为在现代计算机中,内存存取N=1000000可能比处理N=100000要慢,这取决于内存缓存的大小。


喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:342347198

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

Java Web标签应用开发

Java Web程序员直接在JSP页面中书写Java代码的做法,使得页面中混杂有JavaScript、HTML、Java等多种语言的程序代码,可读性差,可复用性也...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊