上机实践报告
Posted biekanle
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了上机实践报告相关的知识,希望对你有一定的参考价值。
算法第二章上机实践报告
https://edu.cnblogs.com/campus/gdwywm/se1803/homework/7608
1.实践题目
7-3 两个有序序列的中位数
https://pintia.cn/problem-sets/1173827583729741824/problems/1173827629514764290
2.问题描述
已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数。有序序列A ?0 ?? ,A ?1 ?? ,?,A ?N−1 ?? 的中位数指A ?(N−1)/2 ?? 的值,即第⌊(N+1)/2⌋个数(A ?0 ?? 为第1个数)。 输入格式: 输入分三行。第一行给出序列的公共长度N(0<N≤100000),随后每行输入一个序列的信息,即N个非降序排列的整数。数字用空格间隔。 输出格式: 在一行中输出两个输入序列的并集序列的中位数。
输入样例1:
5
1 3 5 7 9
2 3 4 5 6
输出样例1:
4
输入样例2:
6
-100 -10 1 1 1 1
-50 0 2 3 4 5
输出样例2:
1
3.算法描述
二分搜索两个有序数组,每次取两个数组的中位数a[mida],b[midb]并比较,二者相等时找到题目所求的中位数并返回,否则将数组缩小一半
a[mida]<b[midb]时 取a数组的右半部分和b数组的左半部分,反之取a数组的左半部分和b数组的右半部分
当搜索的区间长度为偶数时,下界加一
因为两个数组初始时等长,while循环里最后一次是a,b数组是长度为2的连续有序区间,[la,ra]与[lb,rb],因为区间的元素是偶数个,跳出循环时la==ra,lb==rb 分别指向两个长度为2的子区间的最大值,取min为所求的中位数。
代码:
#include<iostream>
using namespace std;
const int maxn=1e5+10;
int a[maxn],b[maxn],n;
int solve()
int la=0,ra=n-1,lb=0,rb=n-1,mida,midb;
while(la<ra&&lb<rb)
mida=(la+ra)>>1;
midb=(lb+rb)>>1;
if(a[mida]==b[midb])
return a[mida];
else if(a[mida]<b[midb])
if((la+ra)%2==0)
la=mida;
rb=midb;
else
la=mida+1;
rb=midb;
else
//a[mida]>b[midb]
if((lb+rb)%2==0)
lb=midb;
ra=mida;
else
ra=mida;
lb=midb+1;
return min(a[la],b[lb]);
int main()
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=0;i<n;i++)
cin>>b[i];
cout<<solve()<<endl;
return 0;
4.算法时间及空间复杂度分析
主函数执行的语句为给数组赋值,时间复杂度和空间复杂度均为O(n)
solve函数里每次加法运算、移位运算、比较值的大小和赋值,执行logn次,时间复杂度为O(logn),空间复杂度为O(1)
5.心得体会
本次上机实践加深了对二分思想的理解,巩固了设计程序的知识,在分析和实践的过程里体会了二分在思维和时间复杂度上的优越性。
以上是关于上机实践报告的主要内容,如果未能解决你的问题,请参考以下文章