寻找两个排序数组的中位数

本文探讨如何找到两个已排序数组的中位数,并通过不同情况分析(奇数长度或偶数长度)解释如何保持中位数不变。通过对数组元素的比较和调整,确保在移除相同数量的小于或大于中位数的元素后,中位数依然有效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

寻找两个排序数组的中位数


中位数保持

从一组数字的中位数两边删除同样多的元素(不管被删除的数字的相对顺序是什么样的),中位数保持。— 尽可以把位于中位数左边和右边的这些数字打乱,只要中位数两边被删除的数目相等就能使中位数保持(是剩下的这些数的中位数)。

Alt text

情景分析

  1. 假设两个已排序的数组,记为 A[m] B[n] 。设想一下,当能确定这两个数组中比中位数小的数值的个数 x 以及比中位数大的数值的个数 y 时,求出 min=Min(x,y) ,那么同时去掉中位数两边(左边的数小于或等于中位数,右边的数大于或等于中位数)任意 min 个数,中位数保持。

为了便于描述,假设数组的起始坐标是1而不是0。还假设 C[m+n] 是将A和B组合起来排序了的数组。他的中位数下标记为c。记A的中位数的下标为a,B的中位数的下标为b。记 A[a] 在C中的下标位置为 Ca B[a] 在C中的下标位置为 Cb

首先,当 A[a]==B[b] 时,C的中位数就是 A[a] ,看图。


Alt text

位于两边的数的个数一定是相等的。

然后,若 A[a]B[b] ,我们总有办法交换集合,使得集合A和B满足 A[a]<B[b]
case1: m为奇数,n为奇数。
看图:


Alt text

A[a]<B[b] ,那么一定有:
A[a] 在C中的下标位置 Ca 最大能排在b所在位置 Cb 的前面,所以有 Caa+b1=m+12+(n+121)=m+n2=c ,于是,所有位于a左边的数均小于或等于c-1,均位于C的中位数的左边,他们的个数是 m+121=m12
B[b] 在C中的下标位置 Cb 最小能排在a所在位置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值