第二节:算法
时间复杂度和空间复杂度
算法(Algorithm):是对特定问题求解方法(步骤)的一种描述,是指令的有限序列,其中每一条指令表示一个或多个操作。
算法可以有三种表示形式:
- 伪代码
- 自然语言
- 流程图
算法的五个特性
① 有穷性: 一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。
② 确定性:算法中每一条指令必须有确切的含义。不存在二义性。且算法只有一个入口和一个出口。
③ 可行性: 一个算法是能行的。即算法描述的操作都可以通过已经实现的基本运算执行有限次来实现。
④ 输入: 一个算法有零个或多个输入,这些输入取自于某个特定的对象集合。
⑤ 输出: 一个算法有一个或多个输出,这些输出是同输入有着某些特定关系的量。
算法和程序是两个不同的概念。
一个计算机程序是对一个算法使用某种程序设计语言的具体实 现。算法必须可终止意味着不是所有的计算机程序都是算法。
好算法标准
① 正确性: 算法应满足具体问题的需求。
② 可读性: 算法应容易供人阅读和交流。可读性好的算法有助于对算法的
理解和修改。
③ 健壮性: 算法应具有容错处理。当输入非法或错误数据时,算法应能
适当地作出反应或进行处理,而不会产生莫名其妙的输出结果。
④ 通用性: 算法应具有一般性 ,即算法的处理结果对于一般的数据集合
都成立。
⑤ 效率与存储量需求: 效率指的是算法执行的时间;存储量需求指算法
执行过程中所需要的最大存储空间。一般地,这两者与问题的规模有关。
♥效率 指的是算法执行的时间存储量需求指算法执行过程中所需要的最大存储空间
算法效率的度量
算法执行时间需通过依据该算法编制的程序在计算机上运行所消耗的时间来度量。
其方法通常有两种:
事后统计:计算机内部进行执行时间和实际占用空间的统计。
问题:必须先运行依据算法编制的程序;依赖软硬件环境,容易掩盖 算法本身的优劣;没有实际价值。
算法效率的度量
撇开软硬件等有关部门因素,可以认为一个特定算法“运行工作量”的大小,只依赖于问题的规模(通常用n表示),表示成是问题规模的函数。
算法效率的度量
表示时间复杂度的阶有:
O(1) :常量时间阶 O (n):线性时间阶
O(㏒n) :对数时间阶 O(n㏒n) :线性对数时间阶
O (nk): k≥2 ,k次方时间阶
其关系为:
O(1)<O(㏒n)<O(n)<O(n㏒n)<O(n2)<O(n3)
指数时间的关系为:
O(2 n )<O(n!)<O(n n )
⭐常量阶
{++x; s=0 ;}
将x自增看成是基本操作,则语句频度为1,时间复杂度为O(1) 。
将s=0也看成是基本操作,则语句频度为2,时间复杂度仍为O(1)。
⭐ 线性阶
for(i=1; i<=n; ++i) {
++x;
s+=x ;
}
语句频度为:2n,其时间复杂度为:O(n) ,即为线性阶。
⭐ 平方阶
for(i=1; i<=n; ++i){
for(j=1; j<=n; ++j) {
++x;
s+=x ;
}
}
语句频度为:2n2 ,其时间复杂度为:O(n2) ,即为平方阶。
⭐ 三次方阶
两个n阶方阵的乘法
for(i=1,i<=n; ++i)
for(j=1; j<=n; ++j) {
c[i][j]=0 ;
for(k=1; k<=n; ++k)
c[i][j]+=a[i][k]*b[k][j] ;
}
由于是一个三重循环,每个循环从1到n,则总次数为: n×n×n=n3 时
间复杂度为T(n)=O(n3)
小结:
空间复杂度的度量
空间复杂度(Space complexity) :是指算法编写成程序后, 在计算机中运行时所需存储空间大小的度量。记作: S(n)=O(f(n)) 其中: n为问题的规模(或大小)
空间复杂度的度量
for(i=1; i<=n; ++i)
for(j=1; j<=n; ++j)
{ ++x; s+=x ; }
临时变量为:i , j ,s,x;空间复杂度为:O(1) ,即常量阶。
复习考研数据结构第二天!!!