今天上完了学生生涯的最后一堂课。幸运的是,这堂课老师讲得不错,也是我喜欢的算法课,算是一个完美的句号。借此机会将一直以来想写的算法系列博客开个头。大抵按照刘老师所述结构,借各家之长加以我的理解来撰写。
算法概述
定义
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。
(百度百科)
算法就是求解某一特定问题的有穷规则集合
特征
确定性,每一个步骤必须有确切的定义
可行性,算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步骤,即每个计算步骤都可以在有限时间内完成
输入项,一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件
输出项,一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的
有穷性,算法必须在执行有限步骤后终止。
质量指标
时间复杂度 算法时间复杂度是问题规模 n 的函数f(n) ,一般记为,T(n)=Ο(f(n))。 问题的规模n 越大,算法执行的时间的增长率与f(n) 的增长率正相关,称作渐进时间复杂度
空间复杂度 算法需要消耗的内存空间
正确性
可读性
健壮性 一个算法对不合理数据输入的反应能力和处理能力,也称为容错性
算法复杂度
算法所需要的计算机资源 = 时间复杂度 + 空间复杂度
一般考虑三种情况下的时间性:最坏情况(Tmax(n)),最好情况(Tmin(n)),平均情况(Tavg(n))
渐进复杂性
对于问题规模 n 较大的情况,需要引入渐进符号来描述,
设算法执行时间为 T(n) ,若存在 T*(n) , 使得
就称T*(n) 为算法的渐进时间复杂性。
上界函数
若存在两个正常数c和n0 ,对于所有的 n >= n0 ,有 |f(n)| <= c|g(n)|,则记为 f(n) = O(g(n))。
说明,
- 对于规模 n 若算法所用时间总是小于|g(n)|的一个常数倍,则g(n) 就是 f(n)的一个上界函数,f(n) 的数量级就是g(n).
- f(n) 的增长最多像 g(n) 一样快
- 试图求最小的g(n),使得f(n)=O(g(n)),即 求最小上界函数。
算法分类
多项式时间算法:即 可用多项式对其计算时间界限的算法
指数时间算法:计算时间用指数函数限界的算法
计算时间函数的曲线如上图,可见当 n 曲较大值时指数时间算法和多项式时间算法的计算时间差别悬殊。
下界函数
类似上界函数,若存在两个常数c 和 n0 对于所有n >= n0, 有 |f(n)| >= c|g(n)|,则记为f(n) = Ω(g(n))。
说明,
- 对于规模 n 若算法所用时间总是不小于|g(n)|的一个常数倍,则g(n) 就是 f(n)的一个下界函数。
- f(n) 的增长至少像 g(n) 一样快
- 试图求最大的g(n),使得f(n)=O(g(n)),即 求最大下界函数。
平均情况界限函数
若存在正常数c1,c2,n0,对于所有n >= n0 ,有c1|g(n)| <= |f(n)| <= c2|g(n)|,则记
说明,
- 算法的最好、最坏情况计算时间对于c1,c2常数因子范围内而言是相同的,可以看作,既有f(n) = O(g(n)),又有f(n) = Ω(g(n))
表明算法运行时间有一个准确的界限
最优算法
问题的计算时间的下界Ω(f(n)),则时间复杂性O(f(n))是算法的最优算法。例,排序问题计算时间下界Ω(nlogn),则计算时间复杂性O(nlogn)为最优算法。