您的位置:首页 > 理论基础 > 数据结构算法

2n个数的中位数问题_python_算法与数据结构

2011-03-16 23:32 513 查看
问题:
对于两个长度均为n的已排序的序列,确定这两个序列的2n个元素的中位数。解决此问题的算法思想:
设两个长度为n的数列分别为x[0:n-1]和y[0:n-1],分别找出这两个数列的中位数x[i]和
y[j],二者进行比较,根据比较结果可以在每个数列中减少一半的搜索范围,然后再分别取
两个子数列的中位数再比较,再减少搜索范围,继续下去直到找到最后结果。采用分治法来做,时间复杂度:O(lgn).网址:中位数问题对这个问题进行了较为深入的阐述。下面给出了Python的代码实现:

deffidMid(cx1,cx2): size=len(cx1) mid=(size-1)//2 midSize=mid if(size%2==0): midSize=mid+1 if(size==1): if(cx1[0]>=cx2[0]): returncx2[0] else: returncx1[0] if(cx1[mid]<=cx2[mid]): foriinrange(0,midSize): cx1.pop(0) cx2.pop() else: foriinrange(0,midSize): cx1.pop() cx2.pop(0) returnfidMid(cx1,cx2) if'__name__=__main__': x=[10,15,16,19] y=[11,17,18,20] print(fidMid(x,y))
复杂性分析:采用了二分查找的办法,树的节点个数为2n,因此算法的时间复杂度为

=

.
下面是网上别人的C++代码:#include<iostream>
#include<fstream>
#include<vector>
#include<string>

usingnamespacestd;
#include<stdlib.h>

intfindMiddle(vector<int>a,vector<int>b)
{
intsize=a.size();
intmid_size=size/2;
if(size==1)
{
if(a[0]>b[0])
returnb[0];
else
returna[0];
}

if(a[mid_size]<b[mid_size])
{
copy(a.begin()+mid_size,a.end(),
a.begin());
for(inti=0;i<mid_size;i++)
{
a.pop_back();
}
if((size%2)==0)
{
for(intj=mid_size;j<size;j++)
{
b.pop_back();
}

}
else
{
for(intj=mid_size;j<size-1;j++)
{
b.pop_back();
}

}

returnfindMiddle(a,b);
}
elseif(a[mid_size]>b[mid_size])
{

copy(b.begin()+mid_size,b.end(),
b.begin());
for(inti=0;i<mid_size;i++)
{
b.pop_back();
}
if((size%2)==0)
{
for(intj=mid_size;j<size;j++)
{
a.pop_back();
}

}
else
{
for(intj=mid_size;j<size-1;j++)
{
a.pop_back();
}

}
returnfindMiddle(a,b);
}
else
returna[mid_size];

}

intmain()
{
vector<int>a;
vector<int>b;

intnumber;
intmid_number;
inttemp=0;
inti=0;
intj=0;

ifstreaminfile;
ofstreamoutfile;

infile.open("middleNumber.txt");
outfile.open("out.txt");

if(!infile)
{
cerr<<"CannotopenmiddleNumberfile!"<<endl;
return0;
}

if(!outfile)
{
cerr<<"CannotopenOUTfile!"<<endl;
return0;
}

infile>>number;

for(i=0;i<number;i++)
{
infile>>temp;
a.push_back(temp);

}

for(i=0;i<number;i++)
{
infile>>temp;
b.push_back(temp);
}

//cout<<a[0]<<""<<a[1]<<""<<a[2]<<endl;
//cout<<b[0]<<""<<b[1]<<""<<b[2]<<endl;

mid_number=findMiddle(a,b);

outfile<<mid_number;
cout<<mid_number<<endl;

return0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: