利用分治算法求中位数的算法设计

VAE311 2015-10-12 11:02:56
设x[n]和y[n]为两个数组,每个数组中含有n个已排序好的数,试设计一个O(logn)s时间的算法,找出x和y的2n个数的中位数,并证明算法的时间复杂度为O(logn)
...全文
2467 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
1.若midA=midB,返回midA; 2.若midA<midB,舍弃A中较小的一半,舍弃B中较大的一半; 3.若midA>midB,舍弃A中较大的一半,舍弃B中较小的一半;
RiqueZhang 2015-10-14
  • 打赏
  • 举报
回复 1
求两有序数组x和y的第k个数,思路如下: 若k为1,则返回两数组的最小值 取x的第i个数x0,取y的第(k-i)个数y0 若x0=y0,则x0即为所求 若x0<y0,则丢弃x的前i个数,k=k-i,递归 若x0>y0,则丢弃y的前(k-i)个数,k=i,递归 i取值尽可能地为k/2,每次丢弃k/2个数,O(log k) 取中位数时,k=(m+n)/2,O(log (m+n)) 当m=n时,k=n,O(log n)
public class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        if ((null == nums1) || (null == nums2)) {
            return 0;
        }

        int total = nums1.length + nums2.length;
        int middle = total >> 1;
        if (0 == (total & 0x01)) {
            int val1 = findKthSortedArrays(nums1, 0, nums1.length, nums2, 0,
                    nums2.length, middle);
            int val2 = findKthSortedArrays(nums1, 0, nums1.length, nums2, 0,
                    nums2.length, middle + 1);
            return (val1 + val2) / 2.0;
        } else {
            return findKthSortedArrays(nums1, 0, nums1.length, nums2, 0,
                    nums2.length, middle + 1);
        }
    }

    private int findKthSortedArrays(int[] nums1, int b1, int e1, int[] nums2,
            int b2, int e2, int k) {
        if (e1 - b1 > e2 - b2) {
            return findKthSortedArrays(nums2, b2, e2, nums1, b1, e1, k);
        }

        if (b1 == e1) {
            return nums2[b2 + k - 1];
        } else if (1 == k) {
            return Math.min(nums1[b1], nums2[b2]);
        }

        int i = Math.min(k / 2, e1 - b1);
        int j = k - i;
        int val1 = nums1[b1 + i - 1];
        int val2 = nums2[b2 + j - 1];
        if (val1 == val2) {
            return val1;
        } else if (val1 < val2) {
            return findKthSortedArrays(nums1, b1 + i, e1, nums2, b2, e2, k - i);
        } else {
            return findKthSortedArrays(nums1, b1, e1, nums2, b2 + j, e2, k - j);
        }
    }
}
二班的码农 2015-10-12
  • 打赏
  • 举报
回复
分别求x,y数组的中位数,mid_x, mid_y,如果mid_x<mid_y,则将x的前一半舍弃,y的后一半舍弃;如果mid_x>mid_y,则反之;如果两个相等,则找到中位数。
第二步,接着找被折半的x,y的中位数

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧