2n个数后取n个数Java_分治法求2n个数的中位数

该博客介绍了如何使用Java实现分治算法找出两个已排序数组X和Y共2n个数的中位数。首先分别找到两个数组的中位数xa和yb,然后根据它们的大小关系缩小搜索范围,通过递归调用在缩小后的数组范围内继续寻找中位数。当xa等于yb时,找到中位数;否则,根据xa和yb的大小关系调整搜索区间。最终通过代码展示了具体的实现过程。
摘要由CSDN通过智能技术生成

问题:设X[0:n-1]和Y[0:n-1]为两个数组,每个数组中含有n个已排好序的数。试设计一个O(logn)时间的分治算法,找出X和Y的2n个数的中位数

思想:

对于数组X[0:n-1]和Y[0:n-1]先分别找出X和Y的中位数xa和yb。求中位数的算法是这样的,若n是奇数,即数组X和Y中各有奇数个数字,因为X和Y已经排好序了,所以去数组下标为(n-1)/2处的数即为中位数。若n是偶数,则取(n-1)/2向下取整和向上取整这两个位置的数的平均值作为中位数。

两者进行比较,

(1)若xa=yb则xa或者xb即为整个2n个数中的中位数,算法结束。因为:若每个数组中数字的个数是偶数个,则X中小于中位数的有n/2个,大于中位数的有n/2个,同理Y也是如此,所以在整个2n数组中比xa=yb小的共有n个数,比n大的共有n个数,即为中位数。若每个数组中数字的个数是奇数,则X中小于xa的有(n-1)/2个,大于xa的也有(n-1)/2个,同理Y中也是如此,所以对于xa或者是yb则整个2n数组中小于和大于他们的数分别为(n-1)个,取这两个数的平均值(xa+yb)/2=xa=yb即为中位数.

(2) 若xa>yb,则说明整个2n个数的的中位数一定在X数组的前一半和Y数组的后一半中,因为:若中位数在X数组的中位数之后,则比它小的数共有X数组中大于n/2个数以及Y数组中大于n/2个数总计超过了n个数,不符合中位数的定义。若中位数是在Y数组的前一半之中,则比它大的数字共有Y中包括中位数在内的后半部数加上X数组包括中位数在内的后半部,这样也超过了n个数,不符合中位数的定义。

(3) 若xa

确定中位数所在的数组范围后,递归调用求中位数算法对这个范围的数组求中位数重复上述过程,直至:

1.出现xa=yb情况,找到了中位数算法结束。

2.数组分割至左右两部数组只有一个数字的情况,求其平均值即为中位数

代码:

1 /*

2 思路:求两有序数组x和y的第k个数,思路如下:3 若k为1,则返回两数组的最小值4 取x的第i个数x0,取y的第(k-i)个数y05 若x0=y0,则x0即为所求6 若x0y0,则丢弃y的前(k-i)个数,k=i,递归8 */

9 importjava.util.Scanner;10 importjava.util.List;11 importjava.util.ArrayList;12

13 public classSolution{14

16 public int findOneSideMedian(inta[]){17 intmid;18 int length=a.length;19 //if(a[])数组长度a.length

20 if((length&0x01)==0){//判断子数组的长度是奇数还是偶数

21 mid=(a[length/2]+a[length/2-1])/2;22 }else{23 mid=a[length/2];24 }25 returnmid;26 }27

28 public double findMedian(int x[],int y[] intn){29 if(n==0){30 break;31 }32 int mid_x=findOneSideMedian(x);33 int mid_y=findOneSideMedian(y);34 if(n==1){35 return (mid_x+mid_y)/2;36 }37 if(mid_x==mid_y){38 returnmid_x;39 }else if(mid_x>mid_y){40 int[] x2=Arrays.copyOfRange(x,0,n/2);41 int[] y2=Arrays.copyOfRange(y,Math.ceil(n/2),n);42 n=n/2;43 findMedian(x2,y2,n);44 }else if(mid_x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值