【实践】算法第二章上机实践报告

1. 实践题目

7-3 两个有序序列的中位数

2. 问题描述

已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数。有序序列A?0??,A?1??,?,A?N?1??的中位数指A?(N?1)/2??的值,即第?(N+1)/2?个数(A?0??为第1个数)。

Input

在一行中输出两个输入序列的并集序列的中位数。

Sample

输入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. 算法描述

 1 #include <iostream>
 2 using namespace std;
 3 void Arrange(int s1[], int s2[], int N)  //用于求两者并集,并输出结果的函数
 4 {
 5     int X = N + N;
 6     int s3[X];          //定义一个s3数组,存储两者的并集,空间大小为s1与s2数组大小之和
 7     int i = 0, j = 0, k = 0;  //定义三个指针,分别作为s1、s2、s3数组的指针
 8     while(i<N && j<N)          //当s1、s2指针均没指到结尾时,遍历s1、s2,将每一步得到的最小元素放入s3中
 9     {
10         if(s1[i] < s2[j])
11         {
12             s3[k] = s1[i];
13             k++, i++;
14         }
15         else
16         {
17             s3[k] = s2[j];
18             k++, j++;
19         }
20     }
21     while(i<N)          //当s2指到结尾,s1未指到结尾时,继续遍历s1,将剩下的最小元素放入s3
22     {
23             s3[k] = s1[i];
24             k++, i++;
25     }
26     while(j<N)                 //当s1指到结尾,s2未指到结尾时,继续遍历s2,将剩下的最小元素放入s3
27     {
28             s3[k] = s2[j];
29             k++, j++;
30     }
31     cout << s3[(X-1)/2];     //在函数中输出s3的中位数
32 }
33
34 int main()
35 {
36     int N;
37     cin >> N;
38     int s1[N], s2[N];
39     for(int i=0; i<N; i++)
40     {
41         cin >> s1[i];
42     }
43     for(int i=0; i<N; i++)
44     {
45         cin >> s2[i];
46     }
47     if( s1[(N-1)/2] == s2[(N-1)/2] )
48     {
49         cout << s1[(N-1)/2];
50         return 0;
51     }
52     Arrange(s1, s2, N);
53     return 0;
54 }

4. 算法时间及空间复杂度分析

时间复杂度:

main()函数中有2个for循环,用于进行程序的输入,它们的时间复杂度均为O(n),其余语句的时间复杂度均为O(1);

Arrange(s1, s2, N)函数中,第一个while循环内嵌的是if和else条件判断语句,所以它的时间复杂度为O(n+n),即O(n)级别,剩余的两个while循环也同理。

因此,本算法的时间复杂度为O(n)。

空间复杂度:

因为变量只创建一次,且无需另外开辟辅助空间,因此,本算法的空间复杂度为O(1)。

5. 心得体会

写代码时要细心,写完之后要检查,运行结果出错时不要想当然。

若程序结果出错时,要先检查是否是算法大框架的问题。

本组在进行本程序的开发时,最初错将第10行的if(s1[i] < s2[j])错写为if(s1[i] < s2[i]),导致无法在所有情况下均获得Accepted结果。

在使用第一个Sample进行调试时,输出的是4而非5,我想当然以为排序出来的s3数组是正确的,产生问题的原因在于N为奇数,于是增加了奇数N情况下的条件判断,结果仍错误。

使用IDE进行调试过后,发现s3数组内部元素除了前几个以外其余的都是乱序,又增加了几个判断条件(也包括回溯指针等过程)均无法成功实行。

然后小组另一位成员提示:只需将i改为j即可成功,遂实行,结果为Accepted。

从此获得教训——以后程序运行结果出错时应先看大方向,把大方向弄无误了之后再去整理细节,否则就会犯钻牛角尖的错误。

原文地址:https://www.cnblogs.com/Akatsuki-Sanjou/p/9785844.html

时间: 2024-10-03 04:43:45

【实践】算法第二章上机实践报告的相关文章

09.19算法第二章上机实践报告

算法第二章上机实践报告 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 ?

『嗨威说』算法设计与分析 - 算法第二章上机实践报告(二分查找 / 改写二分搜索算法 / 两个有序序列的中位数)

本文索引目录: 一.PTA实验报告题1 : 二分查找 1.1 实践题目 1.2 问题描述 1.3 算法描述 1.4 算法时间及空间复杂度分析 二.PTA实验报告题2 : 改写二分搜索算法 2.1 实践题目 2.2 问题描述 2.3 算法描述 2.4 算法时间及空间复杂度分析 三.PTA实验报告题3 : 两个有序序列的中位数 3.1 实践题目 3.2 问题描述 3.3 算法描述 3.4 算法时间及空间复杂度分析 四.实验心得体会(实践收获及疑惑) 一.PTA实验报告题1 : 二分查找 1.1 实践

二分查找真的那么简单吗?——算法第二章上机实践报告

一.        实践题目 改写二分搜索算法 (20 分) 题目来源:<计算机算法设计与分析>,王晓东 设a[0:n-1]是已排好序的数组,请改写二分搜索算法,使得当x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j.当搜索元素在数组中时,i和j相同,均为x在数组中的位置. 输入格式: 输入有两行: 第一行是n值和x值: 第二行是n个不相同的整数组成的非降序序列,每个整数之间以空格分隔. 输出格式: 输出小于x的最大元素的最大下标i和大于x的最小元素的最小下标j.当搜索元素在

算法第二章上机实践报告

题目 7-2 设a[0:n-1]是已排好序的数组,请改写二分搜索算法,使得当x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j.当搜索元素在数组中时,i和j相同,均为x在数组中的位置. 输入格式: 输入有两行: 第一行是n值和x值: 第二行是n个不相同的整数组成的非降序序列,每个整数之间以空格分隔. 输出格式: 输出小于x的最大元素的最大下标i和大于x的最小元素的最小下标j.当搜索元素在数组中时,i和j相同. 提示:若x小于全部数值,则输出:-1 0 若x大于全部数值,则输出:n

《算法设计与分析》--算法第二章上机实践报告

开门见山,直接上题目. 7-2 改写二分搜索算法 (20 分) 设a[0:n-1]是已排好序的数组,请改写二分搜索算法,使得当x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j.当搜索元素在数组中时,i和j相同,均为x在数组中的位置. 输入格式: 输入有两行: 第一行是n值和x值: 第二行是n个不相同的整数组成的非降序序列,每个整数之间以空格分隔. 输出格式: 输出小于x的最大元素的最大下标i和大于x的最小元素的最小下标j.当搜索元素在数组中时,i和j相同. 提示:若x小于全部数

大二上学期算法第二章上机实践

实践题目:两个有序序列的中位数 问题描述:已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数.有序序列A0,A1,?,AN?1的中位数指A(N?1)/2的值,即?(N+1)/2?个数(A0为第1个数). 算法描述:用变量i和f作为两个数组的下标,依次比较并将两个数组所有元素归并成一个数组,最后直接输出合成数组第?(N+1)/2?个数.因为两个数组都是非降序序列,时间复杂度只有O(n). 另外,该题目忽略元素的重复,用二分法直接不断两个数组的中位数,最后得到两个中位数,较小

算法第二章上机实验报告

1.实践题目 7-1 二分查找 (20 分) 输入n值(1<=n<=1000).n个非降序排列的整数以及要查找的数x,使用二分查找算法查找x,输出x所在的下标(0~n-1)及比较次数.若x不存在,输出-1和比较次数. 输入格式: 输入共三行:第一行是n值:第二行是n个整数:第三行是x值. 输出格式: 输出x所在的下标(0~n-1)及比较次数.若x不存在,输出-1和比较次数. 输入样例: 4 1 2 3 4 1 输出样例: 0 2 2.问题描述 本道题是让我们输入非降序排列的整数,也就是说是排好

第二章上机实践报告

实践报告任选一题进行分析.内容包括: 实践题目: 7-1 二分查找 (20 分) 输入n值(1<=n<=1000).n个非降序排列的整数以及要查找的数x,使用二分查找算法查找x,输出x所在的下标(0~n-1)及比较次数.若x不存在,输出-1和比较次数. 输入格式: 输入共三行: 第一行是n值: 第二行是n个整数: 第三行是x值. 输出格式: 输出x所在的下标(0~n-1)及比较次数.若x不存在,输出-1和比较次数. 问题描述:问题是让我们设计一个二分查找,在已经输入的数组里找到我们输入的数字,

算法第二章上机报告

1.实践题目 7-1 二分查找 (20 分) 输入n值(1<=n<=1000).n个非降序排列的整数以及要查找的数x,使用二分查找算法查找x,输出x所在的下标(0~n-1)及比较次数.若x不存在,输出-1和比较次数. 输入格式: 输入共三行: 第一行是n值: 第二行是n个整数: 第三行是x值. 输出格式: 输出x所在的下标(0~n-1)及比较次数.若x不存在,输出-1和比较次数. 输入样例: 4 1 2 3 4 1 输出样例: 0 2 2.问题描述 输入n值(1<=n<=1000)