找中位数问题——分治法

来源:互联网 发布:免费动画视频制作软件 编辑:程序博客网 时间:2024/06/03 09:29


题目:设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)



 



0 0
原创粉丝点击