二排序数组中位数
来源:互联网 发布:广州多益网络员工收入 编辑:程序博客网 时间:2024/05/16 10:24
二排序数组中位数
9.3-8 设X[1..n] 和 Y[1..n]为两个数组,每个都包含n个已排好序的数。给出一个求数组X和Y中所有2n个元素的中位数的O(lgn)时间的算法
分析与解答:
若中位数位于X中,不妨设为X[k],即在X中有k个元素小于等于中位数,n-k个元素大于等于中位数。由于X[k]为合并后的2n个元素的中位数,则在Y中有n-k个元素小于等于中位数,k个元素大于等于中位数,即
Y[n-k] ≤ X[K] ≤ Y[n-k+1]
看到时间复杂度为O(lgn),不禁使我们想到二分法,但是和这题有什么关联呢?
二分法每次搜索都能减小一半的范围,在搜索中位数的过程也可以的,下面具体论述:
若X[k]不满足上述等式,分两种情况
(1) X[k] < Y[n-k]
若中位数是k' < k,则X[k'] ≤ X[k]] < Y[n-k] 。那么在Y中小于等于X[k']的元素数目小于n-k,则X[k']不可能为中位数
由此只需要搜索k' > k的范围
(2) X[k] > Y[n-k+1]
若中位数是k' > k,则X[k'] > X[k] > Y[n-k+1] 。那么在Y中小于等于X[k']的元素数目大于n-k+1,则X[k']不可能为中位数
由此只需要搜索k' < k的范围
根据上述特点,我们可以采用二分搜索逐步缩小搜索范围。
整个算法的过程如下:
- TWO-ARRAY-MEDIAN(X, Y)
- n ← length[X]
- median ← FIND-MEDIAN(X, Y, n, 1, n)
- if median = NOT-FOUND
- then median ← FIND-MEDIAN(Y, X, n, 1, n)
- return median
- FIND-MEDIAN(A, B, n, low, high)
- if low > high
- then return NOT-FOUND
- k ← (low + high)/2
- if k=n and A[n] ≤ B[1]
- then return A[n]
- elseif k<n and B[n-k]≤A[k]≤B[n-k+1]
- then return A[k]
- elseif A[k]<B[n-k]
- then return FIND-MEDIAN(A, B, n, k+1, high)
- else return FIND-MEDIAN(A, B, n, low, k-1)
自己的想法:
找出X,Y的中位数midx,midy既是中间元素,比较midx和midy如果midx =midy则他两就是中位数,如果midx< midy 则中位数一定在midx的后半部分,和midy的前半部分;然后继续参看这两个部分;
- 二排序数组中位数
- 二排序数组中位数
- 两个排序数组的中位数
- 两个排序数组的中位数
- 两个排序数组的中位数
- 两个排序数组的中位数
- 两个排序数组的中位数
- 两个排序数组的中位数
- 两个排序数组的中位数
- 两个排序数组的中位数
- 二分查找-两已排序数组中找中位数二题
- leetcode 求两个排序数组的中位数
- 求两个排序数组的中位数
- 找两个排序数组的中位数
- 【算法】【分治】两个排序数组的中位数
- 堆排序:动态数组求中位数
- 寻找两个排序数组的中位数
- 找出两个排序数组的中位数
- Java 单例模式详解
- 计算几何——Uva 270 Lining Up
- selenium webdriver学习(十)------------如何把一个元素拖放到另一个元素里面
- 非线程安全的函数
- VC转码方式
- 二排序数组中位数
- JS中使用JSTL标签
- 作业相关操作
- sde增加删除
- Linux下open与fopen的区别
- linux环境下 C++性能测试工具 gprof + kprof + gprof2dot
- hdu 2045 - 不容易系列之(3)—— LELE的RPG难题
- 使用Python进行验证码识别
- 50 Useful CSS Snippets Every Designer Should Have