查找问题:

  • 问题一:寻找两个等长有序序列的中位数

问题描述:对于一个长度为n的有序序列(假设均为升序序列)a[0 … n-1] ,处于中间位置的元素称为a的中位数。

例如,若序列a=(11,13,15,17,19),其中位数为15;
若序列b=(2,4,6,8,24),其中位数为6

两个等长有序序列的中位数是含有它们所有元素的有序序列的中位数,如上a,b序列的中位数为11

分析思路:

对于含有n个,元素的有序序列a[s … t ],

当n为奇数时,中位数出现在m=(s+t)/2;
当n为偶数时,中位数出现在m=(s+t)/2上中位和m=(s+t)/2+1下中位;在这里假设只取上中位

(1)分别求a、b的中位数a[m1]和b[m2]
(2)若a[m1]=b[m2],则a[m1]和b[m2]即为所求中位数
(3)若a[m1]<b[m2],则舍弃a中的前半部分,同时舍弃b的后半部分,两端舍弃部分的长度要相等
(4)若a[m1]>b[m2],则舍弃a中的后半部分,同时舍弃b的前半部分,两端舍弃部分的长度要相等

在保留的两个升序序列中重复上述过程,直到两个序列中只含有一个元素为止,较小者即为所求的中位数。

取前半部分均为a[a … m],取后半部分时(看元素个数),
若为奇数,则(s+t)/2
若为偶数,则(s+t)%2==1,则后半部分为a[m+1 …t ]


若序列a=(11,13,15,17,19),其中位数为15;
若序列b=(2,4,6,8,24),其中位数为6


代码一:

#include<stdio.h>void prepart(int &s,int &t)
{int m=(s+t)/2;  //前半子序列 t=m;
}void postpart(int &s,int &t)
{int m=(s+t)/2;    //后半序列 if((s+t)%2==0)   //序列中有奇数元素 s=m;else    //序列中有偶数个元素 s=m+1;
}int mid(int a[],int s1,int t1,int b[],int s2,int t2){int m1,m2;if(s1==t1 && s2==t2)return a[s1]<b[s2]?a[s1]:b[s2]; 只有一个元素返回最小者else{m1=(s1+t1)/2;  //求a 、b中位数 m2=(s2+t2)/2;if(a[m1]==b[m2])return a[m1];if(a[m1]<b[m2]){postpart(s1,t1);  //取a后半部分prepart(s2,t2);  //取b前半部分return mid(a,s1,t1,b,s2,t2); }else{prepart(s1,t1);  //取a半部分postpart(s2,t2); //取b后半部分return mid(a,s1,t1,b,s2,t2);} }
} int main(){int a[]={11,13,15,17,19};int b[]={2,4,6,8,24};printf("中位数:%d\n",mid(a,0,4,b,0,4));
}

求两个序列中位数可用循环语句来替换,等价的非递归算法

代码二:

#include<stdio.h>void prepart(int &s,int &t)
{int m=(s+t)/2;  //前半子序列 t=m;
}void postpart(int &s,int &t)
{int m=(s+t)/2;    //后半序列 if((s+t)%2==0)   //序列中有奇数元素 s=m;else    //序列中有偶数个元素 s=m+1;
}int mid(int a[],int b[],int n){int s1,t1,m1,s2,t2,m2;s1=0;t1=n-1;s2=0;t2=n-1;while(s1!=t1 || s2!=t2){m1=(s1+t1)/2;m2=(s2+t2)/2;if(a[m1]==b[m2])return a[m1];if(a[m1]<b[m2]){postpart(s1,t1);prepart(s2,t2);}else{prepart(s1,t1);postpart(s2,t2);}}return a[s1]<b[s2]?a[s1]:b[s2];
}int main(){int a[]={11,13,15,17,19};int b[]={2,4,6,8,24};printf("中位数:%d\n",mid(a,b,5));
}

分治法 ——查找问题 —— 寻找两个等长有序序列的中位数相关推荐

  1. DHU数据结构-顺序表- ADT应用-找出两个等长升序序列的中位数

    目录 1.题目 2.题解 3.代码实现 1.题目 顺序表ADT模板简单应用算法设计:找出两个等长升序序列的中位数 作者: 教材 时间限制: 1S 章节: DS:线性表 问题描述 : 目的:使用自行设计 ...

  2. 分治法——查找问题 —— 寻找一个序列中第k小的元素和查找最大和次大元素

    查找问题: 问题一:寻找一个序列中第k小的元素 对于给定的含有n个元素的无序序列,求这个序列中第k(1<=k<=n)小的元素 分析思路: 假设无序序列存放在a[0 - n-1]中,若将a递 ...

  3. [python] 分治法查找数组元素的最大值和最小值

    分治法查找数组元素的最大值和最小值 分治法简介: 分治法从字面上的解释是"分而治之",就是把一个复杂的问题分成两个或者更多相同或者相似的子问题,再把子问题分成更小的子问题,直到最后 ...

  4. 算法设计——用分治法查找数组元素的最大值和最小值、用分治法实现合并排序、最小费用问题、树的最大连通分支问题(代码实现)

    代码链接:pan.baidu.com/s/15inIth8Vl89R1CgQ_wYc2g  提取码:gf13 算法分析与设计第 1 次实验 时间 2020.3.31 地点 软件大楼 127 实验名称 ...

  5. 两个序列的中位数c语言,小白在线求教 用归并排序实现查找两个有序序列的中位数...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 两个有序序列的中位数 (20分) 已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数.有序序列A0,A1,⋯,AN−1的中位数指A ...

  6. 7-234 两个有序序列的中位数 (25 分)

    7-234 两个有序序列的中位数 (25 分) 已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数.有序序列A0​,A1​,⋯,AN−1​的中位数指A(N−1)/2​的值,即第 ...

  7. PTA5-53 两个有序序列的中位数

    5-53 两个有序序列的中位数   (25分) 已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数.有序序列A_0, A_1, \cdots, A_{N-1}A​0​​,A​1 ...

  8. 分治法查找数组元素的最大值和最小值(python实现)

    实验内容 给定任意几组数据,利用分治法的思想,找出数组中的最大值和最小值并输出 实验原理 利用分治法,将一个数组元素大于 2 的数组分成两个子数组,然后对每一个子数组递归调用,直到最小的子数组的元素个 ...

  9. 分治法——查找最大最小元素(Python)

    # 基本子算法(子问题规模小于等于 2 时) def get_max(max_list):return max(max_list) def get_min(min_list):return min(m ...

最新文章

  1. 制药行业验证过程中的偏差如何处理?
  2. LDAP操作过程中出现的错误代码
  3. [系统安全] 二十三.逆向分析之OllyDbg动态调试复习及TraceMe案例分析
  4. 计算机网络原理笔记-简单邮件传输协议
  5. 全民上云时代,如何降低成本?
  6. 此计算机上的操作系统不符合 sql,windows7系统安装SQL server2012提示操作系统不符合最低要求怎么办...
  7. linux学习作业-第八周
  8. 廖雪峰Java2面向对象编程-5包和classpath-4classpath和jar
  9. 国内完全免费的电子书籍下载
  10. structs 中过滤器问题
  11. 2022-2028年中国光纤放大器行业市场发展潜力及投资策略研究报告
  12. Centos7端口查看命令
  13. scratch编程我的世界3D史蒂夫
  14. Socket通信实例详解
  15. [SinGuLaRiTy] 动态规划题目复习
  16. 智慧交通产品解决方案-交通地理信息平台
  17. 【python设计模式】6、装饰器模式
  18. GMT绘图geotiff转grd
  19. LeetCode876 --- 剑指Offer 22
  20. 简易Windows密码查看器

热门文章

  1. python有什么用-python有什么用处?
  2. python电脑下载-PC端数据下载软件开发(Python)
  3. python 菜鸟-Python3 教程
  4. python入门基础知识实例-Python入门,原来如此简单!
  5. 语音识别几成标配,哈弗F7的智能语音系统有何不同?
  6. Unity接入百度语音识别WebAPI
  7. python如何输出整数逆序_python字符串类型及操作
  8. 【王道计组笔记】I/O输入输出系统基本概念
  9. 知名IT公司的年度大会合集
  10. 设置ListCtrl列表控件其中某一行的字体和背景颜色