当前位置: 首页 > article >正文

找出两个序列的中位数

一个长度为L(L>=1)的升序序列S,处在L/2(向上取整)个位置的数称为S的中位数。例如,若序列S1={11,13,15,17,19},则S的中位数是15,两个序列的中位数是含他们所有元素的升序序列的中位数。例如,若S2={2,4,6,8,20},则S1和S2的中位数是11。现在有两个等长升序序列A个B,试找出两个序列A和B的中位数。

方法一:

思想:先进行合并,然后找出合并后这个表的中位数。

代码:

bool merge(SqList &A,SqList &B,SqList &C) {
	if(A.length + B.length > MaxSize){
		return false;
	}
	int indexA=0,indexB=0;indexC=0;
	while(index < A.length && indexB < B.length){//归并两个表 
		if(A.data[indexA] <= B.data[indexB]){
			C.data[indexC++]=A.data[indexA++];
		}else{
			C.data[indexC++]=B.data[indexB++];
		}
	}
	while(index < A.length){//A表有剩余 
		C.data[indexC++]=A.data[indexA++];
	}
	while(indexB < B.length){//B表有剩余 
		C.data[indexC++]=B.data[indexB++];
	}
	//表C的长度 
	C.length=indexC;
	
	return true;
}

bool getMid(SqList &A,SqList &B,ElemType &x){
	if(A.length != B.length || A.length <=0){//合法性判断 
		return false;
	}
	//进行归并排序 
	SqList C;
	merge(A,B,C);
	//返回中位数 
	x=C.data[C.length/2-1];
	return true;
}

时间复杂度O(n);空间复杂度O(1)

方法二:

对于本题来说,合并后的序列一定是偶数个。中位数左边的数均比它小,右边的数均比它大,在中位数的左边和右边同时删除或增加等长的元素,中位数不会改变。

思想:求两个升序序列A和B的作为数,将A的中位数设为midA,B的中位数设为midB。

当midA=midB时,midA或midB为中位数,算法结束。

当midA<midB时,舍弃A中较小的一半,舍弃B中交大的一半,舍弃的元素个数相同。

当midA>midB时,舍弃B中较小的一半,舍弃A中交大的一半,舍弃的元素个数相同。

重复上述过程,知道两个序列中均只有一个元素时,较小的为两个序列的中位数。

代码:

bool getMid(SqList &A,SqList &B,ElemType &x){
	if(A.length != B.length || A.length <=0){//合法性判断 
		return false;
	}
	int i,di,midA,j,dj,midB;
	i=0;//表示表A开始时的下标 
	di=A.length-1;//表示表A最后一个元素的下标 
	j=0;//表示表B开始时的下标 
	dj=B.length-1;//表示表B最后一个元素的下标 
	while(i != di || j != dj){//两个表中的元素都超过一个元素时,大于等于2,均只有一个元素时,选择最小的即可 
	//中位数下标 
		midA=(i+di)/2;
		midB=(j+dj)/2;
		//表A和标B的中位数相等时,找到两个表的中位数 
		if(A.data[midA]==B.data[midB]){
			x=A.data[midA];
			return true;
		} 
		else if(A.data[midA]<B.data[midB]){//表A的中位数小于表B的中位数时,舍弃表A较小的一半,舍弃表B较大的一半
			dj=midB;
			i=(di+midA)%2 ==0 ? midA:(midA+1);
		} else{//表A的中位数大于表B的中位数时,舍弃表A较大的一半,舍弃表B较小的一半
			di=midA;
			j=(di+midB)%2 == 0 ? midB:(midB+1); 
		}
		 
	} 
	x=A.data[i] < B.data[j] ? A.data[i]:B.data[j];//两个表中只剩下一个元素时,中位数为最小的一个。 
}

时间复杂度O(logn)空间复杂度O(1)


http://www.kler.cn/news/285244.html

相关文章:

  • Python3.0以后各个版本区别介绍
  • 网络模型及协议介绍
  • STM32原理图一些引脚VDDA/VSSA/VBAT/OSC/NRST/BOOT
  • 随手记录第十五话 -- Spring Boot 3.2.3+Grafana+Prometheus+Loki实现一套轻量级监控加日志收集系统
  • 波导阵列天线单元学习笔记7 一种用直接金属激光烧结考虑的轻质量,宽带,双圆极化波导腔体阵列
  • Datawhale X 李宏毅苹果书 AI夏令营 Task2打卡
  • c++命令模式
  • Vscode推送代码到 Gitee
  • 关于一个早期的计算机网络的理解
  • Nginx 负载均衡深入指南:`proxy_pass` 指令的高效使用
  • Nginx: 负载均衡场景下上游服务器异常时的容错机制
  • docker python 3.11 容器报错
  • Windows连接虚拟机中的mysql5失败
  • C程序设计(潭浩强教授版)精选程序题
  • Bluetooth: gatt profile
  • 学习之SQL语句之DCL(数据控制语言)
  • 广电手机卡靠谱吗?
  • 【爬虫软件】YouTube评论采集工具
  • LVS工作模式
  • IBM退出中国,LabVIEW未来走向何方?
  • 5G智慧工地项目汇报方案
  • ElementPlus下拉框实现可选择,可输入
  • pm2 + linux + nginx
  • C++拷贝构造函数
  • 智能儿童对讲机语音交互,乐鑫ESP-RTC音视频通信,ESP32无线语音方案
  • JAVA:文字写入图片、图片插入图片
  • 睿考网:2024年中级经济师考试备考技巧
  • Java设计模式【享元模式】-结构型
  • mac在终端中使用vscode打开文件或者文件夹
  • PowerShell脚本编写:自动化Windows开发工作流程