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

实践报告任选一题进行分析。

1.实践题目:

  7-1 二分查找

  输入n值(1<=n<=1000)、n个非降序排列的整数以及要查找的数x,使用二分查找算法查找x,输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。

  输入格式:输入共三行: 第一行是n值; 第二行是n个整数; 第三行是x值。

  输出格式:输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。

2.问题描述:

  输入n值(1<=n<=1000)、n个非降序排列的整数以及要查找的数x,使用二分查找算法查找x,输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。

3.算法描述:

  首先,我们将n个非降序排列的整数存入数组中,方便后续的操作与比较。然后采用while循环,将要查找的数x与数组中间值进行多次比较,如果和a[n/2]相等则找到,该算法终止。如果x<a[n/2],则只在数组a的左半部分继续搜索即可,反之就在a数组的右半部分搜索,直至找到该数字,同时用一个变量count记录每一次查找比较的次数用来最后输出。

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

时间复杂度:每执行一次while循环,被搜索数组的大小就从原来的n缩减为原来的一半(n/2),最优情况是一次就找到要查找的数复杂度为O(1),最坏的情况是循环直到最后一个才找到要查找的数,复杂度为O(logn)。

空间复杂度:我们采用的二分法算法为非递归算法,其空间复杂度为O(1)

5.心得体会(对本次实践收获及疑惑进行总结):

  本次结对编程的实践,让我收获了特别多,

在解题过程中,一开始我的审题总是比较大意,没看清楚题目就开始要编程,一开始还以为我们需要先对数据进行排序,然后再进行二分查找。幸好菲凡及时提醒我原本数据就是已经排好序的,才让我免去做无用功的时间,有队友的感觉真好。然后在编程的过程中,菲凡有时会出现一些语法错误,我也能及时帮她指正,我们共同体会到和同伴一起思考一起讨论,然后解决问题的那种成就感,这让我体会到编程不一样的乐趣。另一方面,我也在实践中充分理解与掌握了课本中的算法知识,真正在实践中学习,在实践中明确自己的不足,一点点一点点进步。

PS:代码展示

#include<iostream>
using namespace std;
int main(){
  int n,x;
  cin>>n;
  if(1<=n&&n<=1000){
  int a[n];
  for(int i=0;i<n;i++) cin>>a[i];
  cin>>x;
  int count = 0;
  int left = 0;
  int right = n-1;
  while(left<=right){
    count++;
    int mid = (left+right)/2;
    if (x==a[mid]) {
      cout<<mid<<endl<<count;
      return 0;
      }
    if (x>a[mid]) left=mid + 1;
      else right= mid -1;
      }
    cout<<"-1"<<endl<<count;
    }
    return 0;
    }

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; line-height: 16.0px; font: 11.0px "Helvetica Neue"; color: #000000 }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; line-height: 16.0px; font: 11.0px "Helvetica Neue"; color: #000000; min-height: 12.0px }

原文地址:https://www.cnblogs.com/lhiscute/p/9787152.html

时间: 2024-11-07 17:19:47

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

算法第二章实践报告

第一道题: 第一道题要求输出查找次数,一开始我们小组用了两个二分查找算法来实现一个返回下标,一个返回计数器的值.但后来经过老师指点,我们采取了全局变量,来作为计数器,其值也是查找次数. 第二道题: 第二道题要求找不到目标的时候可以返回最邻近的两个值的下标,所以我们又添加了i和j,在每次进行大小比较之后记住比较过的元素下标.最后只需要在找不到相应元素的时候输出i和j即可. 第三道题: 第三道题要求将两个序列重新整合之后再输出中位数.老师要求做出logn的算法,但因为对算法的不熟悉,我们小组在实践课

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

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

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

题目:二分法查找 问题描述:用二分法查找x,找到时输出x的下标和比较次数:找不到时输出-1和比较次数. 算法语言描述: 输入数组和要查找的数x 算法描述:将一个数组分为两半,设置一个中间量a[mid]与要查找的数x比较,设置一个变量表示比较次数cnt,每次比较后cnt+1.若相等则说明中间值是要找的数,输出中间值和比较次数.若a[mid]小于x,则在数组右边继续查找,若a[mid]大于x,则在数组左边继续查找.找不到则输出-1和查找次数. 代码实现: #include <iostream> u

算法第二章实验报告

实践题目:二分查找. 问题描述:输入n值(1<=n<=1000).n个非降序排列的整数以及要查找的数x,使用二分查找算法查找x,输出x所在的下标(0~n-1)及比较次数.若x不存在,输出-1和比较次数. 算法描述: int BinarySearch(int a[],int x, int n){//在数组a[i]中查找X,找到返回X在数组的位置,否则返回-1 int left = 0; int right = n-1; int count = 0;//设数组位置左边为0:右边为n-1;定义cou

算法第二章上机报告

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)

算法第二章实践

第一题:输入n值(1<=n<=1000).n个非降序排列的整数以及要查找的数x,使用二分查找算法查找x,输出x所在的下标(0~n-1)及比较次数.若x不存在,输出-1和比较次数. 用二分搜索法,将若干个元素分成基本相同的两部分,x与a[n/2]比较,每次搜索数组的大小减一半.算法最坏情况下,时间复杂度为logn,空间复杂度是常数O(1).算法大致为:若x=a[mid],则返回mid,若x<[mid],则right=mid-1,x>[mid]则left=mid+1 心得体会:该题的难

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 ?

《AngularJS深度剖析与最佳实践》笔记: 第二章 概念介绍

第二章 概念介绍 2.1 什么是UI? 用户界面包括内容(静态信息+动态信息), 外观, 交互. 在前端技术栈中分别由HTML, CSS和JS负责. 进一步抽象, 分别对应于MVC三个主要部分: Model, View和Controller 对应到AngularJS中,  内容: 静态内容---模板 动态内容---scope 交互---Controller 外观 CSS----样式 filter----格式 2.2. 模块(module) 模块: 把相关的一组编程元素(如类, 函数, 变量等)组

算法第二章心得

学了算法的第二章以后,我对于算法思想有了进一步的理解.分治法的化繁为简,化难为易的思想,在日常生活中也能很好地体现出来.如果应用得当,往往能起到峰回路转,茅塞顿开的效果. 第二章的PTA实践,第一第二题其实检验了我们对二分搜索的掌握,以及算法的改写能力.第三题我觉得有点难度,因为它给出的序列最大长度非常大(100000),这就不得不要重视算法的时间复杂度.一开始我是在Java上运行,恰恰就是在最大序列长度这里运行超时了,我认为这一现象是Java解释器效率较低导致的.因此我又重新用C++写了一遍.