`
yangliuy
  • 浏览: 65474 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

求两个等长有序数组的中位数的logN算法 分治法

 
阅读更多

题目:有两个长为n的非递减数组A和B,把B接在A的后面变成长为2n的数组C。设计算法求C的中位数(第n小数)。

思路:O(n)的算法很容易找到,关键是用二分的思想设计logn算法。这题关键是用好a和b数组中脚标和为定值的元素的大小关系。

直观想法是:如果中位数在数组a中,那么若a[m]<b[n-m-2],此时比a[m]小的数最多只有n-2个,即a[m]不可能为第n小数,偏小更新左界;若a[m]> b [n-m-1],此时比a[m]小的数至少有n个,a[m]不可能为第n小数,偏大更新右界;若a[m]介于b[n-m-2]与b [n-m-1]则a[m]恰好为第n小数。中位数在数组b中的情况类似。


也可以取a[m]与b[n-m-2]中较大的一个,然后与a[m+1]和b[n-m-1]作比较,简化后的代码如下




分享到:
评论

相关推荐

    分治法求两列有序数组的中位数的程序

    (1)设X[0:n-1]和Y[0:n-1]为两个数组,每个数组中含有n个已排好序的数,设计一个算法复杂度为O(logn)的分治算法,找出X和Y中2n个数中的中位数。(中位数:个数为奇数:中间位置上的数;个数为偶数,中间两个数的...

    两个有序数组归并排序

    给定两个有序数组a b 使合并后的数组仍然有序 归并算法的事件复杂度为O logn

    17082 两个有序数序列中找第k小

    17082 两个有序数序列中找第k小(必做) 时间限制:1000MS 内存限制:65535K 提交次数:0 通过次数:0 题型: 编程题 语言: C++;C;VC;JAVA Description 已知两个已经排好序(非减序)的序列X和Y,其中X的长度为m,Y长度为...

    两个有序数序列中找第k小(必做)

    已知两个已经排好序(非减序)的序列X和Y,其中X的长度为m,Y长度为n, 现在请你用分治算法,找出X和Y的第k小的数,算法时间复杂度为O(max{logm, logn})。

    PHP实现找出有序数组中绝对值最小的数算法分析

    二分查找,因为数组有序,可以利用二分查找,时间复杂度O(logn)。 分析步骤: 1. 如果第一个数为正数,说明整个数组没有负数,直接返回第一个数 2. 如果最后一个数为负数,说明整个数组没有正数,直接返回最后一个...

    快速排序,使用分治算法

    快速排序,使用分治算法,绝对AC,使用C++算法,没有使用sort,时间复杂度O(n logn)

    求2n个数的中位数

    设X[0:n-1]和Y[0:n-1]为两个数组,每个数组中含有n个已排好序的数。试设计一个O(logn)时间的算法,找出X和Y的2n个数的中位数

    求N位个数的数则的中位数

    求2n个数的中位数,设X[0:n-1]和Y[0:n-1]为两个数组,每个数组中含有n个已排好序的数。试设计一个O(logn)时间的算法,找出X和Y的2n个数的中位数

    时间复杂度为O(logN)的常用算法,算法数据结构

    时间复杂度为O(logN)的常用算法,算法数据结构 五大常用算法

    Java常用算法手册

    深入浅出,描述java算法,从0到1。 1.大O表示法:粗略的量度方法即算法的速度是如何与数据项的个数相关的 算法 大O表示法表示的运行时间 ...O(1)是最优秀的,O(logN)良好,O(N)还可以,O(N2)稍差(在冒泡法中见到)

    python分治法求二维数组局部峰值方法

    题目的意思大致是在一个n*m的二维数组中,找到一个局部...再优化一点求每一行(列)的最大值,再通过二分法找最大值列的峰值(具体方法可见一维数组求峰值),这种算法时间复杂度为O(logn) 这里讨论的是一种复杂度为O

    两个有序数序列中找第k小

    现在请你用分治算法,找出X和Y的第k小的数,算法时间复杂度为O(max{logm, logn})。 此题请勿采用将序列X和Y合并找第k小的O(m+n)的一般方法,要充分利用X和Y已经排好序的这一特性。 输入格式 第一行有三个数,...

    求有N个元素的数组中前k个最大的数?(N>=k)(python实现)

    求有N个元素的数组中前k个最大的数?(N&gt;=k) 方法一:排序法 可以先将数组排序,然后再截取前k个最大的数,利用归并排序或者快速排序等排序方式,该方法平均时间复杂度为O(N*logN) 方法二:部分排序法 由于只需要找出...

    C语言输出旋转后数组中的最小数元素的算法原理与实例

    问题描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为...

    三分检索----分治法实现

    分治法解决搜索问题 代码已运行过 正常运行 时间复杂度O(logn)

    三峡大学算法设计与分析论文-倍增思想在算法运用与实现

    我们常常会遇到这样的问题:给定一个有序数组a\left[N\right],需要查找出最大的不小于某个数的数字或者查找出最小的大于某个数的数字,通常的朴素做法是从头到尾遍历一遍,那么时间复杂度就是O\left(n\right)。...

    Python 求数组局部最大值的实例

    给定一个无重复元素的数组A[0…N-1],求找到一个该数组的局部最大值。规定:在数组边界外的值无穷小。即:A[0]>A[-1],A[N-1] >A[N]。 显然,遍历一遍可以找到全局最大值,而全局最大值显然是局部最大值。 可否有...

    常用算法代码

    | 最短公共祖先(两个长字符串) 33 | 最短公共祖先(多个短字符串) 33 Geometry 计算几何 34 | GRAHAM 求凸包 O(N * LOGN) 34 | 判断线段相交 34 | 求多边形重心 34 | 三角形几个重要的点 34 | 平面...

    逐个插入建堆算法

    已知(k1, k2, …, kp)是堆,则可以写一个时间复杂度为O(logn)的算法,将(k1, k2, …, kp, kp+1)调整为堆。试编写“从p=1起,逐个插入建堆”的算法,并讨论由此方法建堆的时间复杂度。

Global site tag (gtag.js) - Google Analytics