算法第二章上机实践报告

一、实践题目

改写二分搜索算法

二、问题描述

 

这道题目主要是考验同学们在熟练掌握二分搜索法的前提下,对二分搜索的结构和运用有一个更加深刻的掌握。首先是要了解二分搜索的结构,其次,要了解二分搜索中的分治方法每一个步骤的用意,对于题目中的要求要有一个清晰的在哪个位置、以哪个为条件的认知。

 

三、算法描述

 

 二分搜索法充分利用了元素间的次序关系,采用分治策略,在时间复杂度较低的情况下完成搜索任务。

二分搜索法的基本思想是在升序数组a[n]中查找x,将n个元素大致分成两半,将x与a[n/2]比较。若x = a[n-2],则找到x,算法终止;若x > a[n/2],则要向a[n/2]的右边方向继续寻找;若x < a[n/2],则要向a[n/2]的左边方向继续寻找。

                                                                            a[left]                     a[n/2]                       a[right]

1

23……n-1

n

继续搜索时缩小范围,我们可以以x < a[n/2]举个例子,此时搜索范围是在[ a[left], a[n/2 -1] ]之间,之所以是n/2-1,是由于在第一轮中我们已经对x和a[n/2]做了对比,此时再做一次未免多此一举,与会增加算法的时间复杂度。这时,范围的a[mid]值为a[(0 + n/2 - 1) / 2] ,我们可以将x与a[mid]对比。若x=a[mid],则得到结果,算法结束;若x>a[mid],则要向mid的右边方向继续寻找;若x<a[mid],则要向a[mid]的左边方向继续寻找。

                                                                              a[left]              a[mid]                    a[n/2-1]

   1    2   ……a[n/2-1]a[n/2]

…………

以此类推,直到找到最后一个a[mid]的值,此时x已知的范围已经分无再分,可以用来作为后面对x在a[n]中位置的评判标准。若x>a[mid],则x的值会在a[mid]和a[mid+1]之间;若x<a[mid],则x的值会在a[mid-1]和a[mid]之间。

至于特殊情况若x小于全部数值或者x大于全部数值,可以在 x在数组中、x不在数组中但有左右范围 这两种if语句出现之前考虑。

具体代码如下:

#include<iostream>
using namespace std;
int a[1005], n, mid;
int mark = 0;
int find(int *a,int x){int l = 0;int r = n - 1;while(l <= r) {mid = (l + r) / 2;if(x == a[mid]) {mark = 1;return mid;}if(x > a[mid]) l = mid + 1;else  r = mid - 1;}return mid;
}
int main() {int x;cin >> n >> x;for(int i = 0; i < n; i++) {cin >> a[i];}int ans = find(a, x);if(a[n-1] < x) cout << n - 1<< " " << n;if(a[0] > x) cout << "-1 0";if(mark == 1)cout << ans << " " << ans << endl;else{if(a[ans] > x)cout << ans - 1 << " " <<  ans;else cout << ans << " " << ans + 1;}
return 0;}

四、算法时间及空间复杂度分析

时间复杂度:输入a[n]时时间复杂度为n + find函数的时间复杂度为O[logn] + 判断x在数组中位置时比较了5次,所以综合起来最终这个算法的时间复杂度为O[logn]。

空间复杂度:这个算法主要使用的辅助空间单元的个数只有一个,所以空间复杂度为O[1]。

五、心得体会

1.一开始我对于二分搜索法运用地不是十分熟练,但是在我自己打过代码之后,逐渐明白了它的结构框架就是分而治之。在此之上,难弄懂的题目要求在纸上演算过几次之后,对于如何设计算法就会胸有成竹。

2.我和我的搭档在做第一题时浪费了很多时间,是由于在极端情况下总是达不到要求。我在我的搭档那里学到了如何运用简单的步骤来检验自己代码中出的错误,只要不断地带入数值,输出其中的一个过程相关的值,就可以较为快捷地找到自己的错误在哪里。

 

转载于:https://www.cnblogs.com/247403wy/p/11565781.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246957.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows远程登录 ubuntu Linux 系统及互连共享桌面

预备工作 #开启防火墙端口 sudo ufw allow 3389#安装ssh sudo apt-get install openssh-server一、windows直连Ubuntu16.04共享桌面 1、打开终端&#xff0c;安装xrdp,vncserver sudo apt-get install xrdp vnc4server xbase-clients2、安装desktop sharing&#xff08;Ubuntu…

RAID详解

一、raid什么意思&#xff1f; RAID是“Redundant Array of Independent Disk”的缩写&#xff0c;中文翻译过来通俗的讲就是磁盘阵列的意思&#xff0c;也就是说RAID就是把硬盘做成一个阵列&#xff0c;而阵列也就是把硬盘进行组合配置起来&#xff0c;做为一个整体进行管理&a…

装windows和Linux系统时找不到硬盘,pe安装系统没有出现磁盘,不能识别磁盘

装win7的时候&#xff0c;我们使用U盘装系统&#xff0c;找不到硬盘&#xff0c; 或者使用光盘装系统时 会出现 缺少所需的CD/DVD驱动器设备驱动程序 然后找遍整个硬盘/光盘也找不到合适的驱动&#xff0c;安装无法继续。 解决方法&#xff1a; ACHI模式下&#xff0c;PE里…

Linux 服务器上建立用户并分配权限

查看用户 whoami #要查看当前登录用户的用户名 who am i #表示打开当前伪终端的用户的用户名 who mom likes who 命令其它常用参数 参数 说明 -a 打印能打印的全部 -d 打印死掉的进程 -m 同am i,mom likes -q 打印当前登录用户数及用户名 -u 打印当前登录用户登录信…

LSTM

具体推导公式为&#xff1a; https://zybuluo.com/hanbingtao/note/581764 转载于:https://www.cnblogs.com/invisible2/p/11593270.html

查看windows显卡内存详细信息

方式一&#xff1a; 打开运行&#xff08;WindowsR&#xff09;&#xff0c;输入DXDIAG&#xff0c;打开DirectX诊断工具 可以看到显卡是AMD Radeon HD 7000 series&#xff0c;但是没有具体显卡信息&#xff0c;这个型号是AMD在2013年主推的ATI的入门级独显系列&#xff0c;其…

从服务器上传和下载文件方法

1. ssh 安装SSH Secure Shell Client客户端 下载链接 http://download.csdn.net/detail/jiandanjinxin/9755684 使用方法参考主页 http://www.cnblogs.com/wxjnew/archive/2013/06/05/3118808.html http://www.cnblogs.com/pingzhanga/p/5126885.html 导致此问题的原因是…

Deep Learning运行所需的硬件配置(转)

A Full Hardware Guide to Deep Learning 2015-03-09 by Tim Dettmers 304 Comments 转自&#xff1a;http://timdettmers.com/2015/03/09/deep-learning-hardware-guide/ Deep Learning is very computationally intensive, so you will need a fast CPU with many cores, ri…

DBUtils

概述 DBUtils是Java编程中的数据库操作实用工具&#xff0c;小巧简单实用。 DBUtils封装了对JDBC的操作&#xff0c;简化了JDBC操作&#xff0c;可以少写代码。 DBUtils三个核心功能介绍 QueryRunner中提供对sql语句操作的APIResultSetHandler接口&#xff0c;用于定义select操…

windows7 下vmware workstation 12安装Ubuntu16.04虚拟机及安装和共享文件夹

关于安装虚拟机&#xff0c;具体细节可参考下文&#xff08;已测试可执行&#xff09; vmware workstation 12 安装 ubuntu kylin 16.04虚拟机 下面就给出在虚拟机Ubuntu16.04下安装VMware Tools&#xff0c;是为了实现目标主机和虚拟机之间的通讯。 1.打开虚拟机之后&#…

前端行性能优化

PS&#xff1a;结合了精英的思想和自己的一些小小的总结~ 影响用户访问的最大部分是前端的页面。网站的划分一般为二&#xff1a;前端和后台。我们可以理解成后台是用来实现网站的功能的&#xff0c;比如&#xff1a;实现用户注册&#xff0c;用户能够为文章发表评论等等。而前…

Python环境搭建及第三方库安装和卸载

因预处理医学图像数据需要用到以下的Python库 SimpleITK&#xff1b;Anaconda&#xff1b;PIL (Python Imaging Library)&#xff0c;故重新安装Python和第三方库。 一、安装Python 去官网&#xff1a;https://www.python.org/downloads/ 下载相应版本。 双击下载的安装包&…

VueX的store的简单使用心结

vuex的特点&#xff1a; 多组件共享状态: 多个组件使用同一个数据 任何一个组件发生改变, 其他组件也要跟着发生相应的变化 安装vuex npm install vuex&#xff1a; 创建实例&#xff1a; import Vuex from vuex import Vue from vue Vue.use(Vuex)const state {name : 张…

快速学习EndNote X7

EndNote X7 破解版本下载&#xff1a; http://bt.neu6.edu.cn/thread-1554395-1-1.html 链接: https://pan.baidu.com/s/1kVwetNL 密码: vh2b http://bbs.sciencenet.cn/thread-1192379-1-1.html 或者 http://www.las.ac.cn/endnote/endnote.jsp 一、EndNote主要功能 1.…

关于slot、slot-scope的指令的一些操作记录

关于slot、slot-scope的指令的一些操作记录&#xff1a; 从vue2.6.0开始&#xff0c;slot、slot-scope已经被废弃&#xff0c;推荐使用v-slot&#xff1b; slot-scope是作用域插槽, 父组件中不能直接用子组件中定义的data数据。 而slot-scope的出现就是解决了这样的问题 子组…

五种方法提高你的智力

五种方法提高你的智力 智力是天生的&#xff0c;一成不变的吗&#xff1f;教你五种方法提高智力&#xff1a;1体验新鲜事物 2挑战自己3有创造力的思考4生活中&#xff0c;多玩“hard”模式5多与他人进行交流 弯兔123 2011-04-04 14:53经验说&#xff1a;智力是天生的&#xff0…

matlab中 text 使用画图示例

% Plot the image of the Sensitivity and False Positive per image clear; close all; clc; I1 [0.5 75]; I2 [1 54.5];msize 19; %设定字体的大小hold on plot(I1(1),I1(2),ko-,MarkerFaceColor,r) % 红色实心圆点text(I1(1)0.1,I1(2),Wei 2002) hold on plot(I2(1),I2(2)…

计算机视觉界CV牛人牛事

CV人物1&#xff1a;Jianbo Shi史建波毕业于UC Berkeley&#xff0c;导师是Jitendra Malik。其最有影响力的研究成果&#xff1a;图像分割。其于2000年在PAMI上多人合作发表”Noramlized cuts and image segmentation”。这是图像分割领域内最经典的算法。主页&#xff1a;www.…