高级算法设计与分析期末复习

算法设计与分析复习题

  • 算法概述

算法分析题

  1. (T1-3)

  解答:

算法实现题

  1. (T1-1) 统计数字问题

  1. (T1-2) 字典问题

  1. (T1-5) 最大间隙问题

核心思想是:n个点,其中两个点作为左右边界。剩下n-2个点,在n-1个格子必定有一个为空。那么最大间隙就是空着的区间后面的最小值-空着的区间前面的最大值。不过由于可能会空在第一个或者最后一个区间处理起来不太方便。所以直接扫一遍区间记录上一次区间最大值和当前区间最小值的差更新答案(满足相邻).

算法步骤:

1、扫描,找出所有点的最大值和最小值;

2、划分区间,区间的长度为: len = ( Max - Min ) / ( n - 1 );

扫描二维码关注公众号,回复: 15489912 查看本文章

3、处理每一个区间:

a、求出每一个点对应在哪个区间,( a[i] - Min ) / ( len );

b、把每一个点都安放好对应的区间(Block)里面;

c、顺便统计区间里的个数,区间里的左右边界,即在区间里 的最大值和最小值。

4、扫描,找出左边区间的最大值,和当前区间最小值进行更新答案,同时更新最后一个右端点。

  • 递归与分治策略

算法分析题

  1. (T2-3) 

  1. (T2-5) 

  1. (T2-7) 

  1. (T2-10) 

  1. (T2-13) 

分析与解答将算法Partition中的不等号取反即可。

算法实现题

  1. (T2-1) 众数问题

思路:

首先排序,找到中位数,每次先求中位数众数,然后将数组从中位数(0-最左边的中位数和最右边的中位数到n)分开,在左边和右边各求中位数的重数然后比较,然后再分开在比较。这样一直分最后就成了一个数字的重数(分成的最小问题)。当左侧或者右侧某一侧或者两侧的数字个数小于中位数的重数的时候就可以不必向下接着进行分析。

  1. (T2-5) 有重复元素的排列问题

思路

① 以r1为开头,对剩下的元素进行全排列,并且把r1放到flag[]数组当中,表示r1已经做过开头了。

② 先判断flag[]数组中是否有元素r2,如果有则跳到③,否则把r2和r1进行交换(目的是让每一个元素都作为开头元素),对剩下的元素进行全排列(递归),然后再交换回来,并且把r2放进flag[]数组里。

③ 接下来依次对r3, r4, …, rn做类似于②的操作。

  • 动态规划

算法分析题

  1. (T3-3) 

  1. (T3-4) 

算法实现题

  1. (T3-1) 独立任务最优调度问题

 

  1. (T3-2) 最优批处理问题

 

  1. (T3-3) 石子合并问题

  • 利用 dp 数组存储最小的合并代价:第i个石堆到第j个石堆的最小合并代价为 dp[i][j]。
  • 只有一个石堆时,最小合并代价为0,设 dp[i][i] = 0 , i = 1.. N ;
  • 注意,为了表达方便:这里第i堆石子对应的下标就是i而非i-1;
  • 想一下最简单的合并情况:相邻两个石堆i和石堆i+1,它们合并代价是两个石堆石子数的总和,即dp[i][i+1] = stones[i] + stones[i+1];
  • 非相邻的两个石堆合并代价为dp[i][j] = dp[i][k] + dp[k+1][j]。
  • i->j的总代价:

圆形的处理方法:

  1. (T3-4) 数字三角形问题

  1. (T3-6) 租用游艇问题

 dp[i][j]表示从站i到站j的最少租金。可以列出表达式:
i=j   f[i][j]=0;只有一个站,租金0
i<j   f[i][j]=max(f[i][k]+f[k][j]) (i<=k<=j) 

  1. (T3-17) 字符串比较问题

  • 贪心算法

算法分析题

  1. (T4-2)

解答:不能。因为两艘船的装载问题,是先装完第一艘,再装第二艘,所以就必须把第一艘尽可能的装满,才能使总的装载量更多。如果使用贪心算法求解,第一艘船装载的方式只可能有一种最优解,就是装载的物品都是以从轻到重的顺序装载。举个例子,6个元素的数组{30,30,30,50,50,60},容量 C1=100,C2=150.箱子总重量为250,轮船的总容量也为250,按理说最优解应该是所有的箱子都能装上船,但如果使用贪心算法,会先把30,30,30装到第一艘船,就造成了,10个空间的浪费,最终会有一个箱子不能装上船。

  1. (T4-3)

  

  1. (T4-4)

算法实现题

  1. (T4-1) 会场安排问题

思路: 

  • 将开始时间和结束时间分别存为一个数组;
  • 然后进行升序排序;
  • 从第i个活动开始时间与第j个活动结束时间作比较:
  1. 如果开始时间大于等于结束时间,说明不用增加会场,第j个活动结束,j++;
  2. 如果开始时间小于结束时间,需要增加会场,ans++,第j个活动可以当还没结束,所以j不用动,直到遇到开始时间大于等于第j个活动结束时间。

算法时间复杂度:O(nlogn)

  1. (T4-2) 最优合并问题

  思想:贪心算法。最优策略:每次选择个数小的合并;最差策略: 每次选择序列个数多的合并

  1. (T4-5) 程序存储问题

  1. (T4-6) 最优服务次序问题

  1. (T4-7) 多处最优服务次序问题 

 思想:贪心算法,最短作业优先原则。先从小到大排序,轮流放在s个地方分别进行服务,分别计算s个地方的等待时间的总和,最后将s个地方的等待时间总和加起来,除以总任务数。

  1. (T4-9) 虚拟汽车加油问题

 思想:根据一个贪心选择性,每当到达一个加油站的时候,将距离相加,判断距离是否足够到下一个加油站。如果可以的话,接着前行;如果不行的话,在当前加油站加满油在出发,此时更新距离参数为当前站到下一站的距离。

  • 回溯法

算法分析题

  1. (T5-3)

  1. (T5-4)

 思路:首先设最大团为一个空团,往其中加入一个顶点,然后依次考虑每个顶点,查看该顶点加入团之后仍然构成一个团,如果可以,考虑将该顶点加入团或者舍弃两种情况;如果不行,直接舍弃,然后递归判断下一顶点。对于无连接或者直接舍弃两种情况,在递归前,可采用剪枝策略来避免无效搜索。

为了判断当前顶点加入团之后是否仍是一个团,只需要考虑该顶点和团中顶点是否都有连接。程序中采用了一个比较简单的剪枝策略,即如果剩余未考虑的顶点数加上团中顶点数不大于当前解的顶点数,可停止继续深度搜索,否则继续深度递归。

算法实现题

  1. (T5-1) 子集和问题

求解该问题需要搜索整个解空间树,设解向量x=(x1,x2,…,xn),本问题是求所有解,所以一旦搜索到叶子结点(即i=n+1),如果相应的子集和为W,则输出x解向量。搜索到第i(1<=i<=n)层的某个结点时用tw表示选取的整数和,rw表示余下的整数和,rw表示余下的整数和,rw=w[j] (j从i+1到n)

(1)约束函数:检查当前整数w[i]加入子集和是否超过W,若超过,则不能选择该路径。用于左孩子结点剪枝。

(2)限界函数:一个结点满足tw+rw<W,即即使选择剩余的所有整数,也不可能找到一个解。用于右孩子剪枝。

  1. (T5-3) 最小重量机器设计问题

 

 解空间向量{x1,x2...xi},xi属于[1,m],表示第i个部件的供应商编号

剪枝函数:约束条件:总价格小于c;限界条件:cw + w[t][j] < bestw

  1. (T5-13) 工作分配问题

解空间向量{x1,x2...xi},xi属于[1,n],表示第i个工作分配给第xi人

剪枝函数:约束条件:每人只分配一个工作;限界条件:cc + c[t][j] < bestp,总费用最小

  1. (T5-15) 最佳调度问题

解空间向量{x1,x2...xi},xi属于[1,k],表示第i个任务选择第xi个机器来完成。

剪枝函数:限界条件:用bestt表示当前所有可行解中时间最小值,用b[i]记录每个机器完成所需要的时间,a[i]每个任务的完成时间

  • 分支限界法

算法分析题

  1. (T6-1)

 

  1. (T6-4)

  1. (T6-9)

算法实现题

  1. (T6-4) 最小重量机器设计问题

  1. (T6-8) 最佳调度问题

猜你喜欢

转载自blog.csdn.net/qq_52686989/article/details/129158010