2019算法复习

发布 2020-01-28 16:10:28 阅读 2444

1、有0-1背包问题如下:

n=3,c=30,p=[45,25,25],w=[16,15,15]。

用队列式、优先队列式分支限界法求最优解。(画解空间树并详细描述求解过程)

解:队列式分支限界法:

a] b, c =>b, c

b, c] d, e =>e

c, e] f, g =>f, g

e, f, g] j, k =>k(45) [1,0,0]

f, g] l, m =>l(50) [0, 1, 1] m(25)

g] n, 0 =>n(25), o(0)

不搜索以不可行结点为根的子树。

优先队列式分支限界法:

a] b, c =>b(45), c(0)

b, c] d, e =>e(45)

e, c] j, k =>k(45) [1, 0, 0]

c] f, g =>f(25), g(0)

f, g] l, m =>l(50), 0, 1, 1] m(25)

g] n, o =>n(25), o(0)

可用剪枝函数加速搜索。

2、用队列式、优先队列式分支限界法求解如下图的四城市旅行商问题。(画解空间树并详细描述求解过程)

3、有0-1背包问题如下:

n=6,c=20,p=(11,8,15,18,12,6),w=(5,3,2,10,4,2)。

试分别画出用回溯法求解时的搜索情况。

4、用递归回溯算法求解四后问题。(写出c++算法描述的关键**、画出求得第一解时的搜索树)

5、用递归回溯算法求解图的m着色问题。(写出c++算法描述的关键**)

1、 贪心算法的基本要素?动态规划算法的基本要素?贪心算法的基本要素:贪心选择性质和最优子结构性质。动态规划的基本要素:最优子结构性质和子问题重叠性质。

2、 比较动态规划法、分治法和贪心法之间的异同。

动态规划法与分治法和贪心法类似,它们都是将问题实例归纳为更小的、相似的子问题,并通过求解子问题产生一个全局最优解。其中贪心法的当前选择可能要依赖已经作出的所有选择,但不依赖于有待于做出的选择和子问题。因此贪心法自顶向下,一步一步地作出贪心选择;而分治法中的各个子问题是独立的 (即不包含公共的子子问题),因此一旦递归地求出各子问题的解后,便可自下而上地将子问题的解合并成问题的解。

动态规划允许这些子问题不独立,(亦即各子问题可包含公共的子子问题)也允许其通过自身子问题的解作出选择,该方法对每一个子问题只解一次,并将结果保存起来,避免每次碰到时都要重复计算。

3、 贪心算法与动态规划算法的差异?

4、 分支限界法的基本思想及其分类? 队列式分支限界法、优先队列式分支限界法。

5、 什么是最优子结构性质?某个问题的最优解包含着其子问题的最优解。这种性质称为最优子结构性质。

6、 解释记号o(上界)、(下界)、(同阶)和(低阶)的意义。

5、分支限界法与回溯法的区别?191页。

6、动态规划算法的基本思想与基本要素?48页。

7、什么是算法, 算法具有的特性是什么?算法是指解决问题的一种方法或一个过程。性质:输入、输出、确定性、有限性。

8、制定一个算法一般要经历哪几个阶段?制定算法一般要经过设计、确认、分析、编码、检查、调试、计时等阶段。

9、什么是最优解?使目标函数取得极值(最大或最小)的解称为最优解。

程序填空题。

1、回溯法对解空间作深度优先搜索,因此,在一般情况下用递归方法实现回溯法。

void backtrack (int t)

if (t>n) _output(x)_;

elsefor (int i=f(n,t);i<=g(n,t);i++)

else if (c[i-1][j]>=c[i][j-1])

else

构造最长公共子序列。

void lcs(int i,int j,char *x,int **b)

if (i ==0 ||j==0) return;

if (_b[i][j]==1_)

return -1;//未找到x

4、递归算法求全排列问题。

void perm(int list,int k,int m)

elsefor(int i=k;i<=m;i++)

int t=list[k];list[k]=list[i];list[i]=t; /和首元素交换。

perm(list,k+1,m)__产生list[k+1:m]的所有排列。

t=list[k];list[k]=list[i];list[i]=t取消前面的交换。

5、递归算法求汉诺塔问题。

void move(char x, char y)

//将第n个圆盘从塔座x移到塔座y的顶部。

cout <

<< x <

void hanoi(int n, char x, char y, char z)

//将x上部的n个圆盘移到y上,顺序不变。

if (n>0)

6、快速排序。

void quicksort (type a,int p, int r)

if (p int q=partition(a,p,r);/分划操作。

quicksort (a,p,q-1); 对左半段排序。

quicksort (a,q+1,r); 对右半段排序。

int partition (type a,int p, int r)

int i = p, j = r + 1;

type x=a[p];

将< x的元素交换到左边区域。

将》 x的元素交换到右边区域。

while (true)

m[1][c]=m[2][c]; 第一行不计算,减少计算量。

if(c>=w[1])

m[1][c]=max(_m[1][c]_ m[2][c-w[1]]+v[1]_)

算法复习整理

1.计算题。2.使用分治算法找一组数的最大最小数。采用如下设计思想 1 将数据集 s 均分为 s1 和 s2 2 求解 s1 和 s2 中的最大和最小值 3 最终的最大和最小值可以计算得到 min s1,s2 max s1,s2 4 采用同样的处理方法递归处理 s1 和 s2。函数 a n,m 有 ...

算法设计复习

一 查找二叉树。1 什么是二分查找树?它是二叉树,具有左子树中的每个节点值都小于根节点值,右子树中的每个节点值都大于根节点值的性质。2 如何查找?1 将该值与根结点进行比较,2 若相等,则查找成功,结束查找 3 若小于,则对左子树进行查找操作,回到步骤 1 4 若大于,则对右子树进行查找操作,回到步...

算法初步复习

一 算法的定义 对一类问题的机械的 统一的求解方法称为算法。二 算法的特点 有限性 确定性。注 一般来说,算法有一个或多个输出。三 算法的描述方式 自然语言 流程图 程序设计语言 伪 四 自然语言描述中的典型例题 高斯消元法解线性方程组,即先将方程组化为一个三角形方程组,再通过回代过程求出方程组的解...