
发表日期: 2021-04-13 09:02:48 浏览次数:188
邢台网站建设【邢台网络公司】邢台做网站、邢台微信公众号开发、邢台网站设计、邢台小程序制作
邢台,简称“邢”,古称邢州、顺德府,是河北省地级市,河北省政府批复确定的京津冀城市群节点城市、河北省级历史文化名城、冀中南先进制造业基地和物流枢纽 [1] 。截至2020年,全市下辖4个区、12个县、代管2个县级市。 [2] 总面积12400平方千米,市区建成区面积214.84平方千米,常住人口739.52万人,城镇人口401.04万人,城镇化率54.23%。 [3-5]
邢台地处中国华北地区、河北南部,境内京广、京九铁路,京广、京九高铁,京港澳、大广、太行山高速纵贯南北;邢和、邢黄铁路,邢衡、邢汾、邢临、青银高速横贯东西,与邢台国际内陆港、邢台机场构成了“东出西联、南承北接”的交通枢纽。 [6]
邢台拥有3500余年建城史,距今五万至十万年前就有人类栖息繁衍,历史上曾四次建国、五次定都,有“五朝古都、十朝雄郡”之称,是华夏版图上建城历史排名第三的城市 [7] ,华北历史上第一座城市,中国最早的古都之一,历经三千多年行政建制未曾中断、城址未曾迁移。邢台古城是黄河以北地区建城最早的“第一古城”,被誉为“燕赵第一城”。 [8]
邢台悠久的历史涌现出郭守敬、李牧、宋璟、刘秉忠等先贤,走出了郭威、柴荣、孟知祥、孟昶等帝王,千古一帝秦始皇东巡途中驾崩于邢台沙丘 [9-10] 。 邢台也是唐朝皇室祖籍地(唐祖陵) [11-14] ,发生过尧舜禅让、胡服骑射、巨鹿之战、黄巾起义等影响中国历史进程的事件,有破釜沉舟、鹿死谁手、民脂民膏、腹背受敌等近百条成语、典故源自邢台。
那么,应该如何选择解决给定问题的算法呢?一般来说,应该选择易于理解、实现和记录的算法。当性能很重要时(它往往确实很重要),还需要选择能够迅速运行而且能有效使用可用计算资源的算法。因此,我们要考虑一些很微妙的问题,即如何衡量程序或算法的运行时间,以及可以采取哪些措施使程序运行得更快。
本章中,我们将介绍以下主题。
程序性能的重要指标。
评估程序性能的方法。
大O表示法。
使用大O表示法估算程序的运行时间。
使用递推关系估算递归程序的运行时间。
3.4节和3.5节介绍的大O表示法,免去了处理那些几乎不可能确定的常量(比如常见的C语言编译器在编译某个给定的源程序时会生成的机器指令数)的麻烦,从而简化了估算程序运行时间的过程。
我们将循序渐进地介绍估算程序运行时间所需的技巧。3.6节和3.7节会展示分析不含函数调用的程序的方法。3.8节将分析具有非递归函数调用的程序。接着3.9节和3.10节会介绍如何处理递归函数。最后,3.11节将讨论递推关系的解决方案,在分析递归函数的运行时间时,对这些函数的归纳定义即称为递推关系。
如果需要编写的程序只是一次性处理少量数据后就弃之不用的,就应该选择自己所知的最容易实现的算法,编写并调试程序,然后就不用多管了。不过,如果需要编写在很长一段时间里由很多人使用和维护的程序,就会出现其他问题了。其一就是底层算法的可理解性,或者说是简单性。要求算法简单的原因有不少,不过最重要的也许在于,与复杂的算法相比,简单的算法实现起来不容易出错。用简单算法实现的程序,哪怕在使用相当长一段时间后,遇到一些意外输入时曝出奇怪bug的可能性也较小。
应该将程序写得清晰明确,并仔细地记下文档,这样可便于他人维护这些程序。如果算法简单且易于理解,就更易于描述。有了好的文档,原作者之外的程序员就能方便地对原始程序加以修改(原作者经常不会做这些);或者,如果程序完成得比较早,原作者也会对其加以修改。有很多程序员写出巧妙高效的算法后就从公司拍屁股走人了,结果后续的代码维护者只能放弃他们的算法,转而用更慢但更好理解的算法来代替,这种情况屡见不鲜。
当程序要重复运行时,它的效率以及其底层算法的效率就很重要了。我们通常会将效率与程序运行所花的时间挂钩,虽然有时程序也必须占用一些其他资源,比如:
1. 程序变量占用的存储空间;
2. 程序在计算机网络中产生的流量;
3. 必须出入磁盘的数据量。
不过,对大的问题来说,对给定程序是否堪用起着决定性作用的是运作时间,而本章的主题就是运行时间。我们所要讲的程序的效率,其实就是它耗费的时间,是用程序输入大小的函数来衡量的。
通常,可理解性和效率是相互矛盾的目标。例如,比较过图2-3中的选择排序程序和图2-32中的归并排序程序的读者肯定都会认同,后者不仅更长,而且难理解得多。就算我们总结了2.2节和2.8节中给出的那些解释,在程序中添加了经过深思熟虑的注释,结果依然如此。不过,也正如我们将要了解的,只要待排序的元素个数过百,归并排序的效率就会比选择排序的效率高得多。不巧的是,这种情况太普遍了——对大数据量来说有效率的算法,编写和理解起来往往比那些相对低效的算法更加复杂。
算法的可理解性,或者说是简单性,是有些主观的概念。我们可以在某种程度上克服算法不够简单的问题,即在注释和程序文档中对算法进行到位的解释。编写文档的人始终要考虑阅读这些代码及其注释的人:一般人能明白这是在说什么吗?是否需要进一步的解释、细节、定义和示例?
另一方面,程序的效率是个客观的问题:程序所花的时间就是那么多,没什么争议的余地。不过我们没办法用所有可能的(通常是无数的)输入来运行程序。因此,我们要对程序运行时间加以度量,因为它总结了程序处理所有输入的性能,通常是用一个诸如“n2”这样的简单表达式来度量的。本章下面几节的主题就是如何度量程序的运行时间。
一旦我们认同可以通过度量程序的运行时间对程序加以评估,就要面对确定实际运行时间的问题。总结运算时间的两种主要方法是:
1. 基准测试;
2. 分析。
我们将依次介绍这两种方法,不过本章主要讲的还是用于分析程序或算法的技术。
在比较用于完成相同任务的两个或多个程序时,制定一小组可用作基准的典型输入是一种惯例。也就是说,我们愿意接受基准输入作为这些任务组合的代表,并假设能顺利处理基准输入的程序能顺利处理所有输入。
例如,评估排序算法的基准可能包含一小组数字(比如圆周率的前20位数字)、一个中等规模的输入组(比如得克萨斯州的邮政编码集合),以及一个大规模输入组(比如布鲁克林区电话目录中的电话号码集合)。我们可能还想知道,在对空集、单元素集以及已排序表排序时,程序是否能有效及正确地工作。有趣的是,有些排序算法在处理已排序表时的性能惨不忍睹。1
1选择排序和归并排序都不在此列,它们在处理有序列表时所花的时间几乎与为相同长度的任一列表排序所花的时间相同。
90-10法则
与基准测试一样,确定要分析的程序在哪里花了时间通常也是很实用的。这种评估程序性能的方法称为剖析(profiling),而且多数程序设计环境都包含有剖析器(profiler)这种工具,会为程序中每条语句关联一个表示执行这条语句所花时间的数字。还有一种相关的实用程序,名叫语句计数器,用于确定对于给定的输入集,源程序中每条语句执行的次数。
很多程序都具有这样的特性,即大部分运行时间都花在一小部分源代码上了。有这么一条非正式的法则:90%的运行时间花在了10%的代码上。尽管准确的百分比是视程序而定的,不过“90-10法则”还是表明了多数程序中运行时间主要花在了哪里。想要加快程序运行速度,最简单的一种方法就是对程序加以剖析,并对程序“热点”(也就是程序中花掉大部分运行时间的部分)的代码加以改进。例如,我们在第2章中提到过,用等价的迭代函数替代递归函数是可能为程序提速的。不过,这种做法只有在递归函数正好是程序中占用大部分运行时间的部分时才奏效。
在极端情况下,即便我们将只占用10%时间的那90%的代码所花的时间变为0,程序总的运行时间也只减少了10%。然而,如果将10%的程序所占用的那90%的时间减半,总运行时间就将减少45%。
要分析程序,首先要按大小为输入分组。正如在2.9节中与证明递归程序属性一起讨论的那样,用来表示输入大小的度量是因程序而异的。对排序程序来说,待排序元素的数量就是个很不错的度量。对于求解n元线性方程组的程序,拿n作为问题的大小是很平常的。其他的程序可能使用某个特定输入的值作为程序输入的表的长度,或作为输入的数组的大小,或是诸如此类的度量的组合。
用函数T(n)来表示程序或算法处理大小为n的任意输入所花的时间是很方便的。我们将T(n)称为程序的运行时间。例如,某个程序的运行时间可能是T(n)=cn,其中c 是某个常数。换个说法就是,该程序的运行时间,与其要处理的输入的大小是线性相关的。这样的程序或算法就是线性时间的,或者直接说成是线性的。
我们可以将运行时间T(n)看作程序执行的C语言语句的数量,或是在某标准计算机上运行程序所花的时长。在多数情况下,我们都不会明确指出T(n)的具体单位。事实上,正如我们在下一节中将要看到的,在谈论程序的运行时间时,可以只用某个(未知的)常数因子乘上T(n)来表示。
很多时候,程序的运行时间取决于某个特定的输入,而不仅仅取决于输入的大小。在这类情况下,我们将T(n)定义为最坏情况运行时间,也就是所有大小为n的输入所能造成的最大运行时间。
另一种常见的性能度量是Tavg(n),即程序处理所有大小为n 的输入的平均运行时间。平均运行时间有时候是对实际性能更为现实的反映,不过它往往比最坏情况运行时间更难计算。“平均运行时间”中“平均”的概念还意味着,所有大小为n 的输入是等可能性的,而这在某个给定情况下既可能为真,也可能不为真。

服务热线
顶部
备案号: 苏ICP备11067224号
CopyRight © 2011 书生商友信息科技 All Right Reserved
24小时服务热线:400-111-6878 E-MAIL:1120768800@qq.com QQ:1120768800
网址: http://www.768800.com 网站建设:上往建站
关键词: 网站建设| 域名邮箱| 服务器空间| 网站推广| 上往建站| 网站制作| 网站设计| 域名注册| 网络营销| 网站维护|
企业邮箱| 虚拟主机| 网络建站| 网站服务| 网页设计| 网店美工设计| 网站定制| 企业建站| 网站设计制作| 网页制作公司|
400电话办理| 书生商友软件| 葬花网| 调温纤维| 海洋馆运营维护| 北京保安公司| 殡仪馆服务| 殡葬服务| 苏州殡葬一条龙| 朝阳殡葬| 苏州殡葬服务|
欢迎您免费咨询,请填写以下信息,我们收到后会尽快与您联系
服务热线:400-111-6878