算法第二章上机实践报告

一、实践题目

改写二分搜索算法

二、问题描述

 

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

 

三、算法描述

 

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

二分搜索法的基本思想是在升序数组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…

webpack4进阶配置

移动端CSS px自动转换成rem 需要两步来实现&#xff1a; px2rem-loader 在构建阶段将px转换成remlib-flexible 页面渲染时动态计算根元素的font-size值&#xff08;手机淘宝开源库&#xff09;下载插件并配置&#xff1a; npm i px2rem-loader lib-flexiblemodule: {rules: [{t…

MBR与GPT的区别

由于在服务器上装windows系统&#xff0c;一共有3个4T的硬盘&#xff0c;但是在windows系统下最大显示的为7T&#xff0c;这是因为3个4T硬盘做了Raid5&#xff0c;即&#xff1a;3.6Tx&#xff08;3-1&#xff09; 7T,大约是7T。由于单个移动硬盘大于2T&#xff0c;而MBR格式的…

Servlet-三大域对象

request request是表示一个请求&#xff0c;只要发出一个请求就会创建一个request&#xff0c;它的作用域&#xff1a;仅在当前请求中有效。用处&#xff1a;常用于服务器间同一请求不同页面之间的参数传递&#xff0c;常应用于表单的控件值传递。常用方法&#xff1a;request.…

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

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

JSP四大域对象与九大内置对象

域对象的作用:保存数据,获取数据,共享数据.page&#xff1a;jsp页面被执行&#xff0c;生命周期开始&#xff0c;jsp页面执行完毕&#xff0c;生命周期结束&#xff08;jsp当前页面有效&#xff09;request&#xff1a;用户发送一个请求&#xff0c;生命周期开始&#xff0c;服…

解决ubuntu 15.04 安装matlab后无法找到matlab执行文件的问题

在ubuntu 15.04上安装好maltab R2015b之后&#xff0c;进入文件夹&#xff1a; /usr/local/MATLAB/R2015b/bin 没有发现matlab可执行文件&#xff0c;可是在文件管理器中又能搜索到matlab文件&#xff0c;是在其子目录glnxa64下。但进入子目录后&#xff0c;在终端输入命令&a…

一个写得很不错的vuex详解(转)

https://segmentfault.com/a/1190000015782272?utm_sourcetag-newest 转载于:https://www.cnblogs.com/hj0711/p/11577582.html

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

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

HttpServletRequest

HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求&#xff0c;当客户端通过HTTP协议访问服务器时&#xff0c;HTTP请求头中的所有信息都封装在这个对象中&#xff0c;通过这个对象提供的方法&#xff0c;可以获得客户端请求的所有信息。 二、Request常用方法 2.…

Linux 释放cpugpu内存、显存和硬盘

free -m free -mtotal used free shared buff/cache available Mem: 128831 15666 23617 406 89547 111448 Swap: 130986 130977 9 total 内存总数 used 已经使用的内存数 free 空闲…

POS时机未到,POW强攻是实现全球货币的正确道路

POS时机未到&#xff0c;POW强攻是实现全球货币的正确道路 取代现今的货币体系的正确进攻方式是POW强攻&#xff0c;现在的货币是由力量背书的&#xff0c;以后的货币也是由力量背书的&#xff0c;只有因造币耗费的力量超过了所有其它力量的时候才能取代成功&#xff0c;才能消…

Ubuntu15.04 64位安装Theano(已经测试可执行)

备注&#xff1a;之前服务器上已经安装caffe&#xff0c;后安装Theano&#xff0c;所有有些步骤简略。 安装caffe详情见 Caffe Ubuntu 15.04 CUDA 7.5 在服务器上安装配置及卸载重新安装&#xff08;已测试可执行&#xff09; 安装所需的安装包见 链接: http://pan.baid…

跳槽时,不敢要高工资也会对候选人不利

我在做技术面试官的时候&#xff0c;在问完问题后&#xff0c;照例会问一句&#xff1a;你期望的工资是多少&#xff1f;对此&#xff0c;我只会记录下候选人的回答然后上报&#xff0c;没有同意权&#xff0c;更没有批驳权。 判断候选人能否通过面试&#xff0c;主要看候选人能…

ubuntu 15.04 下的 nvidia(待续)

检查自己的GPU是否支持CUDA&#xff0c;linux可用以下命令来查看GPU型号&#xff1a; lspci | grep –i nvidia 本机显示结果如下 03:00.0 3D controller: NVIDIA Corporation GK110BGL [Tesla K40c] (rev a1) 04:00.0 VGA compatible controller: NVIDIA Corporation GK110…

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;其…

会话技术CookieSession

1&#xff0e;会话技术 从打开一个浏览器访问某个站点&#xff0c;到关闭这个浏览器的整个过程&#xff0c;成为一次会话。会 话技术就是记录这次会话中客户端态的状与数据的。 会话技术分为Cookie和Session&#xff1a; Cookie&#xff1a;数据存储在客户端本地&#xff0…

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

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 导致此问题的原因是…