算法与分析平时作业 - 答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
平时作业
1、给定下述二分搜索算法,请判断算法的正确性,指出错误算法的产生原因。
a) int BinarySearch(Type a[], const Type& x, int l, int r){
while (r >= l){
int m = (l+r)/2;
if (x == a[m]) return m;
if (x < a[m]) r = m-1;
else l = m+1;
}
return -1;
}
答:正确
b) int BinarySearch(Type a[], const Type& x, int l, int r){
while (r >= l){
int m = (l+r)/2;
if (x == a[m]) return m;
if (x < a[m]) r = m+1;
else l = m-1;
}
return -1;
}
答:错误
if (x < a[m]) r = m+1; 当查找的元素在中间元素的左边时,右指针应该为m-1位置,修改成if (x < a[m]) r = m+1; else l = m+l
c) int BinarySearch(Type a[], const Type& x, int l, int r){
while (r > l){
int m = (l+r)/2;
if (x == a[m]) return m;
if (x < a[m]) r = m-1;
else l = m+1;
}
return -1;
}
答:错误。
while (r > l) 要考虑到数组只有一个元素的情况所以应该是 r>=l ;
2、O(1)空间子数组环卫算法:设a[0:n-1]是一个n维数组,k(1≤k ≤n-1)是一个非负整数。试设计一个算法将子数组a[0 : k-1]与a[k+1 : n-1]换位。要求算法在最坏情况下耗时O(n),且只用O(1)的辅助空间。
答:最简单的方法就是循环(n-k-1)次,将a 数组的末尾数字插入到a[0]之前。
具体做法:
(1) 首先开辟一个额外空间temp 用于存放每一次a 数组的末尾数据。
(2) temp <- a[n-1]
(3) 将a[0: n-2] 每个数据都依次向后移动一位赋值给a[1: n-1]。
(4) a[0] <- temp
(5) 循环执行(2) -(4) 步 (n-k+1)次。
代价分析: 时间代价—— O((n-1)*(n-k+1)) 即O(n^2)数量级;空间代价: O (1)
3、定义: 给定一个自然数n ,由n 开始依次产生半数集set(n)中的元素如下:
1)()n set n ∈;
2)在n 的左边加上一个自然数,但该自然数不能超过最近添加的数的一半;
3)按此规则进行处理,直至不能再添加新的自然数为止。
例如 (){6,16,26,126,36,136}set n =。其中共有6个元素。
半数集问题:对于给定的n ,求半数集set(n) 中元素的个数。
答:半数集set(n)中元素个数的求解是个递归的过程。设set(n)中的元素个数为f(n),则显然有递归表达式:f(n)=1+∑f(i),i=1,2……n/2。即半数集set(n)元素个数f(n)=1+f(1)+f(2)+...+f(floor(n/2)). 用递推法求解。C 语言代码如下:
#include
#include
int main(){
int n;
int i,j,s;
int buf[106];
char *in="input.txt",*out="output.txt";
FILE *ip,*op;
if((ip=fopen(in,"r"))==NULL)return 1;
if((op=fopen(out,"w"))==NULL)return 2;
fscanf(ip,"%d",&n);
fclose(ip);
buf[1]=1;
buf[2]=2;
buf[3]=2;
for(i=4;i*2<=n;i++){
s=1;
for(j=1;j<=i/2;j++){
s+=buf[j];
}
buf[i]=s;
}
s=1;
for(j=1;j<=n/2;j++){
s+=buf[j];
}
fprintf(op,"%d",s);
fclose(op);
/* system("pause");*/
return 0;
}
4、设计一个算法,找出由n个数组成的序列的最长单调递增子序列的长度。答:#include
//快速排序
void QuickSort(int R[],int s,int t) {
int i=s,j=t; int tmp;
if(s tmp=R[s]; while(i!=j) { while(j>i&&R[j]>=tmp) j--; R[i]=R[j]; while(i R[j]=R[i]; } R[i]=tmp; QuickSort(R,s,i-1); QuickSort(R,i+1,t);