Let X
[1 .. n
]
and Y
[1 .. n
] be two arrays, each
containing n
numbers already in sorted order. Give an O
(lg n
)-time algorithm to find the
median of all 2n
elements in arrays X
and Y
.
#include <stdio.h>
#include <stdlib.h>
/*
*求2个已经排好序的同样为n大小的数组的中位数算法
*/
int FindMedian(int [],int [],int,int,int);
int TWO_ARRAY_MEDIAN(int A[], int B[], int n)
{
int media=FindMedian(A,B,n,0,n-1);
if(media=='\0') media=FindMedian(B,A,n,0,n-1);
return media;
}
int FindMedian(int A[], int B[], int n, int low, int high)
{
if(low>high) return '\0';
int k=(low+high)/2;
if(k==n && A[k]<=B[0])
{
return A[k];
}
else if(A[k]>=B[n-k-1] && A[k]<=B[n-k])
{
return A[k];
}
else if(A[k]<B[n-k-1]) return FindMedian(A,B,n,k+1,high);
else return FindMedian(A,B,n,low,k-1);
}
int main()
{
int A[]={1,3,5};
int B[]={8,9,10};
printf("%d\n",TWO_ARRAY_MEDIAN(A,B,3));
}
算法分析:
Lets start out by supposing that the median (the lower median, since we know we
have an even number of elements) is in X. Lets call the median value m, and lets
suppose that its in X[k]. Then k elements of X are less than or equal to m and
n −k elements of X are greater than or equal to m. We know that in the two arrays
combined, there must be n elements less than or equal to m and n elements greater
than or equal to m, and so there must be n − k elements of Y that are less than or
equal to m and n − (n − k) = k elements of Y that are greater than or equal to m.
Thus, we can check that X[k] is the lower median by checking whether Y [n−k] ≤ X[k] ≤ Y [n − k + 1]. A boundary case occurs for k = n. Then n − k = 0, and
there is no array entry Y [0]; we only need to check that X[n] ≤ Y [1].
Now, if the median is in X but is not in X[k], then the above condition will not
hold. If the median is in X[k], where k < k, then X[k] is above the median, and
Y [n − k + 1] < X[k]. Conversely, if the median is in X[k], where k > k, then
X[k] is below the median, and X[k] < Y [n − k].
Thus, we can use a binary search to determine whether there is an X[k] such that
either k < n and Y [n−k] ≤ X[k] ≤ Y [n−k+1] or k = n and X[k] ≤ Y [n−k+1];
if we Þnd such an X[k], then it is the median. Otherwise, we know that the median
is in Y , and we use a binary search to Þnd a Y [k] such that either k < n and
X[n − k] ≤ Y [k] ≤ X[n − k + 1] or k = n and Y [k] ≤ X[n − k + 1]; such a
Y [k] is the median. Since each binary search takes O(lg n) time, we spend a total
of O(lg n) time.
Heres how we write the algorithm in pseudocode:
TWO-ARRAY-MEDIAN(X, Y )
n ← length[X] n also equals length[Y ]
median ← FIND-MEDIAN(X, Y, n, 1, n)
if median = NOT-FOUND
then median ← FIND-MEDIAN(Y, X, n, 1, n)
return median
FIND-MEDIAN(A, B, n, low, high)
if low > high
then return NOT-FOUND
else k ← (low+high)/2
if k = n and A[n] ≤ B[1]
then return A[n]
elseif k < n and B[n − k] ≤ A[k] ≤ B[n − k + 1]
then return A[k]
elseif A[k] > B[n − k + 1]
then return FIND-MEDIAN(A, B, n, low, k − 1)
else return FIND-MEDIAN(A, B, n, k + 1, high)
分享到:
相关推荐
RTL8367S芯片的电路设计主要包括MDI、MDIAN、MDIB、MDIC、MDID等模块的设计,这些模块都是交换机的核心组件。电路设计需要考虑到电路的可靠性、稳定性和抗干扰性等方面的因素。 三、PCB设计 PCB设计是指设计交换机...
例如,`RDA_error.m`可能用于计算距离徙动误差,`mdian1.m`、`mdian.m`和`tdian.m`可能是进行多普勒参数估计的代码,`SAR_cs_error.m`可能用于评估CSA算法的成像误差,`SARcs.m`是CSA算法的主要实现,而`mmian.m`...
1. **MDIAN2.TXT**:可能包含了中位数的计算或比较,中位数是衡量数据集中趋势的另一种方法,特别是在处理偏斜分布时非常有用。 2. **KSTWO.TXT**:Kolmogorov-Smirnov检验(K-S检验)的实现,这是用来检查样本是否...
Font Awesome图标字体库提供可缩放矢量图标,它可以被定制大小、颜色、阴影以及任何可以用CSS的样式
介绍了physical design的floorplanning问题
数学建模培训资料 数学建模实战题目真题答案解析解题过程&论文报告 最低生活保障问题的探索 共20页.pdf
变更用水性质定额申请表.xls
从官网上下载下来,作为资源存储,方便安装,此资源为windows版本
嗨玩旅游网站-JAVA-基于springboot嗨玩旅游网站设计与实现(毕业论文+PPT)
【资源说明】 本科毕业设计 基于Python中国知网(cnki)爬虫及数据可视化详细文档+全部资料.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
api代码
【作品名称】:基于 Java 实现的24点卡牌游戏【课程设计】 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】: Java小游戏--24点卡牌游戏 将扑克牌(除大小王)随机打乱,每次出现4张卡牌,每张卡牌使用一次,13个回合。 A代表1,J代表11,Q代表12,K代表13。 可2-4人局域网同时在线对战,100秒倒计时结束前回答正确可获得积分,先回答的可获4分,后回答的分数依次递减。 实时显示玩家排名。 【资源声明】:本资源作为“参考资料”而不是“定制需求”,代码只能作为参考,不能完全复制照搬。需要有一定的基础看懂代码,自行调试代码并解决报错,能自行添加功能修改代码。
用 Python 实现的可扩展布隆过滤器皮布卢姆pybloom是一个包含 Bloom Filter 数据结构以及可扩展 Bloom Filter 实现的模块,如下所述P. Almeida、C.Baquero、N. Preguiça、D. Hutchison,可扩展布隆过滤器,(GLOBECOM 2007),IEEE,2007。如果您了解需要提前留出多少位来存储整个集合,那么布隆过滤器就是您的不二之选。可扩展布隆过滤器允许您的布隆过滤器位根据误报概率和大小进行增长。当过滤器达到容量上限时,即为“满”M * ((ln 2 ^ 2) / abs(ln p)),其中 M 是位数,p 是误报概率。当达到容量上限时,将创建一个比上一个过滤器大得多的新过滤器,其误报概率更小,哈希函数数量更多。>>> from pybloom import BloomFilter>>> f = BloomFilter(capacity=1000, error_rate=0.001)>>> [f.add(x) for x in range(10)][False, False, False,
计算机学院宿舍美化大赛.rar
基于java的运动器械购物商城设计与实现.docx
内容概要:文章介绍了针对“卓越工程师教育培养计划”,结合PBL和CDIO工程教育理念,对材料成型及控制工程专业课程设计的实践教学改革进行探索。首先在命题设计上依托企业实践项目,确保设计内容与生产实际紧密结合,具有较强的创新性和实用性。在过程管理中,采用分组合作和面向实际问题导向的教学方法,提升学生的工程素养和创新思维。通过课程设计的成绩考核,结合校内外导师的共同评价,客观全面衡量学生的学习成果。指导教师发挥了组织、支持和引导等多方面的角色作用。 适合人群:高等院校材料成型及控制工程专业学生和教学管理人员;工程教育领域的研究人员。 使用场景及目标:旨在提升工科学生的工程实践能力和创新能力,使其具备解决复杂实际工程问题的能力。通过改革教学内容和方法,改善传统课程设计中存在的不足,培养出高素质的技术人才。 其他说明:改革措施在实际运行中取得了较好的教学效果,提高了学生的就业竞争力,但仍存在一些不足之处需要在未来进行完善。
设计模式学习
C的两数相加求和的程序代码
Viper是一个基于Anno微服务引擎开发的Dashboard示例项目。Anno底层通讯采用grpc、thrift
本教程播放列表涵盖了 Python 中的数据结构和算法。每个教程都有数据结构或算法背后的理论、BIG O 复杂性分析和可供练习的练习。使用 Python 的数据结构和算法本教程涵盖了 Python 中的数据结构和算法。每个教程都包含数据结构或算法背后的理论、BIG O 复杂度分析以及可供练习的练习。要观看视频,您可以访问播放列表https://www.youtube.com/playlist?list=PLeo1K3hjS3uu_n_a__MI_KktGTLYopZ12订阅 codebasics youtube 频道https://www.youtube.com/c/codebasics