找中位数问题——分治法


题目:设A和B都是从小到大已经排好序的n个不等的整数构成的数组, 如果把A与B合并后的数组记作C,设计一个算法找出C的中位数。


解题思路:

思路一:

对将A和B合并数组成C,并且进行排序,然后直接输出中位数。

该算法的时间复杂度为:O(nlogn),空间复杂度为:O(n)。


思路二:

利用分治法。

假定A[0,……,n-1] 和 B[0,……,n-1] 是输入数组,令k = [n/2]  (向下取整),取A[k] 和 B[k]比较。

  1. 如果A[k] == B[k],则A[k]就是所求的中位数,直接输出,算法结束;
  2. 如果A[k] < B[k],则A[0,……,k-1] 和 B[k+1,……,n-1] 不含有C的中位数,直接舍弃,下一步递归查找的子问题是A[k,……,n-1] 和 B[0,……,k](注:C中位数必定在这个区间之内);
  3. 如果A[k] > B[k],则A[k+1,……n-1] 和 B[0,……,k-1]不含有C的中位数,直接舍弃,下一步递归查找的子问题是A[0,……,k] 和 B[k,……,n-1].
  4. 当n == 1,A和B中都只剩下一个数,那么取中位数mid = (A[1] + B[1])/2,算法结束;
该算法每次将子问题减半(至多差常数1)。
时间复杂度满足方程:
W(n) = W(n/2) + 1
W(1) = 1

解该方程得:W(n) = O(logn),即时间复杂度为:O(logn)



 



  • 22
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值