分治算法之找出2n个数的中位数
来源:互联网 发布:情侣感人瞬间知乎 编辑:程序博客网 时间:2024/05/21 06:54
1、 设X[0:n-1]和Y[0:n-1]为两个数组,每个数组中含有n个已经排好序的数。试设计一个O(logn)时间的分治算法,找出X和Y的2n个数的中位数,并证明算法的时间复杂性为O(logn)
答:找出两个有序数组的中位数最简单暴力的方法是将两个数组合并成一个数组,然后找出中间那个数字。这种算法时间复杂度为O(n).
用分治算法解决,求出两个数组的中位数,然后比较这两个中位数的大小。
(1).如果这两个中位数相等,那么合并后的中位数一定是这个数。
(2)如果前面数组的中位数小于后面数组的,那么第一个数组中位数前的元素和第二个数组中位数后面的元素肯定不是合并后数组的中位数
(3)同理,如果第一个数组中位数大于第二个中位数,那么第一个数组中位数后的元素和第二个数组中位数前面的元素肯定不是合并后的中位数。
(4)将两个数组分别再分成两部分递归寻找中位数,最后找出中位数。
程序代码:
#include<iostream>
#include<vector>
usingstd::vector;
using namespacestd;
/* run thisprogram using the console pauser or add your own getch,system("pause") or input loop */
float mid(intm, int n,int arry[])//该函数是为了找出中位数
{
int middle = (n+m+1)/2;
float re;
if((n-m)%2==0)
re = arry[middle]/1.0; //如果数组的个数为奇数,直接取中间值
else
re = (arry[middle-1] + arry[middle])/2.0;//偶数则取中间两个数的平均数
return re;
}
floatfindmid(int arry1[],int arry2[],int b1,int b2,int l1,int l2)
{
int mid1 = (b1 + l1 + 1)/2;//中间位置
int mid2 = (b2 + l2 + 1)/2;
float mm1,mm2;
mm1 = mid(b1,l1,arry1);//找出数组的中位数
mm2 = mid(b2,l2,arry2);
if(l1==b1 && l2==b2)
return (mm1 + mm2)/2.0;//如果两个数组都只剩一个元素,则取两个数组中位数的平均值
if(mm1 == mm2)
return mm1;//中位数相等直接返回该中位数
else if(mm1 < mm2) //第一个数组中位数小于第二个中位数,则舍掉第一个中位数前的数和第二个中位数后的数
{
if((l2-b2)%2!=0)
returnfindmid(arry1,arry2,mid1,b2,l1,mid2-1);
else
return findmid(arry1,arry2,mid1,b2,l1,mid2);
}
else //第一个数组中位数大于第二个中位数,则舍掉第一个中位数后的数和第二个中位数前的数
{
if((l1-b1)%2!=0)
return findmid(arry1,arry2,b1,mid2,mid1-1,l2);
else
return findmid(arry1,arry2,b1,mid2,mid1,l2);
}
}
int main(intargc, char** argv) {
int arry1[5]={1,5,6,8,9}, arry2[5]={1,2,6,7,10},i;
cout<<"第一个有序数组:";
for(i=0;i<5;i++)
cout<<arry1[i]<<" ";
cout<<endl<<"第二个有序数组:";
for(i=0;i<5;i++)
cout<<arry2[i]<<" ";
cout<<endl<<"两个数组的中位数为:";
cout<<findmid(arry1,arry2,0,0,4,4)<<endl;
}
运行结果:
时间复杂度分析:
由于每次都是将数组分成两部分寻找中位数,从n,n/2,n/4,n/8……一直到1,所以时间复杂度为O(log2n).
- 分治算法之找出2n个数的中位数
- 算法导论9.3-8 找出已排序的2个数组X[1..n]和Y[1..n]的共2n个数的中位数
- 两个等长数组2n个数,找出中位数
- 算法 - 求n个数的中位数(C++)
- BFPTR算法(中位数的中位数算法)求n个数中第k大的数
- 找出集合S最接近中位数的k(k≤n)个数
- 算法实验之分治法求中位数
- 算法实验之分治法求中位数
- 【算法】【分治】两个排序数组的中位数
- 一个数组中找出连续子向量的最大和 分治算法 扫描算法O(n)
- 算法导论 9.3-7 O(n)时间求最接近中位数的k个数
- n方找n个数的区间中位数
- 找出n个数字的中位数至少需要的时间
- 算法,求1亿个数的中位数
- 找出数组X和Y中所有2n个元素的中位数
- 找出数组从小到大的前N个数
- 找出第 N 个数对应的数字
- 给定 n×n 的实数矩阵,每行和每列都是递增的,求这 n^2 个数的中位数。
- 深入理解js立即执行函数
- stdout stdin python里面的标准输出和输入
- static关键字
- Picasso 完美兼容 OkHttp3.3,缓存优化两不误
- bzoj 1951 古代猪文 CRT lucas定理
- 分治算法之找出2n个数的中位数
- [leetcode]Largest Rectangle in Histogram
- POJ 3621 最优比率生成环 二分求解
- [Java]随记--HttpClient发送put请求
- 请评论一下这段代码?
- ORACLE11g 没有控制文件如何通过rman备份恢复数据的详细实战过程
- 常用正则表达式汇总,以java作为测试
- 如何给10^7个不同的数字的磁盘文件排序
- Apache Kafka-个人翻译(入门kafka资料)-Quickstart