算法和算法分析
算法特性
算法(Algorithm)是对特定问题求解步骤的一种描述,是指令的有限序列,其中每一条指令表示一个或多个操作
- 有穷性:输入值合法的情况下,一个算法总是执行有穷步骤后结束,每一步都可以在有穷时间内完成
- 确定性:算法中的每条指令必须有确切含义,不能具有二义性、
- 可行性:算法中描述的操作均可通过有限次执行已经实现的基本运算来实现
- 有输入:一个算法有零个或多个输入,这些输入取自于某个特定对象的集合,该集合可以使用输入语句由外部提供
- 有输出:一个算法有一个或多个输出,这些输出于输入有着某些特定的关系,是算法对输入进行特定操作后得到的结果
算法设计的要求
- 正确性(Correctness):要求算法满足当前具体问题的需求,算法的执行结果能够满足预定的功能和性能要求
- 分为4个层次
- 算法没有语法错误
- 算法对于随意的几组输入数据能够得出复合要求的结果
- 算法对于精心设计的典型、苛刻的几组合法输入能够得出复合要求的结果
- 算法对于所有合法的输入数据都能得出复合要求的结果
- 可读性(Readability):算法应当是可读的
- 健壮性(Robustness):算法应具有容错性或例外处理能力
- 效率与存储量需求:效率指的是算法执行所需的使劲按,存储量需求指算法执行过程中所需要的最大存储空间
算法的性能分析与度量
时间复杂度(Time Complexity)是指程序运行从开始到结束所需要的时间
- T(n)=O(f(n)),它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度(symptotic Time Complexity)
空间复杂度(Space Complexity)是指程序运行从开始到结束所需要的存储空间的度量
- S(n)=O(f(n)),其中n为问题的规模,f(n)为所需存储空间关于问题规模n的函数表达式
- 固定部分,存储空间用来存储程序代码、常量、简单变量、定长成分的结构变量,这部分存储空间和所处理的数据大小和个数无关
- 可变部分,这部分空间大小与算法在某次执行中处理的特定数据的大小和规模有关
- 若额外空间相对于输入数据量来说是常数,称此算法为原地工作
- 算法的空间复杂度主要考虑算法在运行过程中临时占用的存储空间的大小