• 两个序列的中位数-减治法


    问题描述:

    现有两个等长的升序序列的序列A,B,试设计一个时间和空间都尽可能高效的算法,找出两个序列的中位数

    算法的基本思想是:分别求出两个序列的中位数,即为a b,有下列三种情况
    1:a=b;即a 为两个序列的中位数
    2:a<b: 则中位数只能出现在a和b之间,在序列A中舍弃a之前的元素的到序列A1,在序列B中舍弃b之后的元素,得到序列B1
    3:a>b:则中位数只能出现在b和a之间,在序列a中舍弃A之后的元素得到序列A1,在序列B中舍弃b之前的元素,得到B1;
    在A1和B1中分别求出中位数,重复上述过程,得到俩个序列中只有一个元素,则较小者即为所求

    输入:

    5

    1 2 3 5 7

    2 4 6 8 10

    输出:

    4

    代码:

    #include<iostream>
    
    using namespace std;
    
    void median(int a[],int b[],int start1,int end1,int start2,int end2)
    {
        if(start1==end1)
        {
            cout<<(a[start1]<b[start2]?a[start1]:b[start2]);
            return;
        }
        int mid1=(start1+end1)/2;
        int mid2=(start2+end2)/2;
        float num1,num2;
        if((start1+end1)%2!=0)//n为偶数
        {
            num1=(a[mid1]+a[mid1+1])/2;
            num2=(b[mid2]+b[mid2+1])/2;
        }
        else
        {
            num1=a[mid1];
            num2=b[mid2];
        }
        
        if(num1==num2)
        {
            cout<<num1;
            return;
        }
        else if(num1<num2)
        {
            if((start1+end1)%2!=0)
            {
                mid1++;
            }
            median(a,b,mid1,end1,start2,mid2);
        }
        else
        {
            if((start1+end1)%2!=0)
            {
                mid2++;
            }
            median(a,b,start1,mid1,mid2,end2);
        }
    }
    int main()
    {
        int n;
        int a[100],b[100];
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
        }
        for(int i=1;i<=n;i++)
        {
            cin>>b[i];
        }
        median(a,b,1,n,1,n);
        return 0;
    }
  • 相关阅读:
    confluence的安装、破解和汉化
    Linux学习经验集锦
    MFS 分布式文件系统
    MFS
    Docker 搭建 WordPress
    ansible入门
    docker搭建pxc集群与haproxy负载均衡
    mysql-proxy 实现读写分离
    Linux内核学习总结
    lab8:理解进程调度时机跟踪分析进程调度与进程切换的过程
  • 原文地址:https://www.cnblogs.com/xxaf/p/12963893.html
Copyright © 2020-2023  润新知