一、选择题
-
二分搜索算法是利用(分治策略)实现的算法。
-
分治策略
-
动态规划
-
贪心法
-
回溯法
-
-
衡量一个算法好坏的标准是(时间复杂度低)。
-
运行速度快
-
占用空间少
-
时间复杂度低
-
代码短
-
-
以下不可以使用分治法求解的是(0/1背包问题)。
-
棋盘覆盖问题
-
线性时间选择
-
归并排序
-
0/1背包问题
-
-
实现循环赛日程表利用的算法是(分治策略)。
-
分治策略
-
动态规划法
-
贪心法
-
回溯法
-
-
实现棋盘覆盖利用的算法是(分治法)。
-
分治法
-
动态规划法
-
贪心法
-
回溯法
-
-
Strassen矩阵乘法利用(分治策略)实现的算法。
-
分治策略
-
动态规划法
-
贪心法
-
回溯法
-
-
使用分治法求解不需要满足的条件是(子问题必须是一样的)。
-
子问题必须是一样的
-
子问题不能够重复
-
子问题的解可以合并
-
原问题和子问题使用相同的解法
-
-
合并排序算法是利用(分治策略)实现的算法。
-
分治策略
-
动态规划法
-
贪心法
-
回溯法
-
-
算法分析中,记号O表示(渐进上界)。
-
渐进下界
-
渐进上界
-
非渐进上界
-
非渐进下界
-
-
下面关于矩阵乘法的Strassen算法,描述错误的是(对所有可乘的矩阵都适用)。
-
采用了分治的思想
-
时间复杂度低于O(
)
-
利用了分块矩阵乘法
-
对所有可乘的矩阵都适用
-
二、填空题
-
算法的复杂性有(时间)复杂性和(空间)复杂性之分。
-
算法的“(确定性)”指的是组成算法的每条(指令)是清晰的,无歧义的。
-
(算法)是指解决问题的一种方法或者一个过程。
-
从分治法的一般设计模式可以看出,用它设计的程序一般是(递归算法)。
-
算法是由若干条指令组成的有穷序列,且要满足(输入)、(输出)、(确定性)、(有穷性)和(可行性)五条性质。
-
大整数乘积算法是用(分治法)来设计的。
-
快速排序算法是基于(分治策略)的一种排序算法。
-
分治法的两个基本要素是(最优子结构)性质和(无重叠子问题)性质。
-
任何可用计算机求解的问题所需的时间都与其(规模)有关。
-
快速排序算法的性能取决于(划分的对称性)。
-
求下列函数
的渐进表达式:(
)。
-
出自于“平衡子问题”的思想,通常分治法在分割原问题,形成若干子问题时,这些子问题的规模都大致(相同)。
-
求函数
的渐进表达式:(
)。
-
描述算法的方法(程序设计语言)、(伪代码)、(流程图)和(自然语言)。
三、简答题
-
分治法的基本思想。
答:将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。递归地解这些子问题,然后将各个子问题的解合并得到原问题的解。
-
分治法所能解决的问题一般具有的几个特征。
-
该问题的规模缩小到一定的程度就可以容易地解决
-
该问题可以分解为若干个规模较小的相同问题即该问题具有最优子结构性质
-
利用该问题分解出的子问题的解可以合并为原问题的解
-
问题分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题
-
-
按照渐进阶从高到低的顺序排列以下表达式:
答案:
四、算法题
-
(二分搜索)给定已按升序排好序的n个元素a[0:n-1],现要在这n个元素中找出特定元素x,返回其在数组中的位置,如果未找到返回-1。写出二分搜索的递归算法,并分析其事时间复杂度(写出递归方程并求解)。
int BinarySearch(int a[],int x,int l,int r){
if(r>=1){
int m=(l+r)/2;
if(x==a[m])
return m;
else if(x<a[m])
return BinarySearch(a,x,l,m-l);
else
return BinarySearch(a,x,m+1,r);
}
else return -1;
}
时间复杂度为O(logn)
2. 补全快速排序中的Partition算法
int Partition(int a[],int p,int r){
int i=p,j=r+1;
int x=a[p];//以首元素为基准
//将<=x的元素交换到左边区域
//将>=x的元素交换到右边区域
while(true){
while(a[++i]<x&&i<r) ;
while(a[--j]>x) ;
if(i>=j)
break;//一遍扫描结束
Swap(a[i],a[j]);
}
a[p]=a[j];//首元素与a[j]交换
a[j]=x;//基准元素放在分界处
return j;//返回划分位置
}
3. 利用分治算法写出合并排序的算法,并分析其时间复杂度(写出递归方程并求解)。
void MergeSort(int a[],int left,int right){
if(left<right){//至少有两个元素
int i=(left+right)/2;//取中点
MergeSort(a,left,i);
MergeSort(a,i+1,right);
Merge(a,b,left,i,right);//合并到数组b
Copy(a,b,left,right);//复制回数组a
}
}
时间复杂度O(nlogn)