算法设计与分析
算法概述及复杂理论
问题
- 目标(比如找男女朋友的目标就是找个白雪公主)
- 约束条件(身高,颜值等)和解空间
- 可行解/最优解/近似解
- 问题实例和问题规模
1、可计算问题/不可计算问题
计算机研究可计算问题
2、困难问题(时间度量)
3、P、NP、NPC
算法的概念
解决问题的一个方法或过程,是一个由若干个算法指令组成的有穷序列。
算法的特点
1、输入和输出
2、确定性
3、可行性
4、有穷性
算法的描述
1、伪代码
2、流程图
3、自然语言的描述
算法的正确性
对任意一个输入,算法都能够得到一个正确的输出。
软件测试非常重要。
如果是实例一个一个的测试,因为问题的复杂度,实例可能很多很多。所以测试算法正确性的方法很重要。
- 循环不变量
与程序变量有关的一个语句,它在循环刚开始前,以及在循环的每个迭代执行后为真,特别是在循环结束后,任然为真。 - 插入排序的循环不变量
比如说在选取数组A中的最大值,算法为:
MAX=A[0],
for(int i=0;i<A.length;i++)
{
if(A[i]>MAX)
{
MAX=A[i];
}
}
每次循环中MAX都是A[0]-A[i]中的最大值,这就是循环不变量,总是为真。
- 利用循环不变量证明算法的正确性
寻找到循环不变量,即某个特征Lj,然后证明循环不变量为真Lj(j=1,2,3,4..n),然后利用类似数学归纳法的证明方法
1、初始步:在循环的迭代开始前,L1为真;
2、归纳步:如果在循环的第j个迭代前,Lj-1为真,则在循环的第j+i个迭代前,Lj为真;
3、终止步:当循环终止时,Ln为真。
插入排序算法的正确性证明
算法的效率
- 算法的效率指:求解已个问题所需要的时间和空间
- 时间资源和空间资源(时间资源比较重要)
- 计算模型(Turing机、以及RAM(随机存储器)等
- 算法时间资源的估计(算法执行基本运算的数目或者步数)
度量一个算法运行时间的三种方式:
- 最好时间复杂度
- 最坏时间复杂度
- 平均时间复杂度
最坏情形时任何规模的问题实例运行时间上的上界,没有更坏了。
算法效率的比较
插入排序与归并排序的比较
插入排序算法o(2n2) 归并排序算法o(50nlgn)
若同时对100万个数据进行比较
则插入排序算法需要时间比归并排序算法需要时间相差很多,即使是插入排序算法的配置好很多的时候,仍然比不上。所以算法很有必要研究!!
算法的时间复杂度取决于主要项;
算法的效率主要取决与算法本身。
问题的下界
问题下界:任何一种算法解决一个问题所需要的必须的最小运行时间。
如排序问题的时间下界为nlogn,时间复杂度为nlogn都是排序算法的最有算法。
最优算法指的不是某个实例的最优算法,而是平均的概念