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;
}
对于两个长度均为n的已排序的序列,确定这两个序列的2n个元素的中位数。解决此问题的算法思想:
设两个长度为n的数列分别为x[0:n-1]和y[0:n-1],分别找出这两个数列的中位数x[i]和
y[j],二者进行比较,根据比较结果可以在每个数列中减少一半的搜索范围,然后再分别取
两个子数列的中位数再比较,再减少搜索范围,继续下去直到找到最后结果。采用分治法来做,时间复杂度:O(lgn).网址:
复杂性分析:采用了二分查找的办法,树的节点个数为2n,因此算法的时间复杂度为
=
.
下面是网上别人的C++代码:
#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;
}
相关文章推荐
- python算法和数据结构笔记--汉诺塔问题超详细递归过程图解(堆栈数据结构)
- 数据结构及算法(Python)---队列
- 线性表13|约瑟夫问题 – 数据结构和算法18
- python 下的数据结构与算法---6:6大排序算法
- 算法与数据结构-分治法及汉诺塔问题求解
- python数据结构与算法——桶排序
- python数据结构与算法——链表
- 《面试-回溯法》 ---五种经典的算法问题之回溯法python
- 数据结构与算法:python语言描述之队列
- 递归和分治思想4|八皇后问题 - 数据结构和算法34
- python数据结构与算法——归并排序
- 高阶Python----常用的数据结构与算法
- 《机器学习实战》——k-近邻算法Python实现问题记录(转载)
- 【算法数据结构Java实现】Java实现动态规划(背包问题)
- 基本数据结构(算法导论)与python
- 程序员代码面试指南:IT名企算法与数据结构题目最优解-字符串问题:C/C++语言实现
- 算法与数据结构——最大子序列和问题
- 【数据结构&&算法系列】插入排序简单介绍及python代码
- Python实现的基于优先等级分配糖果问题算法示例
- 递归和分治思想4|八皇后问题 - 数据结构和算法34