第二章实践报告
Posted gyry
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第二章实践报告相关的知识,希望对你有一定的参考价值。
题目:第二章上机实验第三题:求两个升序序列合并后的序列的中位数。
问题具体:输入序列的长度N,再输入两行N个数的升序数列,将两个数列合并,求最终数列的中位数。这个问题其实就是一个归并的常见问题,不过不需要真的去排好序,只要排到数列的中位数就好了。
算法的思路是:利用归并思想,用i,j分别从两个数列的首项开始对比,规定一个新的数列c[N](因为求的是中位数,所以不需要空间不需要两倍),当第一个数列的首项小于第二个,i++,同时将第一个数列的首项赋值给c[0],j不变,否则类似。一直到排出第N个数字即可,也就是c[N-1]。注意这里不需要去特别处理i==N或者j==N的情况,因为如果真的发生了这个情况,也会在“排出第N个数字”这里停止循环。
这个算法的时间复杂度计算如下:问题规模是N(只处理了N个数字),循环如下:
while(m<=n-1){
if(a[i]<b[j])
c[m]=a[i++];
else if(a[i]==b[j]) {
c[m++]=a[i++];
c[m]=b[j++];
}
else {c[m]=b[j];j++;
} 所以f(N)=N-1,时间复杂度T(N)=O(f(N))=O(N)。
空间复杂度,该算法为临时变量占用的空间:3N,所以空间复杂度S(N)=O(N)
个人心得:
其实这道题最重要的就是归并思想,也确实锻炼了我对归并编程的能力,因为之前没怎么打过这种算法的代码。毕竟如果只是简单将两个数组首尾相接,再用排序去交换数字会相当费时间,而且主要是,这道题不需要排出一个完整的新数列,目的只是找到中位数而已,数列最后有多少不重要。其次。不得不说,这道题题目说到:“
输出格式:
在一行中输出两个输入序列的并集序列的中位数。”并集序列这几个字真的坑死我了,我一开始以为要去重,因为是“并集”嘛,后来才发现,其实是“合并集成的序列”的意思。
我的代码在下面:
#include<iostream>
using namespace std;
int main(){
int n,j=0,i=0,m=0;
cin>>n;
int a[n],b[n],c[2*n];
for(int x=0;x<n;x++)
cin>>a[x];
for(int x=0;x<n;x++)
cin>>b[x];
while(m<=n-1){
if(a[i]<b[j])
c[m]=a[i++];
else if(a[i]==b[j]) {
c[m++]=a[i++];
c[m]=b[j++];
}
else {c[m]=b[j];j++;
}
m++;
}
cout<<c[m-1];
return 0;
}
以上是关于第二章实践报告的主要内容,如果未能解决你的问题,请参考以下文章