问题描述:

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)

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

  1. C++leetcode找出两个有序数组的中位数(2)

    给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 如果不考虑复杂度的话这个题目很简单:将两 ...

  2. Algs4-1.4.12找出两个有序数组的公共元素-方法1

    1.4.12编写一个程序,有序打印给定的两个有序数组(含有N个int值)中的所有公共元素,程序在最坏情况下所需的运行时间应该和N成比. 答: import java.util.Arrays; publ ...

  3. 找出两个字符串中最大子字符串,如abractyeyt,dgdsaeactyey的最大子串为actyet

    // 最大子字符串.cpp : 定义控制台应用程序的入口点. // //找出两个字符串中最大子字符串,如"abractyeyt","dgdsaeactyey"的 ...

  4. 找出两个字符串中最长的相同子字符串

    //找出两个字符串中最长的相同子字符串public class Stringdemo {public static void main(String[] args) {String str1 = ne ...

  5. 高效的找出两个List中的不同元素

    转自同名博文,未知真正出处,望作者见谅 如题:有List<String> list1和List<String> list2,两个集合各有上万个元素,怎样取出两个集合中不同的元素 ...

  6. 找出两个数组相同的元素

    题目:找出两个数组(有重)相同的元素,两种方法 public class 出两个数组相同的元素 { public static void main(String[] args) { // TODO A ...

  7. C语言找出两个字符串唯一不同的一个字符(附完整源码)

    C语言找出两个字符串唯一不同的一个字符 C语言找出两个字符串唯一不同的一个字符完整源码(定义,实现,main函数测试) C语言找出两个字符串唯一不同的一个字符完整源码(定义,实现,main函数测试) ...

  8. 汇编语言(十五)之找出两个数组中的相同元素

    找出两个数组中的相同元素,并且输出 程序运行: 代码: datas segmentA dw -1,-2, 3, 4, 5, 6, 7, 8, 9, 10,-11, 12, 13, 14, 15ACou ...

  9. 表格字体缩小 php_如何快速找出两个Excel表格不同的地方?

    上一篇文章介绍了如何快速找出两个word文档不同的地方,这篇文章来说说如何快速找出两个Excel表格不同的地方,这里说的两个Excel表格,可以是同一个工作簿的不同sheet,也可以是两个不同的Exc ...

最新文章

  1. 丁贵才130702010042第二次作业
  2. idea git 使用
  3. c#万能视频播放器 (转)
  4. 时间戳的转换和星期转换
  5. php 序列化储存和转化 json_encode() json_decode($q,true)
  6. nyoj116士兵杀敌2
  7. 关于汉语转换拼音的组件
  8. linux 软件 runtime,Objective-C中runtime机制的应用
  9. 脉冲编码调制pcm matlab,基于MATLAB的脉冲编码调制PCM
  10. [原]procexp替换任务管理器
  11. 从零开始学WEB前端——HTML理论讲解
  12. zhaow游戏知识问答
  13. HuaWei ❀ 双协议栈
  14. 引擎所有固定变量大全
  15. 网易云信 NIM_duilib 源码分析
  16. 实现两个变量的互换(不借助第三个变量)
  17. 小小的PDF 攻防世界
  18. 换分币c语言程序,编写程序输出用一元人民币兑换成1分、2分和5分硬币的不同兑换方法...
  19. 最新互联网乡镇综治云平台解决方案
  20. 【Jenkins+青藤云】基于Jenkins部署青藤云镜像扫描插件(2)—部署问题解决

热门文章

  1. excel怎么把竖排变成横排_预算在6000元!这四款手机怎么选?
  2. 另一个小程序 返回的支付结果如何得到_都火遍全球了,你却还在为电商支付功能开发犯难...
  3. mysql查看端口是否打开_linux查看端口是否开放
  4. win10间歇性闪屏_win10系统电脑频繁闪屏刷新的解决方法
  5. MybatisPlusException: Error: GlobalConfigUtils setMetaData Fail
  6. 打怪升级之小白的大数据之旅(四十一)<大数据与Hadoop概述>
  7. spring oauth2 实现用户名密码登录、手机号验证码登录返回token
  8. The road to the Vue(七、实战篇)
  9. 心念城南好风景,花开时节愿逢君
  10. 实拍当贝F5与坚果J10S,莫要听信网上水军