递归分治问题之找出两个有序序列的中间值

问题描述:

        You are interested in analyzing some hard-to-obtain data from two separate databases. Each database contains n numerical values, so there are 2n values total and you may assume that no two values are the same. You’d like to determine the median of this set of 2n values, which we will define here to be the nth smallest value. However, the only way you can access these values is through queries to the databases. In a single query, you can specify a value k to one of the two databases, and the chosen database will return the kth smallest value that it contains. Since queries are expensive, you would like to compute the median using as few queries as possible.
   Give an algorithm that finds the median value using at most O(log n) queries.

解题思路:

    首先,我们比较这两个序列的中间值,设第一个序列D1,中间值m1;设第二个序列,D2,中间值m2,且两个序列长度一样均为n。当第一个序列的中值m1>m2时,则说明两个序列融合后的中值一定处在D1序列的D1[n/2...n-1]和D2序列的D2[0...n/2-1]。我们把D1[n/2...n-1]作为新的D1,把D2[0...n/2-1]作为新的D2。继续上述的判断运算。直至最后的D1和D2都只有1个元素,比较找到较大(或较小或平均值),即为两个序列结合后的中值。

pseudo-code:

    Merge for two datasets

    p1=p2=n/2;

    for(i=2 ... log2(n))//因为进行的是二元搜索,共进行的是log2(n)

      m1=query(D1,p1);

      m2=query(D2,p2);

      if(m1>m2)

       {

         p1=p1-n/2^i;

         p2=p2+n/2^i;

       }

      else

       {

         p1=p1+n/2^i;

         p2=p2-n/2^i;

       }

    return min(m1,m2);

时间复杂度:因为执行的递归分治方案,时间复杂度o(nlogn)



         

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
寻找两个等长有序序列的中位数的技术难点主要是如何在时间复杂度为 O(log n) 的情况下完成。具体来说,需要采用分治算法的思想,将问题不断划分成规模更小的子问题,直到达到最小的情况,然后再将子问题的解合并起来得到原问题的解。在这个过程中,需要考虑以下几个难点: 1. 如何确定两个序列的中位数的位置 在合并两个有序序列的过程中,需要确定这两个序列的总长度以及中位数的位置。如果两个序列的长度都为偶数,那么中位数的位置就是两个位置,需要找到这两个位置对应的数并取平均作为中位数;如果长度都为奇数,那么中位数的位置就是一个位置,需要直接找到这个位置对应的数。因此,需要先计算出两个序列的长度,然后根据长度来确定中位数的位置。 2. 如何将两个有序序列合并成一个有序序列 在确定了中位数的位置之后,需要将两个有序序列合并成一个有序序列,然后再根据中位数的位置来确定中位数。这个过程可以采用归并排序的思想,即每次比较两个序列中的第一个数,将较小的数放入结果序列中,然后继续比较两个序列中的下一个数,直到其中一个序列为空,然后将另一个序列中的剩余元素直接放入结果序列中。 3. 如何确定中位数的位置在哪个序列中 在合并两个有序序列的过程中,需要确定中位数的位置在哪个序列中。可以采用递归的思想,在每次合并两个序列时,判断中位数的位置与当前序列的长度的关系,如果中位数的位置小于当前序列的长度的一半,则说明中位数在当前序列的前半部分,否则就在后半部分,然后递归处理前半部分或后半部分,直到找到中位数所在的序列为止。 4. 如何处理奇偶性 如果两个序列的长度都为偶数,那么需要找到中间两个数并取平均作为中位数;如果长度都为奇数,那么直接找到中间的数作为中位数。因此,需要在程序中对奇偶性进行判断,并根据不同的情况来确定中位数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值