目录
一、算法的定义
什么是算法呢?算法是描述解决问题的方法。算法(Algorithm)这个单词最早出现在波斯数学家阿勒·花刺子密在公元825年(相当于我们中国的唐朝时期)所写的《印度 数字算术》中。
如今普遍认可的对算法的定义是: 算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并旦每条指令表示一个或多个操作。
二、算法的特性
算法具有五个基本特性:输入、输出、有穷性、确定性和可行性。
- 输入:算法具有零个或多个输入。所谓的零个输入是指算法本身有初始条件
- 输出:算法有一个或多个输出。算法是一定需要输出的,不需要输出你用这个算法干吗?输出的形式可以是打印输出,也可以是返回一个或多个值等。
- 有穷性:一个算法总是在执行有限个步骤之后终止。现实中经常会写出死循环的代码,这就是不满足有穷性。
- 确定性:算法的每一步骤都具有确定的含义,不会出现二义性。
- 可行性:算法的每一步都必须是可行的,并且每个计算步骤都能在有限时间内完成。
三、算法性能分析
- 正确性:算法的正确性是指算法至少应该具有输入、输出和加工处理无歧义性,能正确反映问题的需求,能够得到问题的正确答案。
- 可读性:算法设计的另一目的是为了便于阅读、理解和交流。可读性高有助于人们理解算法,晦涩难懂的算法往往隐含错误,不易被发现并且难于调试和修改。
- 稳健性:一个好的算法还应该能对输入数据不台法的情况做适当的处理。当输入数据不合法时算法也能做出相关处理,而不是产生异常或莫名旦妙的结果。
- 高效率和低存储量:衡量一个算法的高效率通常指的是时间效率,即算法执行的时间;算法的低存储量指算法在执行过程中所需要的最大存储空间。时间效率和空间效率是衡量算法优势的两个主要指标,二者的复杂度都与问题的规模有关。
四、算法的时间效率分析
算法的时间效率是指算法执行时间的长短。影响算法执行时间的因素:计算机的硬件系统、软件系统、问题规模(工作量)。
基本操作频度——作为算法执行时间的度量。一个算法中基本操作的频度,通常是问题规模 n 的某个函数,该函数记为 T(n)。实际上,要准确计算出算法中基本操作的频度是非常困难的,而且也不是很必要。对于某个算法,通常关心的是:当问题规模 n 增长时,算法的执行时间是如何增长的?也就是说只需估计出算法执行时间的增长率的数量级即可。因此,常用算法的渐近时间复杂度来作为衡量算法时间效率度量。
算法时间复杂度——如果算法的问题规模为 n ,基本操作的频度为 T(n) ,若有某个辅助函数 f(n),并存在正常数 c 和 n0 使得当 n≥n0 时,T(n)≤c(f(n)),则记作:T(n) = O ( f (n ) ) 表示:随问题规模 n 的增大,算法执行时间的增长率和 f(n) 的增长率相同。称 O( f (n ) ) 为算法的 渐近时间复杂度,简称为时间复杂度。这种记法称为大O 记法。
※说明:大 O 记法表示算法的时间复杂度时,其要求精度很低,只是粗略估计出执行时间的增长率的数量级。所以,并不需要将所有基本操作的执行次数全部计算出,只需计算起决定性因素的基本操作的执行次数即可;且可用基本语句(或语句组)来代替基本操作,因为一个语句可以分解成有限的几个操作。
求解算法时间复杂度简单方法:(1)首先,找出算法中的基本语句。(2)然后,计算基本语句的频度 T(n) 3)最后用大Ο记法表示算法的时间性能。(4)如果算法中包含嵌套的循环,则基本语句通常是最内层的循环体。(5)如果算法中包含并列的循环且每个循环的问题规模不同时,则将并列循环的时间复杂度相加;而若每个并列循环的问题规模相同时,则只取数量级最高的时间复杂度。
算法的时间复杂度是衡量算法好坏的一个重要指标,其数量级越低,则算法的时间效率就越高。
常见的时间复杂度:
- 常数阶 O(1),即算法的执行时间是一个常数,不依赖于问题规模 n;
- 线性阶 O(n);
- 多项式阶,如平方阶 O(n2)、立方阶 O(n3)、 O(n1/2) 等;
- 对数阶,如 O( log2n )、O( log3n) 等;
- 线性对数阶,如 O( n log2n ) 等;
- 指数阶,如 O( 2n ) 等。
常用的时间复杂度所耗费的时间从小到大依次是:
五、算法的空间效率分析
算法的空间效率是指算法在计算机上运行时所需存储空间的大小。算法在运行时上所占用的存储空间有三个方面:(1)算法本身所占存储空间。(2)算法的输入与输出数据所占存储空间。(3)算法运行过程中为了解决问题所需要占用的辅助存储空间。
算法的渐进空间复杂度——类似算法的渐进时间复杂度,通常用算法的渐进空间复杂度(简称空间复杂度)作为算法算法空间效率的度量。算法的空间复杂度用大 O 记法表示为:S(n ) = O( f (n) )
表示:随着问题规模 n 的增大,算法运行时所需辅助存储空间的增长率的数量级为f(n)。若算法运行时所占的存储空间与问题规模无关(为常量),称这种算法为原地工作,空间复杂度用O(1)表示。
※算法的时间复杂度和空间复杂度合称为算法的复杂度
算法的时间复杂度和空间复杂度往往是相互影响的两个方面。要提高算法的时间效率,则往往就需要增加空间的额外开销;同样,若欲节省算法的空间时,则可能就需以耗费更多的计算时间为代价。因此,在设计算法时,应综合考虑算法的各项性能,并有所侧重。