目录
1.算法的定义
对特定问题求解方法和步骤的一种描述,它是指令的有限序列。其中每个指令表示一个或多个操作。
简而言之:算法就是解决问题的方法和步骤
2.算法的描述
- 自然语言:英语、中文
- 流程图:传统流程图、NS流程图
- 伪代码(类语言):类C语言
- 程序代码:C语言程序、Java语言程序…
传统流程图
NS流程图
3.算法与程序
算法是解决问题的一种方法或一个过程,考虑如何将输入转换成输出,一个问题可以有多种算法。
程序是用某种程序设计语言对算法的具体实现。
程序 = 数据结构 + 算法 (重点)
数据结构通过算法实现操作
算法根据数据结构设计程序
4.算法的五个重要特性 (重点)
- 有穷性:一个算法必须总是在执行有穷性步之后结束,且每一步都在有穷时间内完成
- 确定性:算法中的每一条指令必须有确切的含义,没有二义性,在任何条件下,只有唯一的一条执行路径,即对于相同的输入只能得到相同的输出。
- 可行性:算法是可执行的,算法描述的操作可以通过已经实现的基本操作执行有限次来实现
- 输入:一个算法有零个或多个输入
- 输出:一个算法有一个或多个输出
5.算法设计的要求 (重点)
- 正确性
- 可读性
- 健壮性
- 高效性
6.判断一个好坏的方法
一个好的算法首先要具备正确性,然后是健壮性,可读性,在几个方面都满足的情况下,主要考虑算法的效率,通过算法的效率高低来判断不同算法的优劣程度。
算法效率从以下两个方面考虑:
1. 时间效率:指的是算法所消耗的时间;
2.空间效率:指的是算法执行过程中所消耗的存储空间。
时间效率和空间效率有时候是矛盾的
7.算法时间效率的度量
算法时间效率可以用依据该算法编制的程序在计算机上执行所消耗的时间来度量。
两种度量发放:
-
事后统计
将算法实现,测算其时间和空间开销。 -
事前分析 (重点)
对算法所消耗资源的一种估算方法。
7.1事前分析法 (重点)
一个算法的运行时间是指一个算法在计算机上运行所消耗的时间大致可以等于计算机执行一种简单的操作(如赋值、比较、移动)等所需要的时间与算法中进行的简单操作次数的乘积。
算法运行时间 = 一个简单操作所需的时间 x 简单操作次数
算法运行时间 = ∑ 每条语句频度 × 该语句执行一次所需的时间 \sum 每条语句频度 × 该语句执行一次所需的时间 ∑每条语句频度×该语句执行一次所需的时间
每条语句执行一次所需的时间,一般是随集齐而异的,取决于集齐的指令性能、速度以及编译的代码质量。
我们可以假设执行每条语句所需的时间均为单位时间,则算法运行时间即该算法中所有语句的执行次数,即频度之和。
/* 两个n×n矩阵相乘的算法 */
for(i=1;i<=n;i++){ //执行n+1次
for(j=1;j<=n;j++){ //执行n(n+1)次
c[i][j]=0; //执行n*n次
for(k=0;k<n;k++){ //执行n*n*(n+1)次
c[i][j]=c[i][j] +a[i][j] *b[k][j]
}
}
}
// T(n) = 2n^3 +3n^2 +2n +1
我们把算法所耗费的时间T(n)
定义为该算法中每条语句的频度之和。
7.2时间复杂度 (重点)
若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n) / f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n) = O(f(n)),称O(f(n))为算法的渐进时间复杂度(O是数量级的符号),简称时间复杂度。
一般情况下,不必计算所有操作的执行次数,而只考虑算法中基本操作执行的次数,它是问题规模n的某个函数,用T(n)表示。
算法中基本语句重复执行的次数是问题规模n的某个函数f(n),算法的时间量度T(n) = O(f(n))
它表示随着n的增大,算法执行的时间的增长率和f(n)的增长率相同,称渐进时间复杂度
算法中基本语句重复执行的次数是问题规模n的某个函数f(n),算法的时间量度记作:T(n) = O(f(n))
基本语句重复执行的次数和算法的执行时间成正比的语句
对算法运行时间的贡献最大
执行次数最多
n越大算法的执行时间越长
排序:n为记录数
矩阵:m为矩阵的阶数
多项式:n为多项式的项数
集合:n为元素的个数
树:n为树的结点个数
图:n为图的顶点数或边数
8.分析算法时间复杂度的基本方法 (重点)
- 找出语句频度最大的那条语句作为基本语句
- 计算基本语句的频度得到问题规模n的某个函数f(n)
- 取其数量级用符号“O”表示
时间复杂度是由嵌套最深层语句的频度决定的
9.算法时间复杂度计算
有的情况下,算法中基本操作重复执行的次数还随问题的输入数据集不同而不同
9.1最坏时间复杂度
指在最坏情况下,算法的时间复杂度
9.2平均时间复杂度
指在所有可能输入实例在等概率出现的情况下,算法的期望运行时间。
9.3最好时间复杂度
指在最好的情况下,算法的时间复杂度
一般总是考虑在最坏的情况下的时间复杂度,以保证算法的运行时间不会比它更长。
对于复杂的算法,可以将它分成几个容易估算的部分,然后利用大O加法法则和乘法法则,计算算法的时间复杂度。
(1)加法法则
求两个里面的最大值
(2)乘法法则
两个值直接相乘