《计算机算法设计与分析》习题及答案 联系客服

发布时间 : 星期日 文章《计算机算法设计与分析》习题及答案更新完毕开始阅读1a901974185f312b3169a45177232f60dccce77e

51. 常见的两种分支限界法为(D)

A. 广度优先分支限界法与深度优先分支限界法;

B. 队列式(FIFO)分支限界法与堆栈式分支限界法; C. 排列树法与子集树法;

D. 队列式(FIFO)分支限界法与优先队列式分支限界法; 二、填空题

1.算法的复杂性有 时间 复杂性和 空间 复杂性之分。 2、程序是 算法 用某种程序设计语言的具体实现。

3、算法的“确定性”指的是组成算法的每条 指令 是清晰的,无歧义的。 4. 矩阵连乘问题的算法可由 动态规划 设计实现。 5、算法是指解决问题的 一种方法 或 一个过程 。

6、从分治法的一般设计模式可以看出,用它设计出的程序一般是 递归算法 。 7、问题的 最优子结构性质 是该问题可用动态规划算法或贪心算法求解的关键特征。 8、以深度优先方式系统搜索问题解的算法称为 回溯法 。

9、计算一个算法时间复杂度通常可以计算 循环次数 、 基本操作的频率 或计算步。 10、解决0/1背包问题可以使用动态规划、回溯法和分支限界法,其中不需要排序的是 动态规划 ,需要排序的是 回溯法 ,分支限界法 。

11、使用回溯法进行状态空间树裁剪分支时一般有两个标准:约束条件和目标函数的界,N皇后问题和0/1背包问题正好是两种不同的类型,其中同时使用约束条件和目标函数的界进行裁剪的是 0/1背包问题 ,只使用约束条件进行裁剪的是 N皇后问题 。

12、 贪心选择性质 是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。

13、矩阵连乘问题的算法可由 动态规划 设计实现。

14.贪心算法的基本要素是 贪心选择 性质和 最优子结构 性质 。 15. 动态规划算法的基本思想是将待求解问题分解成若干 子问题 ,先求解 子问题 ,然后从这些 子问题 的解得到原问题的解。

16.算法是由若干条指令组成的有穷序列,且要满足输入、 输出 、确定性和 有限性 四条性质。

17、大整数乘积算法是用 分治法 来设计的。

18、以广度优先或以最小耗费方式搜索问题解的算法称为 分支限界法 。 19、 贪心选择性质 是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。

20.快速排序算法是基于 分治策略 的一种排序算法。

21.动态规划算法的两个基本要素是. 最优子结构 性质和 重叠子问题 性质 。 22.回溯法是一种既带有 系统性 又带有 跳跃性 的搜索算法。

23.分支限界法主要有 队列式(FIFO) 分支限界法和 优先队列式 分支限界法。 24.分支限界法是一种既带有 系统性 又带有 跳跃性 的搜索算法。 25.回溯法搜索解空间树时,常用的两种剪枝函数为 约束函数 和 限界函数 。 26.任何可用计算机求解的问题所需的时间都与其 规模 有关。 27.快速排序算法的性能取决于 划分的对称性 。

28.所谓贪心选择性质是指 所求问题的整体最优解可以通过一系列局部最优的选择,

即贪心选择来达到 。

29.所谓最优子结构性质是指 问题的最优解包含了其子问题的最优解 。 30.回溯法是指 具有限界函数的深度优先生成法 。

31.用回溯法解题的一个显著特征是在搜索过程中动态产生问题的解空间。在任何时刻,算法只保存从根结点到当前扩展结点的路径。如果解空间树中从根结点到叶结点的最长路径的长度为h(n),则回溯法所需的计算空间通常为 O(h(n)) )。

32.回溯法的算法框架按照问题的解空间一般分为 子集树 算法框架与 排列树 算法框架。

33.用回溯法解0/1背包问题时,该问题的解空间结构为 子集树 结构。

34.用回溯法解批处理作业调度问题时,该问题的解空间结构为 排列树 结构。 35.旅行售货员问题的解空间树是 排列树 。

三、算法填空

1.背包问题的贪心算法

void Knapsack(int n,float M,float v[],float w[],float x[])

{//重量为w[1..n]],价值为v[1..n]的 n个物品,装入容量为M的背包 //用贪心算法求最优解向量x[1..n] int i; Sort(n,v,w);

for (i=1;i<=n;i++) x[i]=0; float c=M;

for (i=1;i<=n;i++) {if (w[i]>c) break; x[i]=1; c-=w[i]; }

if (i<=n) x[i]=c/w[i];

}

2.最大子段和: 动态规划算法 int MaxSum(int n, int a[]) {

int sum=0, b=0; //sum存储当前最大的b[j], b存储b[j] for (int j=1; j<=n; j++) { if (b>0) b+= a[j] ;

else b=a[i]; ; //一旦某个区段和为负,则从下一个位置累和

if(b>sum) sum=b;

}

return sum;

}

3.贪心算法求活动安排问题 template

void GreedySelector(int n, Type s[], Type f[], bool A[]) {

A[1]=true; int j=1;

for (int i=2;i<=n;i++) if (s[i]>=f[j])

{ A[i]=true; j=i; }

else A[i]=false;

}

4.快速排序

template

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); //对右半段排序 }

}

5. 回溯法解迷宫问题

迷宫用二维数组存储,用'H'表示墙,'O'表示通道 int x1,y1,success=0; //出口点 void MazePath(int x,int y)

{//递归求解:求迷宫maze从入口(x,y)到出口(x1,y1)的一条路径 maze[x][y]='*'; //路径置为* if ((x==x1)&&(y==y1)) success=1; //到出口则成功 else

{if (maze[x][y+1]=='O') MazePath(x,++y); //东邻方格是通路,向东尝试

if ((!success)&&(maze[x+1][y]=='O')) MazePath(++x,y); //不成功且南邻方格是通路,向南尝试

if ((!success)&&(maze[x][y-1]=='O')) MazePath(x,--y); //不成功且西邻方格是通路,向西尝试

if ((!success)&&(maze[x-1][y]=='O')) MazePath(--x,y); //不成功且北邻方格是通路,向北尝试 }

if (!success) maze[x][y]='@'; //死胡同置为@ } 四、算法设计题

1. 给定已按升序排好序的n个元素a[0:n-1],现要在这n个元素中找出一特定元素x,返回其在数组中的位置,如果未找到返回-1。

写出二分搜索的算法,并分析其时间复杂度。

template

int BinarySearch(Type a[], const Type& x, int n)

{//在a[0:n]中搜索x,找到x时返回其在数组中的位置,否则返回-1 Int left=0; int right=n-1; While (left<=right)

{int middle=(left+right)/2;

if (x==a[middle]) return middle; if (x>a[middle]) left=middle+1; else right=middle-1; }

Return -1;

}

时间复杂性为O(logn)

2. 利用分治算法写出合并排序的算法,并分析其时间复杂度 void MergeSort(Type a[], int left, int right) {

if (left

merge(a, b, left, i, right); //合并到数组b copy(a, b, left, right); //复制回数组a } }

算法在最坏情况下的时间复杂度为O(nlogn)。 3.N皇后回溯法

bool Queen::Place(int k) { //检查x[k]位置是否合法 for (int j=1;j

if ((abs(k-j)==abs(x[j]-x[k]))||(x[j]==x[k])) return false; return true;

}

void Queen::Backtrack(int t) {

if (t>n) sum++;

else for (int i=1;i<=n;i++) {x[t]=i;

if ( 约束函数 ) Backtrack(t+1); }

}

4.最大团问题

void Clique::Backtrack(int i) // 计算最大团 { if (i > n) { // 到达叶结点