当前位置:文档之家› 时间复杂度文档

时间复杂度文档

一个算法执行时间,从理论上是不能算出来 和的算,法必执须行通时过间依相据关该的算因法素编:制的程序上机运 行1.测算试法才选能用知的道策。略有两种方法:事后统计的方 法2.和问事题前的分规析模估(算处的理方的法数据量) 3.编写程序的语言 4.编译程序产生机器代码的质量 5.计算机执行指令的速度
10
lim
n? ?
4n2
? 2n n2
?
1
2
1
4 ? n ? n2
4n2 ? 2n ? 1
lim
n? ?
n2
=4
当n->∞时,第二,三项的值趋于0, 当 n->∞时,f(n)与g(n)为同阶无穷大,或说 f(n)与g(n)成正比、所以这两个函数是同一 数量级的
13
计算下面交换 i和j内容程序段的时间复杂性。 temp=i; i=j; j=temp;
(4)
sum++; (n2次 )
解:T(n)=2n2+n+1 =O(n2)
15
时间复杂度 T(n) 的数量级表示:
O 是 Order 的首字母, f(n) 是 意T(为n)f的(n同)与数T(量n)级函数。
只差一个常数倍。 把 T(n) 表示成数量级的形式为:T(n)=O(f(n))。
称O(f(n)) 为算法 的渐近时间复杂度,简称时间
解:以上三条单个语句均执行1次,该程序 段的执行时间是一个与问题n无关的常数, 因此,算法的时间复杂度为常数阶,记作 T(n)=O(1).
14
计算下面求累加和程序段的时间复杂性
(1) sum=0;
(1次)
(2) for(i=1;i<=n;i++) (n次 )
(3) for(j=1;j<=n;j++) (n2次 )
1
§1.2.1算法的特性
1) 有穷性: 一个算法必须总是在执行有穷步之后结束, 且 每一步都在有穷时间内完成。
2) 确定性: 算法中每一条指令必须有确切的含义,无二义 性。并且,在任何条件下,算法同时只有唯一的一条执 行路径,即对于相同的输入只能得出相同的输出。
3) 可行性: 算法描述的所有操作都必须足够基本,都是可 以通过 已经实现的基本运算的有限次执行来实现的。
11
为便于计算 ,对这一时间复杂度大多采用一种近似的形式来描 述,即采用基本语句执行次数的数量级来表示时间复杂度。 数量级是这样定义的: 如果变量n的函数f(n)和g(n)满足:
lim f (n) ? k(k ? 0) n? ? g(n)
则称f(n)和g(n)是同一数量级的
12
设: f (n) ? 4n2 ? 2n ? 1 g (n ) ? n 2
优化后只运行了 2秒,相差 1500倍。 而且辅助空间占有也少 .
6
§1.2.2 算法描述
算法的描述方式(常用的):
自然语言
流程图 特定的表示算法的图形
算法描述
符号
类语言 类似高级语言 ,例如,类
PASCAL 、类C语言。
程序设计语言
7
例1-1用类C描述将三个数值排序的算法。
viod Three_Sort( int x,int y,int z)
算法在运行过程中临时占用的存储空间
若所需临时空间不随问题规模的大小而改变,则称此算法为 原地工作。
若所需存储量依赖于特定的输入,则通常按最坏情况考虑。
21

DS 算法
第一章小结
逻辑结构 存储结构 DS上的运算
算法定义、特性
线性结构 树型结构 网状结构
查询 插入 删除 更新 时间复杂度T(n)
算法分析
{//将x,y,z三个变量的内容按从小到大的顺序重新 排列
if (y<x&&y<z) x? y;
//如果y是最小, x和y交换
else if (z<x&&z<y) x? z;
//如果z是最小, x和z交换
if (z<y) y? z;
//比较y和z挑选出较小者换到y中
}
8
例1-2求两正整数m、n的最大公因子的算法如下百鸡问题 (公鸡3元一只,母鸡 2 元一只,小鸡 0。5元一只)
4
for (i=1,i<=100;i++) for (j=1,j<=100;j++) for (k=1,k<=100;k++) if ((i+j+k==100) && (3*i+2*j+0.5*k==100)) printf(“%d,%d,%d”,i,j,k)
1.2 算法描述
通俗地讲,算法就是一种解决的方法。 严格地讲算法是对特定问题求解步骤的一种描 述, 它是指令的有限序列,其中每一条指令表示一个 或多 个操作。 算法和数据结构的关系 为了充分地利用系统资源;既要效率高、速度快, 又要存储空间少。显然,这是矛盾的。 研究算法追求的目标是:时间和空间的适当和谐
n
19
§通常将称Ο(1)为常数阶,Ο(n)为线性阶,O(n2) 为平方阶。算法还可能呈现的复杂度有:对数 阶Ο(log2n),指数阶Ο(n3)等,不同数量级时间 复杂度的关系有:
§Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)< Ο(n3)
20
2 空间复杂度
空程间序复代杂码度本:身算所法占所空需间存对储不空同间算的法度通量常,不记会作有:数量级之差 别,因此在比较算S法(n时)=O可(以f(n不) 加) 考虑;算法的输入数据量和问 其题中规n模为有问关题,的若规输模入。数据所占空间只取决于问题本身,和算法 无关,则在比较算法时也算可法以本不身加的考存虑储;空由间此只需要分析除输 入和程序之外的额外空间。 一个算法所需存储空间 输入数据的存储空间
空间复杂度D(n)
顺序存储 链式存储 索引存储 散列存储
22
① 输入m和n;
② m/n(整除),余数 →r (0≤r≤n);
③ 若r=0,则当前 n=结果,输出 n,算法停止;否则, 转 ④;
④ n→m,r->n; 转②。
如初始输入 m=10,n=4, 则m,n,r 在算法中的变化如 下:
m
n
r
10 4
2
4
2
0( 停止)
即10和4 的最大公因子为 2。
9
§1.3 算法分析
1.时间复杂度
算法的执行时间如何计算?
n
? 原操作 i 的执行次数 ? 原操作 i 的执行时间
i?1
原操作(简单操作) :如赋值操作、转向操作、比较操 作等等 .既然执行一种原操作所需的时间与算法无关, 那么我们只讨论影响运行时间的另一个因素 ——算法中 进行原操作次数 。显然,在一个算法中,执行简单操作 的次数越少,则运行时间也越少.所以约定把算法中包 含简单操作的次数的多少叫做时间复杂度.
我们希望随着问题规模时间的增长复杂度是趋于稳定地上升,但
上升幅度不能太大
O(2n) O(n3)
T(n)
O(n*log2n)
1024
O(n2)
O(n)
512
256
128
64
32
O(c)
16
8
O(log2n)
4
2
1
0 11 22 44 8 8 1616323264 61428122856255612 n1024 图1-7 常见的T(n)随n变化的增长率
(1) X = X + 1 ; f(n) = 1
(2) for (i = 1; i < n; i + + ) X++;
(3)
for (i = 1; i < n; i + + )
for( j = 1; j <= i; j + + )
X + +;
n2 ? 3n
2
O( 1 )
O( n )
O( n 2)
18
用三层循环,内循环 100万次,在 某机器上运行用了 50分钟。
5
而经过分析,钢笔最多买 20支,圆珠笔 最多买33支,对算法进行修改 .
for (i=1,i<=20;i++) for (j=1,j<=33-i;j++) if (3*i+2*j+0.5*(100-i-j)==100) printf(“%d,%d,%d”,i,j,100-i-j)
i=0;
// 1 次
i<n;
//n次
s+=b[i];
//n次
i++;
//n次
return s;
// 1 次
则我们可以找到 f(n)=n,
lim T (n) ? 3n ? 2 ? 3
n? ? g(n)
n
所以 T(n)=O(n)
17
时间复杂度举例
若解决一个问题的规模为 n,则算法的时间复杂度 通常是n的一个函数,记为 f(n)
复杂度。
比如 f(n) =n2
那么T(n)=O(n2)
16
例:累加求和 int Sum(int b[n], int n) { int i, s=0 ; for(i=0; i<=n; i++) s+=b[i] ; return s ; }
时间复杂度为:T(n)=3n+2
for 循环语句所包含的原操作:
4) 输 入: 一个算法有零个或多个输入,这些输入取自于 某个特定的对象集合。它们可以使用输入语句由外部提 供, 也可以使用赋值语句在算法内给定。
相关主题