第2章-算法的分析基础
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.1 算法复杂度
好算法的4个重要特征: Correctness——正确性 Simplicity, clarity——简明性 Amount of time/space used——效率
执行算法所需的时间和存储空间
算法设计者常常需要在算法的简明性和 效率之间作出谨慎的选择
2.1 算法复杂度
通过程序步来分析算法的时间复杂度
求数组元素累加之和的迭代程序: (P20 程序2-1) float Sum(float list[],const int n) { float tempsum=0.0; //1 for (int i=0;i<n;i++) //n+1 { tempsum+=list[i]; //n } return tempsum; //1 } 程序总步数为:2n+3 求数组元素累加之和的递归程序: (P21 程序2-2) float RSum(float list[],const int n) { if (n) //1 { return RSum(list,n-1)+list[n-1]; //1 } return 0; //1 }
正确性和健壮性互相补充。 程序可靠性——在正常情况下能正确地工作,在异常情况下也能做出适当处理。
2.1 算法复杂度
好算法的4个重要特征: Correctness——正确性 Simplicity, clarity——简明性
思路清晰、层次分明、 容易理解、利于编码和 调试。
遗憾的是,简单的算法不一定高效
南京邮电大学 计算机学院计科系
第2章 算法分析基础
柯昌博 日期:2015-2-6
2018/12/1
1
2.1 算法复杂度
好算法的4个重要特征: Correctness——正确性
注意区分“正确性”和“健壮性”的概念: 算法正确性——在合法的输入下,算法应实现预先规定的功能和计算精度要求。
程序健壮性——当输入不合法的数据时,程序应能做适当处理而不至于引起严重后果。
2 n0 T ( n) T (n 1) 2 n 0
程序总步数为:2n+2
但递归调用引起的循环计算和使用for语句的循环计算所需的开销是不同的。递归需要耗 费更多的时间和空间资源。
可见:程序步数并不能确切反映程序运行的实际时间。
程序步的精确计算是困难的,且程序步并不能确切反映程序运行的实际
——运行一个算法所需的时间和空间资源的量。
How to Measure? •Machine independent •Language independent •Programming style independent •Implementation independent
算法的时间复杂性(Time Complexity)——T(n) 算法的空间复杂性(Space Complexity)——S(n)
2.2 渐近表示法
时间。
因此引入渐近时间复杂度,使用程序步在数量级上估计一个算法的执行时 间,从而实现算法的事前分析。
在数学上,算法的渐近复杂度t(n)是T(n) 的渐近表达式,是T(n)略去低阶
项留下的主项,它比T(n) 简单。 例如: T(n)=3n2+4nlogn+7 与t(n)= 3n2
那么在算法 分析中呢?
当n→∞时,有(T(n)-t(n))/T(n) →0。
渐近上界(低界函数集合)
证明 见P22 (定理2-1) 如果f(n)=amnm+am-1nm-1+…+a1n+a0是m 次多项式,且am>0,则f(n)=O(nm)。
可以通过考察一个程序中关键操作(key operation) 的执行次数,来估算算法的渐近时间复杂度。
其中n是问题的规模(输入大小)
算法复杂度
算法的时间复杂度
算法的时间复杂度——算法运行所需的时间 最好、最坏和平均时间复杂度
(不考虑计算机因素对算法分析的影响) 最好情况(出现概率较大时分析) 最差情况(实时系统) 平均情况(已知输入数据是如何分布的,通常 假设等概率分布)
算法的时间复杂度
(1)最好情况下的时间复杂性: B(n) = Tmin(n) = min{ T(n,I) | I∈Dn } (2)最坏情况下的时间复杂性: W(n) = Tmax(n) = max{ T(n,I) | I∈Dn }
(3)平均情况下的时间复杂性:
A(n) = Tavg(n) =
IDn
p(I)T(n,I)
例如:程序2-1 float Sum(float list[],const int n) { float tempsum=0.0; //1 for (int i=0;i<n;i++) //n+1 { tempsum+=list[i]; //n } return tempsum; //1 }
好算法的4个重要特征: Correctness——正确性 Simplicity, clarity——简明性 Amount of time/space used——效率 Optimality——最优性
算法执行时间达到求解该类问题所 需时间的下界。
与所求解问题自身的复杂程度有关。
例如:FindMax(int L[]) //求n个元素中的最大元素 { int max=L[0]; int i=1; 最优算法 while(i<n) { if (max<L[i]) max=L[i]; i=i+1; } }
又如: 可证排序问题的时间复杂度下界为(nlogn)。 则最坏时间复杂性为O(nlogn)的排序算法是最优算法。 因此:堆排序算法和两路合并排序算法都是最优算法。
影响程序运行时间的因素
程序所依赖的算法
问题规模和输入数据
根本的、起决定作用的
输入、输出
数值大小和状态
计算机系统性能
硬件系统性能(CPU速度)和软件系统性能(操作系统、编译器)
I:问题规模为n的实例。Dn :规模为n的所有合法输入的集合。 p(I):实例I出现的概率。
算法的空间复杂度
算法的空间复杂度 ——算法运行所需的存储空间
固定空间需求 与所处理数据的大小和个数无关,即与问题实例的 特征无关。 (包括:程序代码、常量、简单变量、定长成分的结 构变量所占的空间) 可变空间需求 与算法执行过程中处理的特定数据的规模有关。 (如:数据元素所占的空间,算法执行所需的额外空 间—如递归算法所需系统栈空间)