博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
求两个等长的已排序数组的中位数(《算法导论》P113习题9.3-8)
阅读量:4963 次
发布时间:2019-06-12

本文共 1063 字,大约阅读时间需要 3 分钟。

      [问题]设X[1...n]和Y[1...n]为两个数组,每个都包含n个已排序好的数。给出一个求数组X和Y中所有2n个元素的中位数的、O(lgn)时间的算法。

      [解析]O(lgn)的时间复杂度就是二分查找的复杂度。首先给出一个观察:如果所有元素的中位数是X,那么从数组中同时删除num个小于X的的元素和num个大于X的元素后,产生的新集合的中位数还是X。考虑如下思路求解:每次比较AB数组的中项元素A[n/2],B[n/2],代码实现如下:

 

int FindMiddleElement(int A[],int B[],int n)  {      if (n == 1)      {          return A[0] > B[0] ? B[0] : A[0];      }          if (A[n/2] == B[n/2])      {          return A[n/2];      }          if (A[n/2]>B[n/2])    {      // 需要确保A和B中丢掉相同数量的元素                           if (n%2 == 0)    //丢掉B[0...n/2 - 1]和A[n/2...n-1]          {			return FindMiddleElement(A,B + n/2,n/2);		}        else    //丢掉B[0...n/2 - 1]和A[n/2 + 1...n-1]          {		    return FindMiddleElement(A,B + n/2,n/2 + 1);      }      else       {		// 需要确保A和B中丢掉相同数量的元素          if (n%2 == 0)    //丢掉A[0...n/2 - 1]和B[n/2...n-1]  		{            return FindMiddleElement(A + n/2,B,n/2);		}        else    //丢掉A[0...n/2 - 1]和B[n/2 + 1...n-1]   		{            return FindMiddleElement(A + n/2,B,n/2 + 1); 	    }    }  }

 

  

 

转载于:https://www.cnblogs.com/laifeiyao/p/3490008.html

你可能感兴趣的文章
IOS FMDB
查看>>
编码总结,以及对BOM的理解
查看>>
九涯的第一次
查看>>
PHP5.3的VC9、VC6、Thread Safe、Non Thread Safe的区别
查看>>
Android中全屏或者取消标题栏
查看>>
处理器管理与进程调度
查看>>
页面懒加载
查看>>
向量非零元素个数_向量范数详解+代码实现
查看>>
java zip 中文文件名乱码_java使用zip压缩中文文件名乱码的解决办法
查看>>
java if 用法详解_Java编程中的条件判断之if语句的用法详解
查看>>
kafka的java客户端_KAFKA Producer java客户端示例
查看>>
java -f_java学习笔记(一)
查看>>
java 什么题目好做_用java做这些题目
查看>>
java中的合同打印_比较方法违反了Java 7中的一般合同
查看>>
php 位运算与权限,怎么在PHP中使用位运算对网站的权限进行管理
查看>>
php include效率,php include类文件超时
查看>>
matlab sin函数 fft,matlab的fft函数的使用教程
查看>>
wcdma下行如何解扩解扰 matlab,WCDMA技术基础.ppt
查看>>
MySQL date_format() 函数
查看>>
mysql 时间处理
查看>>