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

开门见山,直接上题目。

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小于全部数值,则输出:-1 0 若x大于全部数值,则输出:n-1的值 n的值

输入样例:

在这里给出一组输入。

6 5
2 4 6 8 10 12

输出样例:

在这里给出相应的输出。

1 2

题目分析

为什么要选择这道题来讲呢?那就是因为我太菜了,理解不了第三题的时间复杂度O(logn)的算法,只好拿这道题讲一下了。

好了,这里讲一下我的思路吧。

首先,需要理清题意,题目说的是返回下标,而不是位置,所以数组里的数组最好从下标0开始,这样子到后面的时候就不会弄的很乱;

我们在进一步分析一下,返回下标--如果找到了需要寻找的数,那么就返回两个相同的下标即找到目标数字的下标。那么没找到的情况呢?题目也很明显给了两个提示了,就是返回一个它邻边的两个数,如下:

但是还有一个问题,那就是边界问题。题目已经给出提示了,这里就不重复赘诉了。

理清思路之后,我开始构思算法了,很明显,这是一个典型的二分算法,毕竟题目已经是一个很明显的提示了。

那么基于二分算法,如果找到目标数字就返回改数字所在下标,若果没有找到就返回“l”下标;该函数如下:

int find(int* a, int l, int r,int goal){
	while(l <= r){
		int mid = (l + r) >> 1;

		if(a[mid] == goal){

			return mid;
		}
		else if(a[mid] < goal){

			l = mid + 1;
		}
		else {

			r = mid - 1;
		}
	}
		return l;  //返回“l”下标,即为找不到目标数字时的右邻边下标;
}

对于没找到目标函数的情况,只需要对上面find函数的返回值输出一个“l - 1” 和 “l”;

搞定这个函数之后剩下的事情就简单很多啦,主函数只要判断一下有无找到目标函数,然后分情况输出就ok。

下面是AC代码:

#include <iostream>

using namespace std;

int find(int* a, int l, int r,int goal){
    while(l <= r){
        int mid = (l + r) >> 1;

        if(a[mid] == goal){

            return mid;
        }
        else if(a[mid] < x){

            l = mid + 1;
        }
        else {

            r = mid - 1;
        }
    }
        return l;
}

int main ()
{
    int n, x, a[100005];

    cin >> n;
    cin >> x;
    for(int i = 0; i < n; i++)
        cin >> a[i]; 

    int f = find(a, 0, n-1, x);

    if(a[f] == x) cout << f << " " << f;
    else cout << f - 1 << " " << f;

    return 0;
 } 

改写二分算法

算法分析:

时间复杂度:数组长度为n,因为对数组进行了二分查找,问题规模是n,所以时间复杂度为O(logn);

空间复杂度:只开了几个变量,所以空间复杂度为O(1);

心得体会:

打代码我觉得最重要的还是理清自己的思路吧,有一个好的构思才能做出好的算法;还有注意细节;

我觉得我好菜;遇到难题半途..哦不,是知难而退。

Bye--bye~

原文地址:https://www.cnblogs.com/jyf2018/p/11565467.html

时间: 2024-08-03 17:13:28

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

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 ?

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

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

第二章上机实践报告

实践报告任选一题进行分析.内容包括: 实践题目: 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和比较次数. 问题描述:问题是让我们设计一个二分查找,在已经输入的数组里找到我们输入的数字,

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

本文索引目录: 一.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 实践

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

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 输出

算法第二章上机实践报告

题目 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 最大子段和 (40 分) 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值.当所给的整数均为负数时,定义子段和为0. 要求算法的时间复杂度为O(n). 输入格式: 输入有两行: 第一行是n值(1<=n<=10000): 第二行是n个整数. 输出格式: 输出最大子段和. 输入样例: 在这里给出一组输入.例如: 6 -2 11 -4 13 -5

贪心算法?我全都要!——算法第四章上机实践报告

算法第四章上机实践报告 一.        实践题目 4-1 程序存储问题 (90 分) 设有n 个程序{1,2,…, n }要存放在长度为L的磁带上.程序i存放在磁带上的长度是 li,1≤i≤n. 程序存储问题要求确定这n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序. 对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数. 输入格式: 第一行是2 个正整数,分别表示文件个数n和磁带的长度L.接下来的1行中,有n个正整数,表示程序存放在磁带上的长度. 输出

『嗨威说』算法设计与分析 - PTA 数字三角形 / 最大子段和 / 编辑距离问题(第三章上机实践报告)

本文索引目录: 一.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 实践题目: 1