二分法查找两个有序数列的中位数

2023-10-31

背景

输入两个有序数列

a = [a1, a2, ..., an], 其中a1<a2<....<an
b = [b1, b2, ...bn], 其中b1<b2<....<bn

寻找a与b合并后数列的中位数

解题思路

(1)计算ab列表合并后中位数的index

>>>if (len(a)+len(b))%2==0:#偶数
...    index = [(len(a)+len(b))/2-1, (len(a)+len(b))/2]
...else:#奇数
...    index = [(len(a)+len(b))-1]/2

(4)len_a = 11, len_b = 8, index = 9(从0开始),所以是第10个数

a 1 2 5 7 8 9 12 14 16 17 18
b 3 4 6 10 11 13 15 19

(5)将问题转化为在合并列表中寻找第10小的元素

(6)将10/2 = 5(如果是奇数的话,向下取整),取ab列表中最小的第5位数

a 1 2 5 7 8 9 12 14 16 17 18
b 3 4 6 10 11 13 15 19

(7)由于8<11所以第10位最小的元素必定不在a列表的前5个元素中,因此将其剔除

a 9 12 14 16 17 18
b 3 4 6 10 11 13 15 19

(8)由于剔除了5位前10小的数字,因此问题转化为在剩余列表中寻找第5小的元素,5/2=2...1

a 9 12 14 16 17 18
b 3 4 6 10 11 13 15 19

(9)同理4<12,剔除b列表的前2位

a 9 12 14 16 17 18

b

6 10 11 13 15 19

(10)问题转化为在剩余列表中寻找第3小的元素,3/2=1...1

a 9 12 14 16 17 18

b

6 10 11 13 15 19

(11)同理6<9,剔除b列表的前1位

a 9 12 14 16 17 18
b 10 11 13 15 19

(12)问题转化为在剩余列表中寻找第2小的元素,2/2=1

a 9 12 14 16 17 18
b 10 11 13 15 19

(13)同理9<10,剔除a列表的前1位

a 12 14 16 17 18
b 10 11 13 15 19

(14)问题转化为在剩余列表中寻找最小的元素,10<12,因此中位数为10

复杂度分析

时间复杂度:O(log(m+n)),其中 m 和 n 分别是数组a和b的长度。初始时有中位数k=(m+n)/2 或 k=(m+n)/2+1,每一轮循环可以将查找范围减少一半,因此时间复杂度是 O(log(m+n))。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二分法查找两个有序数列的中位数 的相关文章

随机推荐

  • [Win11] PowerShell无法激活Conda虚拟环境

    目录 一 问题背景 二 解决方案 一 问题背景 按照教程1安装Typora时 需使用PowerShell执行Python命令 然而 Win11 PowerShell无法激活Conda虚拟环境 报错如下图所示 二 解决方案 根据报错 发现无法
  • Vue.js实战读书笔记--计算属性

    计算属性 3 1 什么是计算属性 在双方绑定过程中如果有过长的数据 表达式或者复杂逻辑业务时 应将所有的计算属性都以函数的形式写在Vue实例的computed选项内 最终返回计算后的结果 举例 改写前 div text split reve
  • ESP32-C3系列模组简介

    ESP32 C3是一款安全稳定 低功耗 低成本的物联网芯片 搭载RISC V 32位单核处理器 为物联网产品提供行业领先的射频性能 完善的安全机制和丰富的内存资源 嵌入式智能终端 无线WIFI技术以及Internet的广泛应用必将使家居控制
  • [Python系列-15]:人工智能 - 数学基础 -5- 向量内积(点乘)和外积(叉乘)概念及几何意义

    作者主页 文火冰糖的硅基工坊 https blog csdn net HiWangWenBing 本文网址 https blog csdn net HiWangWenBing article details 119322764 TBD ht
  • 听我一句劝,千万别去外包,两年外包生涯做完,感觉自己废了一半....

    先说一下自己的情况 大专生 18年通过校招进入湖南某软件公司 干了接近5年的点点点 今年年上旬 感觉自己不能够在这样下去了 长时间呆在一个舒适的环境会让一个人堕落 而我已经在一个企业干了五年的功能测试 已经让我变得不思进取 谈了2年的女朋友
  • 基础爬虫记~豆瓣+东方财富网爬虫

    基础小白 大佬轻点喷 一 基础豆瓣爬虫 1 首先在某站上听讲解 简单建立起了对爬虫的基础框架 具体包括五个板块 当然 有些东西看个人 可写成函数 也可以直接写 但重复用到的东西建议写函数 用到了下面五个库 from bs4 import B
  • 第五周:基于PIL的Python图像处理

    安装PIL注意 不是pip install Python Image Library 而是Pip install pillow pip算是PIL的一个分支 借助它我们可以完成 图像基本操作 缩放 裁剪 旋转 色彩转换 1 引用PIL fro
  • Linux Ubuntu 20.04LTS安装OpenSSL步骤

    其实 Ubuntu 20 04LTS 系统自带 OpenSSL 的 但是这个自带的openssl是没有 lt 头文件 h gt 和 lt 动态库文件 so及静态库文件 a gt 对于开发人员编程来说用不了 编译就报错找不到头文件 接口未定义
  • sqli-labs————less 23(高级注入篇)

    前言 从这一关开始 我们进进入了短暂的高级注入部分 这一部分中将会陆续介绍一些更为巧妙的注入技巧 Less 23 查看一下源代码
  • VS2013及QT安装

    参考如下链接 QT下载 QT下载 VS2013及QT安装 https jingyan baidu com article e8cdb32b132cd637052bade4 html
  • egg.js + mysql + windows 踩坑全纪录

    资料 egg js文档 https www eggjs org zh CN intro quickstart 背景 前面的都很简单 按照官方文档配置即可 全部调通以后 开始接触数据库mysql 因为米有后台开发背景 所以需要从头开始 步骤
  • Error:java: 无法从静态上下文中引用非静态 变量 this

    Error java 无法从静态上下文中引用非静态 变量 this 分析 出现这种错误首先先分清什么是静态什么是非静态 它们之间的关系是什么 静态方法中不能引用非静态变量 非静态方法中能引用静态变量 错误原因代码如下 public clas
  • 关于pd.read_excel()读取xls文件报错的解决办法

    报错信息 File E Python lib site packages xlrd compdoc py line 426 in locate stream raise CompDocError s corruption seen d d
  • 电商数据部分展示

    京东链接 商品id 标题 价格部分数据展示 淘宝标题 价格 优惠价格 链接部分数据展示
  • 跳动的爱心(c++版)

    include
  • 科教兴国

    在这个时代 人工智能的奇迹交织成一片璀璨的星河 在这片星河中 各大企业如同星辰 闪烁着探索的光芒 寻找着那些志同道合的伙伴 我们并肩飞翔 穿越信息的海洋 共同描绘出未来的蓝图 每一次合作 都如同星星之间的碰撞 擦出创新的火花 为这个时代注入
  • Linux安装JDK、Redis、MySQL、RabbitMQ、Minio、Nginx.......

    文章目录 一 环境准备 二 安装JDK 三 安装MySQL 四 安装Redis 三 安装RabbitMQ 四 安装Minio 五 安装Nginx 特殊情况处理 Centos7挂载磁盘 服务器时间同步 MySQL数据库时间同步 安装解压软件
  • LeetCode题目笔记——2357. 使数组中所有元素都等于零

    文章目录 题目描述 题目链接 题目难度 简单 方法一 直接模拟 代码 Python 方法二 哈希表 代码 Python 总结 题目描述 给你一个非负整数数组 nums 在一步操作中 你必须 选出一个正整数 x x 需要小于或等于 nums
  • Android APK反编译详解(附图)

    在学Android应用开发 在想既然是用Java开发的应该很好反编译从而得到源代码吧 google了一下 确实很简单 以下是我的实践过程 在此郑重声明 贴出来的目的不是为了去破解人家的软件 完全是一种学习的态度 不过好像通过这种方式也可以去
  • 二分法查找两个有序数列的中位数

    背景 输入两个有序数列 a a1 a2 an 其中a1