演算法此基础
1.1 演算法简述
1.甚么是演算法?
演算法(algorithm):演算法是对某一难题解关键性步骤的叙述,是命令的非常有限字符串。是表述较好的排序操作过程,他取两个或几组的值为输入,并造成出两个或几组值做为输入。简单而言演算法是一连串的排序关键性步骤,用以将输入统计数据切换成输入结论。
2.演算法的四个特点
输入:演算法有开始符号或数个Eygurande;
输入:演算法最少造成两个Eygurande;
估值合理:演算法的每两条命令都有确凿的表述,没坦谢;
可行性研究:演算法的每两条命令要足够多基本上,它能透过早已同时实现的基本上演算继续执行非常有限Ins13zD同时实现;
有穷性:演算法要继续执行非常有限步后中止。
3.难题和难题解
难题解:找寻一类方式来同时西凯努瓦县。
难题解操作过程:现代人透过采用难题应用领域科学知识来认知和表述难题,并凭借着另一方面的实战经验和科学知识求优先选择和采用适度的难题解思路、控制技术和辅助工具,将两个难题叙述切换成难题解的操作过程。
排序机解难题的关键性众所周知是找寻一类难题解思路获得解难题的演算法,进而获得难题的解。
4.难题解操作过程
认知难题
结构设计图
同时实现计划
回顾复查
1.2 演算法预测
1.演算法难题解操作过程
2.演算法分类
精确演算法总能保证求得难题的解。
启发式演算法透过采用某种规则、简化或智能猜测来减少难题解时间。
对于最优化难题,两个演算法如果致力于找寻近似解而不是最优解,被称为近似演算法。
如果在演算法中需要做出某些随机优先选择,则称为随机演算法。
3.演算法结构设计
排序机的难题解思路主要指演算法结构设计思路。
如果所求难题符合某种演算法结构设计策略处理难题的特性,就可采用该演算法结构设计思路结构设计演算法、解难题。
4.演算法表示
演算法叙述方式
自然语言
流程图
伪代码
程序结构设计语言
采用c/c++语言叙述
5.演算法确认
演算法确认:确认两个演算法是否正确的活动。
演算法证明:使用数学方式证明演算法的正确性。
程序测试:是指对程序模块或程序总体,输入事先准备好的样本统计数据(称为测试用例),检查该程序的输入,来发现程序存在的错误及判定程序是否满足其结构设计要求和活动。
6.演算法预测
演算法预测:对演算法的继续执行时间和所需空间的估量。(时间复杂度和空间复杂度)
程序的性能测量:采用样本统计数据,实际测量两个程序所消耗的时间和空间。
1.3 演算法复杂度
1.甚么是好的演算法
两个好的演算法应具备以下4个重要特性:
正确性:演算法的继续执行结论应当满足预先规定的功能和性能要求。
简明性:演算法要思路清晰、层次分明、容易认知、利于编码和调试。
高效性:演算法要有效采用存储空间,并具有高的时间效率。
最优性:演算法的继续执行时间已达到解该类难题所需时间的下界。
程序健壮性:是指当输入不合法统计数据时,程序能做适度处理而不至于引起严重后果。 其含义是:当程序万一遇到意外时,能按某种预定方式作出适度处理。
正确性和健壮性是相互补充的。
2.影响程序时间的因素
影响程序运行时间的因素主要有:
程序所依赖的演算法;
难题规模和输入统计数据;
排序机系统性能
3.演算法的时间复杂度
抽象机模型
设抽象机提供由m个基本上演算组成的演算集O={O1,O2,…,Om},每个运算都是元演算,(演算亦称演算,数学的基本上概念众所周知,指使的一些排序规则,算术中有加、减、乘、除、乘方、开方六种演算,其中加、减、乘、除是从两个已知数得出第三个数的演算,称为二元演算;乘方、开方是从两个已知数得出另两个数的演算,称为一元演算)。 它的继续执行时间是非常有限常量。设继续执行第i个演算Oi所需的时间是αi,1≤i≤m。
两个演算法给定两个输入并在抽象机上继续执行一次,该继续执行操作过程表现为继续执行两个基本上演算字符串。
时间复杂度
演算法的时间复杂度是指演算法运行所需的时间。
设有两个在抽象机上运行的演算法A,I是某次运行时的输入统计数据,其规模为n,则演算法A的运行时间T是n和I的函数,记做T(n,I)。又设在该次演算中抽象机的第i个基本上演算Oi的继续执行次数为βi,1≤i≤m。βi也是n和I的函数,记做βi(n,I)。那么演算法A在输入为I时的运行时间是:
最好、最坏和平均时间复杂度:
最好时间复杂度
最坏时间复杂度
平均时间复杂度(与概率论中的数学期望概念类似,在概率论和统计学中,期望值(或数学期望、或均值,亦简称期望,物理学中称为期待值)是指在两个离散性随机变量试验中每次可能结论的概率乘以其结论的总和。换句话说,期望值是随机试验在同样的机会下重复多次的结论排序出的等同“期望”的平均值。 )
4.演算法预测
事前预测:在演算法实际运行前预测演算法的效率。
事后测试:运行程序来测试两个程序在所输入统计数据下实际运行的时间。
程序步:在语法或语义上有意义的程序段,该程序段的继续执行时间要与难题实例的规模无关。
实例
5.演算法的空间复杂度
演算法的空间复杂度:演算法运行所需的存储空间。
程序运行所需的存储空间包括以下两个部分:
固定空间需求:这部分空间与所处理统计数据的大小和个数无关,即与难题实例的特点无关。
可变空间需求:这部分空间大小与演算法在某次继续执行中处理的某一统计数据的规模有关。
1.4 渐近表示法
1.大O记号
表述:设函数f(n)和g(n)是表述在非负整数集合上的正函数,如果存在两个正常数c和n0,使得当n≥n0时,有f(n)≤cg(n),则记做f(n)=O(g(n)),称为大O记号。
意义:该演算法的运行时间 不会超过 g(n)的某个常数倍。 g(n)是该演算法运行时间的上界。
渐进时间复杂度
采用大O记号及下面表述的几种渐近表示法表示的演算法时间复杂度,称为演算法的渐近时间复杂度。
只要适度优先选择关键性操作,演算法的渐近时间复杂度能由关键性操作的继续执行次数之和来排序。一般地,关键性操作的继续执行次数与难题的规模有关,是n的函数。
2.Ω 记号
表述:设有函数f(n)和g(n)是表述在非负整数集合上的正函数,如果存在两个正常数c和n0,使得当n≥n0时,有f(n)≥cg(n),则记做f(n)=Ω (g(n)),称为Ω记号。
意义:该演算法最少需要g(n)的某个常数倍大小的时间量。g(n)是该演算法运行时间的下界。
3.Θ记号
表述:设有函数f(n)和g(n)是表述在非负整数集合上的正函数,如果存在正常数c1,c2和n0,使得当n≥n0时,有c1g(n)≤f(n)≤c2g(n),则记做f(n)=Θ(g(n)),称为Θ记号。
意义:该演算法实际运行时间大约为g(n)的某个常数倍大小的时间量。(有上界也有下界)
例题1:
4.小o记号
表述:f(n)=o(g(n))当且仅当f(n)=O(g(n))且f(n)≠ Ω(g(n))
意义:该演算法的运行时间f(n)的阶比g(n)低。
5.演算法按时间复杂度分类
演算法按排序时间分类
渐近时间复杂度有多项式时间限界的演算法称做多项式时间演算法。
渐近时间复杂度为指数函数限界的演算法称做指数时间演算法。
最常见的多项式时间演算法的渐近时间复杂度
O(1)<O(log n)<O(n)<O(nlog n)<O(n2)<O(n3)
最常见的指数时间演算法的渐近时间复杂度
O(2n)<O(n!)<O(nn)