第一章 算法的概述
1.1 算法是什么?
一般地,算法是指在解决问题时,按照某种机械程序步骤,一定可以得到结果的处理过程
这种过程必须是确定的、有效的、有限的。
1.1.1 算法的定义
一系列将问题的输入转换为输出的计算或操作步骤。
1.1.2 计算机算法的一般特征
①输入 | ②输出 | ③确定性 | ④有限性 |
有外部提供的量,作为算法的输入 | 算法产生至少一个量作为输出 | 组成算法的每条指令是清晰的,没有歧义的 | 算法的每条指令的执行次数是有限的,执行每条指令的时间也是有限的 |
1.1.3 算法的三要素
①数据 | 运算数据中作为运算对象和结果的数据 |
②运算 | 运算序列中的各种运算、赋值、算术和逻辑运算 |
③控制和转移 | 运算序列中的控制和转移 |
1.1.4 算法的分类
① 从解法上分类:
数值型算法 | 算法中的基本运算为算术运算 |
非数值型算法 | 算法中的基本运算为逻辑运算 |
② 从处理方式上分类:
串行算法 | 串行计算机上执行的算法 |
并行算法 | 并行计算机上执行的算法 |
1.1.5 算法与程序、数据结构的关系
① 从过程上讲:算法 + 数据结构 ≈ 程序
② 从对象上讲:对象 + 消息 ≈ 程序
1.2 算法的复杂性是什么?
算法的复杂性:算法执行所需的时间和空间的数量,其与问题的规模、算法的输入数据、以及算法的本身有关。
1.2.1 算法设计的标准
① 正确性 | 算法应满足用户的具体需求 |
② 可读性 | 算法应该好读,利于读者对算法的理解 |
③ 健壮性 | 算法有好的容错能力,当输入异常或非法数据时,能够正确应对适当处理,不会产生莫名其妙的输出结果 |
④ 时间和空间效率 | 时间效率:算法执行的时间应该足够短 空间效率:算法执行所需的最大存储空间足够小 |
1.2.2 算法复杂度
① 算法的复杂度(算法复杂性):
(1)算法复杂性衡量的标准:时空效率需求;
(2)算法复杂度的分析对象分为:时间复杂度和空间复杂度;
(3)算法复杂度分析是指:对一个算法所需要的资源进行预测。
② 算法的复杂度表示方法:
算法复杂度函数:C = F( scale , input , algorithm )
scale | 问题的规模,通常用符号N表示 |
input | 算法的输入,其相对于问题的规模可视为常量,可以省略 |
algorithm | 算法本身,通常函数F的名字即是代表选择的算法,因此可以省略 |
时间复杂度的表示即为:T = T ( N )
空间复杂度的表示即为:S = S ( N )
③ 算法复杂度计算模型:
(1)算法分析采用单处理RAM模型( Random-Access Machine)
(2)RAM 包含了计算机中的常用指令:
算术指令 | 加、减、乘、除、求余、取整 |
数据移动指令 | 装入、存储、复制 |
控制指令 | 条件转移和非条件转移、子程序调用和返回指令 |
(3)每条指令执行所需要的时间为常量,称为元计算
(4)指令一条一条顺序执行,没有并发操作
④ 算法复杂度计算方法:
(1) 假设共有K种元计算
(2) 运行时间按依次为:t1,t2,...,tk
(3) 算法执行这些元计算的平均次数为: e1,e2,..,eN
(4) ei 是问题规模N的函数: ei = ei(N)
则算法复杂度计算方法如下:
1.2.3 算法的渐进分析
① 渐进符号:Θ符号
(1)首先,我们对一个给定的函数g(n),则Θ(g(n))表示一个函数的集合
(2)对于这个函数集合中的函数 f ( n ):
存在正常数c1、c2和n0,当n充分大时[n >= n0],
满足 c1g(n) <= f ( n ) <= c2g(n),则称f ( n ) = Θ( g ( n ) )。
此时g ( n )即为f ( n )的一个渐进确界。
(3) Θ符号渐进的给出了一个函数的上界和下界。注意此处的等号仅仅为一个记号,并不代表两者相等。
② 渐进符号:O符号
(1)首先,我们对一个给定的函数g(n),则O(g(n))表示一个函数的集合
(2)对于这个函数集合中的函数 f ( n ):
存在正常数c、n0,当n充分大时[n >= n0],
满足 0 <= f ( n ) <= cg(n),则称f ( n ) = O( g(n) ),
此时g ( n )即为f ( n )的一个渐进上界。
(3)实际意义:表示f(n)的阶不高于g(n)的阶。
例如:N^2 = O(N^3)、N^2+2N = O(N^3)、N^3 + 3N = O(N^3)。
其在问题规模相当大时,是为算法复杂度的上界。
③ 渐进符号:Ω符号
(1)首先,我们对一个给定的函数g(n),则Ω(g(n))表示一个函数的集合
(2)对于这个函数集合中的函数 f ( n ):
存在正常数c、n0,当n充分大时[n >= n0],
满足 cg(n)<= f ( n ) ,则称 f ( n ) = Ω( g(n) )。
此时g ( n )即为f ( n )的一个渐进下界。
(3)实际意义:如果问题的时间复杂度下界为 Ω( f(n) ),则计算时间复杂性为 Ω( f(n) )的算法为最优算法。
1.2.4 常见的时间复杂度
常数阶 | O(1) |
对数阶 | O(logn) |
线性阶 | O(n) |
线性对数阶 | O(nlogn) |
多项式阶 | O(n^2)、O(n^3) |
指数阶 | O(2^n) < O(n!) < O(n^n) |