第二章实践报告

        题目:第二章上机实验第三题:求两个升序序列合并后的序列的中位数。

        问题具体:输入序列的长度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;
}

 

posted @ 2018-10-14 14:05  GYRY  阅读(136)  评论(0编辑  收藏  举报