求两个等长的已排序数组的中位数(《算法导论》P113习题9.3-8)
[问题]设X[1...n]和Y[1...n]为两个数组,每个都包含n个已排序好的数。给出一个求数组X和Y中所有2n个元素的中位数的、O(lgn)时间的算法。
[解析]O(lgn)的时间复杂度就是二分查找的复杂度。首先给出一个观察:如果所有元素的中位数是X,那么从数组中同时删除num个小于X的的元素和num个大于X的元素后,产生的新集合的中位数还是X。考虑如下思路求解:每次比较A,B数组的中项元素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);
}
}
}
求两个等长的已排序数组的中位数(《算法导论》P113习题9.3-8)的更多相关文章
- JavaScript实现获取两个排序数组的中位数算法示例
本文实例讲述了JavaScript排序代码实现获取两个排序数组的中位数算法.分享给大家供大家参考,具体如下: 题目 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 . 请找出这两个 ...
- LeetCode第[4]题(Java):Median of Two Sorted Arrays (俩已排序数组求中位数)——HARD
题目难度:hard There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median ...
- 两个已排序数组的合并-C语言
最近在纸上写一个已排序数组的合并时,花了超过预期的时间.仔细想想,这种要放到毕业找工作那会两下就出来了,原因还在于工作后对基础没有重视,疏于练习. 说开一点,现在搜索引擎的发达确实给问题的解决带来了便 ...
- 2.Median of Two Sorted Arrays (两个排序数组的中位数)
要求:Median of Two Sorted Arrays (求两个排序数组的中位数) 分析:1. 两个数组含有的数字总数为偶数或奇数两种情况.2. 有数组可能为空. 解决方法: 1.排序法 时间复 ...
- LeetCode(4):两个排序数组的中位数
Hard! 题目描述: 有两个大小为 m 和 n 的排序数组 nums1 和 nums2 . 请找出两个排序数组的中位数并且总的运行时间复杂度为 O(log (m+n)) . 示例 1: nums1 ...
- LeetCode第[88]题(Java):Merge Sorted Array(合并已排序数组)
题目:合并已排序数组 难度:Easy 题目内容: Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as ...
- LeetCode4. 两个排序数组的中位数
4. 两个排序数组的中位数 问题描述 There are two sorted arrays nums1 and nums2 of size m and n respectively.Find the ...
- Leetcode4--->求两个排序数组的中位数
题目:给定两个排序数组,求两个排序数组的中位数,要求时间复杂度为O(log(m+n)) 举例: Example 1: nums1 = [1, 3] nums2 = [2] The median is ...
- LeetCode-4. 两个排序数组的中位数(详解)
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/description/ 有两个大小为 m 和 n 的排序数组 nums ...
随机推荐
- centos7 - nginx配置安装phpmyadmin
原文 https://www.linuxidc.com/Linux/2017-10/147556.htm 使用Nginx搭建phpMyAdmin Nginx有什么用? Nginx可读作Engin ...
- Mysql表的横向拆分与纵向拆分
表的拆分分为横向拆分(记录的拆分)和纵向拆分(字段的拆分).拆分表的目的:提高查询速度. 1.横向拆分 我们从一个案例去解释,情景是这样的:某某博客,有50W的博客量,有2w的用户,发现随着用户和博客 ...
- [MySql]当虚拟机的IP地址自动更换后,JDBC使用原来的配置连不上MySql数据库时所报的异常。
Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. ...
- 《maven实战》笔记(4)----maven的仓库
maven的构件表示方式是文件,maven通过仓库来统一管理这些文件. maven仓库的布局方式: 任何一个构件都有其唯一的坐标,根据这个坐标可以定义其在仓库中的唯一存储路径 仓库分为两类:本地仓库和 ...
- windows 10中的ubuntu子系统安装桌面环境的方法
windows 10中的ubuntu子系统安装桌面环境的方法 (How to install Ubuntu-desktop in windows 10 Subsystem for Linux) 转载 ...
- C++ remove remove_if erase
#include <iostream>#include <algorithm>#include <list>#include <vector>#incl ...
- 9Flutter GridView组件 以及动态GridView
main.dart import 'package:flutter/material.dart'; import 'res/listData.dart'; /* GridView : 通过GridVi ...
- 一百三十三:CMS系统之版块管理一
把模型创建到公共的models里面 class BoardModel(db.Model): __tablename__ = 'board' id = db.Column(db.Integer, pri ...
- python md5验签
import hashlib #api验签 参数按首字母排序,然后拼接clientid=123456&num=xxxx&status=1×tamp=157319776 ...
- docker attach 和 exec 用法区别
attach 用法 $ sudo docker attach 665b4a1e17b6 #by IDor$ sudo docker attach loving_heisenberg #by Name$ ...