第一章 概述
重点:时间复杂度的分析
文章目录
1. 算法的概念
1.1 什么是算法
-
算法:是求解问题的一系列计算步骤,用来将输入数据转换为输出结果;如果一个算法对其每一个输入实例,都能输出正确的结果并停止,那么称它是正确的
-
算法设计应满足的目标
- 正确性
- 可使用性
- 可读性
- 健壮性
- 高效率与低存储量需求
-
算法具有的重要特征
- 有限性
- 确定性
- 可行性
- 输入性
- 输出性
1.2 算法描述
- 通常用函数的返回值表示算法能否正确执行
- 有时当算法只有一个返回值或者返回值可以区分算法是否正确执行时,用函数返回来表示算法的执行结果,另外还可以带有形参表示算法的输入输出
- 在设计算法时,如果某个形参需要将执行结果回传给实参,需要将该形参设计为引用型参数
1.3 算法和数据结构
算法与数据结构既有联系又有区别:
- 联系
- 数据结构是算法设计的基础
- 算法的操作对象是数据结构:在设计算法时,通常要构建适合这种算法的数据结构
- 数据结构设计主要是选择数据的存储方式,如确定求解问题中的数据采用数组存储还是采用链表存储等;算法设计就是在选定的存储结构上设计一个满足要求的好算法
- 区别
- 数据结构关注的是数据的逻辑结构、存储结构以及基本操作;算法更多的是关注如何在数据结构的基础上解决实际问题
- 算法是编程思想,数据结构则是这些思想的逻辑基础
1.4 算法设计的基本步骤
- 分析求解问题
- 选择数据结构和算法设计策略
- 描述算法
- 证明算法正确性
- 算法分析
2. 算法设计
算法分析:分析算法占用计算机资源的情况,两方面:时间复杂度、空间复杂度
2.1 算法时间复杂度分析
-
时间复杂度分析概述
-
一个算法是由**控制结构(顺序、分支和循环3种)和原操作(指固有数据类型的操作)**构成的,算法的运行时间取决于两者的综合效果
-
设n为算法中的问题规模,通常用以下三种渐进符号表示算法的执行时间与n之间的一种增长关系
-
分析算法时间复杂度的一般步骤:
- 分析问题规模n,找出基本语句,求出其运行次数f(n)
- 用三种渐进符号表示其阶
-
-
三种渐进符号
- 大O符号
- f(n)=O(g(n)),读作“f(n)是g(n)的大O”。当且仅当存在正常量c和n0,使当n≥n0时,f(n)≤cg(n),即g(n)为f(n)的上界
- 用来描述增长率的上界;该上界的阶越低,结果就越有价值
- 紧凑上界/紧确上界
- 大W符号
- f(n)=W(g(n)),读作“f(n)是g(n)的大W”。当且仅当存在正常量c和n0,使当n≥n0时,f(n)≥cg(n),即g(n)为f(n)的下界
- 用来描述增长率的下界;该下界的阶越高,结果就越有价值
- 紧凑下界/紧确下界
- 大Q符号
- f(n)=Q(g(n)),读作“f(n)是g(n)的大Q”。当且仅当存在正常量c1、c2和n0,使当n≥n0时,c1g(n)≤f(n)≤c2g(n),即g(n)与f(n)的同阶
- 大O符号
-
算法的最好、最坏和平均情况
- 算法的平均情况:指用各种特定输入下的基本语句执行次数的带权平均值
- 算法的最好情况:指算法在所有输入I下所执行基本语句的最少次数
- 算法的最坏情况:指算法在所有输入I下所执行基本语句的最大次数
-
非递归算法的时间复杂度分析
- 关键是求出代表算法执行时间的表达式
- 通常是算法中基本语句的执行次数,是一个关于问题规模n的表达式,然后用渐进符号来表示这个表达式即得到算法的时间复杂度
- 例题见下:“4. 例题”
-
递归算法的时间复杂度分析
- 关键是根据递归过程建立递推关系式,然后求解这个递推关系式,得到一个表示算法执行时间的表达式,最后用渐进符号来表示这个表达式即得到算法的时间复杂度
- 例题见下:“4. 例题”
2.2 算法空间复杂度分析
- 一个算法的存储量包括形参所占空间和临时变量所占空间;在对算法进行存储空间分析时,只考察临时变量所占空间
- 三种表示空间复杂度的渐进符号与时间复杂度相同
- 算法空间复杂度的分析方法与前面介绍的时间复杂度分析方法相似
3. 算法设计工具STL(不做考察,简单了解)
STL主要由container(容器&#x