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

Posted 小小阿飞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了两个序列的中位数-减治法相关的知识,希望对你有一定的参考价值。

问题描述:

现有两个等长的升序序列的序列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;
}

以上是关于两个序列的中位数-减治法的主要内容,如果未能解决你的问题,请参考以下文章

主元素问题 减治法

减治法与插入排序

从减治法到插入排序再到希尔排序

减治法

算法设计与分析减治法

如何使用分治法求众数