• 算法第二章上机实验报告


    1.实践题目:

    两个有序序列的中位数 

    2.问题描述:

    已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数。有序序列A0​​,A1​​,,AN1​​的中位数指A(N1)/2​​的值,即第(N+1)/2⌋个数(A0​​为第1个数)。

    输入格式:

    输入分三行。第一行给出序列的公共长度N(0<N≤100000),随后每行输入一个序列的信息,即N个非降序排列的整数。数字用空格间隔。

    输出格式:

    在一行中输出两个输入序列的并集序列的中位数。

    3.算法描述:

    我们小组运用了第二章学习的分治法,即不断缩小子问题规模,最终合并问题。

    我们先设了一个长度为2n的数组c,然后设置了两个类似指针的标记,取小的放在数组c首位,当两个标记都没有一动到数组最后一个字符的情况下,取小。

    当一个数组先走完,则另一个数组的剩余部分全部copy过去。最后求出数组c的中间下标的那个字符,即为所求。

    代码如下:

    #include <iostream>
    using namespace std;
    int main(){
    int n;
    cin>>n;
    int a[n],b[n];
    int N;
    N=2*n;
    int c[N];
    for(int i=0;i<n;i++){
    cin>>a[i];
    }
    for(int i=0;i<n;i++){
    cin>>b[i];
    }
    if(0<=n&&n<=100000){
    int i=0,j=0,k=0;
    while(i<n&&j<n){
    if(a[i]<b[j]){
    c[k]=a[i];
    i++;
    k++;
    }
    else{
    c[k]=b[j];
    k++;
    j++;

    }

    }
    while(j<n){
    c[k]=b[j];
    k++;
    j++;
    }
    while(i<n){
    c[k]=a[i];
    k++;
    i++;
    }
    cout<<c[n-1]<<endl;
    }
    return 0;
    }

    4.算法时间及空间复杂度分析:

    时间复杂度:该算法运用两个while来实现,时间复杂度为O(nlogn)

    空间复杂度:最终得出空间复杂度为O (n)。

    5.心得体会:

    在这次的上机实践中,我们因为一些小小的错误没有被发现而一直在停滞不前,后来看了很多次之后终于发现了,这提醒我们一定要看仔细,并且一开始我们并没有考虑到特殊情况,比如奇偶长度等。

  • 相关阅读:
    winform程序,备份数据库+并压缩+并删除以前的备份
    冒泡排序
    存储过程和SQL语句比较
    简单的firebird插入速度测试
    [收藏转]由于CredSSP加密Oracle修正 导致远程桌面报错处理
    由Handle转换为控件
    字符串格式化
    查询mssql的死锁语句
    读取和修改app.config文件
    json序列化与反序列化
  • 原文地址:https://www.cnblogs.com/yelimin/p/9827472.html
Copyright © 2020-2023  润新知