想看博主whywait的更多同系列文章?点击传送门
简言 - 算法和时空复杂度
算法
算法是指对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作。
算法特性
算法的五个重要特性:有穷性,确定性,可行性,输入,输出。
重要特性 | 说明 |
---|---|
有穷性 | 一个算法必须总是在执行有穷步之后结束,前每一步都可在有穷时间内完成。 |
确定性 | 算法中每一条指令必须有确切的含义,读者理解时不会产生二义性。并且,在任何条件下,算法只有唯一的一条执行路径,即对于相同数的输入只能得出相同的输出。 |
可行 | 一个算法是能行的,及算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现的。 |
输入 | 一个算法有零个或多个的输入,这些输入取自于某个特定的对象的集合。 |
输出 | 一个算法有一个或多个的输出,这些输出是同输入有着某些特定关系的量。 |
算法设计要求
- 正确性
- 可读性
- 健壮性
- 效率与低存储需求
其中,效率的低存储需求是需要一些指标衡量的,这指标就是我们接下来要提到的时间复杂度和空间复杂度。
算法效率的度量
度量一个程序的执行时间的方法有二:事后统计,事前分析估算。
一个算法是由控制结构和原操作构成的,则算法时间取决于两者的综合效果。为了便于比较同一问题的不同算法,通常的做法是,从算法中选取一种对于所研究的内容(或算法类型)来说是基本操作的原操作以该基本操作重复执行的次数作为算法的时间量度。
时间复杂度
一般情况下,算法中的基本操作重复执行的次数是问题规模n的某个函数f(n), 算法的时间度量记为:
T ( n ) = O ( f ( n ) ) ; T(n) = O(f(n)); T(n)=O(f(n));
它表示随问题规模n的增大,算法执行时间的增长率和的增长率相同,称作算法的渐进时间复杂度(asymptotic time complexity),简称时间复杂度。
由于算法的时间复杂度考虑的只是对于问题规模n的增长率,则在难以精确计算基本操作执行次数或语句频度的情况下,只需求出他关于n的增长率或阶即可。
一般分析最坏情况来估计算法的时间复杂度。
相关概念
语句的频度(frequency count):该语句重复执行的次数。
基本操作:被称作问题的基本操作的原操作应是其重复执行次数和算法的执行时间成正比的原操作,多数情况下它是最深层循环内的语句中的原操作,它的执行次数和包含它的语句的频度相同。
注意:一般情况下,对一个问题或一类算法只需选择一种基本操作来讨论算法的时间复杂度。(有时候也要同时考虑几种基本操作,为了综合比较解决同一问题的方法,甚至对不同的操作进行加权计算)
存储空间需求
和算法的时间复杂度类似,我们以空间复杂度
S ( n ) = O ( f ( n ) ) S(n) = O(f(n)) S(n)=O(f(n))
作为算法所需存储空间的量度,其中n为问题的规模或大小。
和时间复杂度相同,在所占空间量依赖于特定的输入时,用最坏的的情况来分析空间复杂度。
相关名词及解释
额外空间:如果输入数据所占空间只取决于问题本身,和算法无关,则只需要分析除输入和程序之外的额外空间,否则应同时考虑输入本身所需空间(和输入数据的表示形式有关)。
原地工作:额外空间相对于输入数据量来说是常数的算法。
想看博主whywait的更多同系列文章?点击传送门
内容参考:《数据结构 (C语言版)》 严蔚敏、吴伟民