算法分析与设计复习
一、基本概念:
1.算法概念:
2.算法基本性质:
3.时间复杂度:
4.分治法:
5.动态规划:
6.贪心算法:
7.回溯法:
8.剪枝函数
9.分支限界法:
二、计算、画图
1.L型牌
2.最长公共子序列
3.0-1背包
4.活动安排问题
5.最优二叉树
6.最大完全子图
三、算法
——————————————————————————————————————————————————————
概念
1.算法是指解决问题的一种方法或一个过程。是有限条指令的序列,这个指令序列确定了解决某个问的运算或操作的步骤。
2.算法是若干指令的有穷序列,满足性质:
(1)输入:有外部提供的量作为算法的输入。
(2)输出:算法产生至少一个量作为输出。
(3)确定性:组成算法的每条指令是清晰,无歧义的。
(4)有限性:算法中每条指令的执行次数是有限的,执行每条指令的时间也是有限的。
3.算法的时间复杂度:针对问题指定基本运算,计数算法所做的基本运算次数
4.1.分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。
4.2.分治法所能解决的问题一般具有以下几个特征:
问题规模缩小到一定的程度就可以容易地解决;
该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质;
利用分解出的子问题的解可合并为该问题的解;
该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。
4.3.分治法的基本步骤(伪码描述)
divide-and-conquer(P)
{
if ( | P | <= n0) adhoc(P); // n0为一阈值,表示当问题P的规模不超过n0时,问题已容易直接解出,不必再继续分解。adhoc(P)为基本子算法。
divide P into smaller sub-instances P1,P2,...,Pk;//分解
for (i=1;i<=k;i++)
yi=divide-and-conquer(Pi); //递归求解子问题
return merge(y1,...,yk); //合并子问题解为原问题解
}
5.1.动态规划基本思想:将待求解的问题分解成若干个子问题,并存储子问题的解以避免计算重复的子问题,然后自底向上地由子问题的解得到原问题的解。
5.2.基本步骤
分析最优解的结构;
递归的定义最优值;
自底向上的计算出最优值;
根据计算最优值时得到的信息,构造最优解。
6.1.贪心算法:贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。
6.2.用贪心算法解背包问题的基本步骤
首先计算每种物品单位重量的价值vi /wi;
依贪心选择策略,直到背包装满为止。
7.1.回溯法:基本做法是搜索,或是一种组织得井井有条的、能避免不必要搜索的穷举式搜索法。
回溯法在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间树。
算法搜索至解空间树的任意一点时,先判断该结点是否包含问题的解
7.2.回溯法的基本步骤
(1)针对所给问题,定义问题的解空间;
(2)确定易于搜索的解空间结构;
(3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。
7.3.具有剪枝函数的深度优先生成法称为回溯法。
8.1.常用剪枝函数
用约束函数在扩展结点处剪去不满足约束的子树;
用限界函数剪去得不到最优解的子树。
9.1.类似于回溯法,分支限界法也是一种在问题的解空间树T上搜索问题解的算法。
9.2.分支限界法与回溯法区别
(1)求解目标:回溯法的求解目标是找出解空间树中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出在某种意义下的最优解。
(2)搜索方式:回溯法以深度优先的方式搜索解空间树,而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树。
采用广度优先搜索策略的目的是: 尽早发现剪枝点.
9.3.常见的两种分支限界法
(1)队列式(FIFO)分支限界法
将活结点表组织成一个队列,按照先进先出(FIFO)原则选取下一个结点为扩展结
(2)优先队列式分支限界法
将活结点表组织成一个优先队列,按照规定的优先级选取优先级最高的结点成为当前扩展结点。