在两个有序数组中找到中位数

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

(PS:这里有个大前提就是两个有序数组必须是等长的!那么不等长时,就比较复杂了,可以参考GeeksforGeeks的这篇文章,主要思想还是分治,但是对于特殊情况要考虑周全,并且时间复杂度是O(logm+logn),其实,退而求其次,可以两个数组从头开始比较,选择第(m+n)/2个数,时间复杂度应该为O((m+n)/2))


思路:这题目是在学习完分治算法后留的课后作业,所以,首先想到的就是运用分治的思想。鉴于这两个数组都是有序的,所以,对于这两个数组而言分别取他们的中位数,X[n/2],Y[n/2];比较两数的大小,若X[n/2]>Y[n/2],那么我们可以舍去X[n/2]之后和Y[n/2]之前的数;若X[n/2]


代码:

#include
#define countof_macro(x) (sizeof(x)/sizeof(x)[0]);
using namespace std;

int middle_select(int x[],int y[],int x_low,int x_high,int y_low,int y_high){
	if(x_low==x_high){
		return x[x_low];
	}else if(y_low==y_high){
		return y[y_low];
	}
	
	int x_mid,y_mid;
	x_mid=(x_low+x_high)/2;
	y_mid=(y_low+y_high)/2;
	
	if(x[x_mid]>y[y_mid]){
		x_high=x_mid;
		y_low=y_mid;
	}else if(x[x_mid]
好久不敲C++代码了,各种忘啊!!!


时间复杂度分析:

在上面我们的分析中,可以明显的看出,在每次的筛选中,都会去掉一半的元素,并且,每次只要进行一次的比较,所以得到递推关系式为:T(n)=T(n/2)+O(1),运用master定理,可以得到时间复杂度为O(logn)

你可能感兴趣的:(algorithm)