当前位置: 首页 > news >正文

数据结构算法学习day3——二分查找

一.算法描述

二.算法实现

package com.algorithm.binarysearch;public class BinarySearch {/*params:a - 待查找的升序数组target - 待查找的目标值Returns:找到则返回索引找不到则返回-1* */public static int binarySearch(int[] a,int target){//设置元素个数数组和待查找的目标值int i = 0,j = a.length - 1;//设置指针和初值while(i<=j){int m = (i+j) >>> 1; //用无符号右移运算符,防止溢出if(target < a[m]){//目标值在中间值左边的情况下j = m - 1;}else if(target >a[m]){//目标值在中间值右边的情况下i = m + 1;}else {return m; //找到中间值}}return -1;//找不到的情况下返回-1}
}
package com.algorithm.binarysearch;public class BinarySearch {/*params:a - 待查找的升序数组target - 待查找的目标值Returns:找到则返回索引找不到则返回-1* */public static int binarySearch(int[] a,int target){//设置元素个数数组和待查找的目标值int i = 0,j = a.length;//设置指针和初值while(i<j){int m = (i+j) >>> 1; //用无符号右移运算符,防止溢出if(target < a[m]){//目标值在中间值左边的情况下j = m;}else if(target >a[m]){//目标值在中间值右边的情况下i = m + 1;}else {return m; //找到中间值}}return -1;//找不到的情况下返回-1}
}

三.查找问题

问题一

q:为什么是i<=j意味着区间内有未比较元素,而不是i<j?

s: i,j 它们指向的元素也会参与比较。

问题二

q:(i+j)/2有没有问题?

s:同一个二进制数,在java中会把第一位看作符号位,所以用">>>"无符号右移运算符,防止溢出。

问题三

q:在比较中写成“<”小于符号有何好处?

s:数组是升序排列的,写成小于符号可以是和数组升序排列方向一致,不然会很别扭。

四.如何判断算法好坏

1.时间复杂度

含义:是用来衡量一个算法的执行,随数据规模增大,而增长的时间成本。

2.如何表示时间复杂度

假设算法要处理的数据规模是n,代码总的执行行数用函数f(n)来表示,例如:

  • 线性查找算法的函数f(n) = 3*n+3
  • 二分查找算法的函数f(n) = (floor(log2(n)+1)*5+4

渐进上界:代表算法执行的最差情况

渐进下界:代表算法执行的最好情况

渐进紧界:既能代表算法执行的最好情况,也能代表算法执行的最差情况

3.常见的大O表示法

  

4.空间复杂度

与时间复杂度类似,一般也是用大O表示法来衡量:一个算法执行随数据规模增大,而增长的额外空间成本。

5.二分查找性能 

五.插入数组

将数组中没有的元素插入进去

六.寻找最侧边元素

1.寻找最左侧元素

package com.algorithm.binarysearch;public class BinarySearch {/*params:a - 待查找的升序数组target - 待查找的目标值Returns:找到则返回索引找不到则返回-1* */public static int binarySearch(int[] a,int target){int i = 0,j = a.length - 1;int candidate = -1//表示没有任何候选者while(i<=j){int m = (i+j) >>> 1; if(target < a[m]){j = m - 1;}else if(target >a[m]){i = m + 1;}else {//记录侯选位置condidate = m;j = m - 1;}}return -1;
}

2.寻找最右侧元素

package com.algorithm.binarysearch;public class BinarySearch {/*params:a - 待查找的升序数组target - 待查找的目标值Returns:找到则返回索引找不到则返回-1* */public static int binarySearch(int[] a,int target){int i = 0,j = a.length - 1;int candidate = -1//表示没有任何候选者while(i<=j){int m = (i+j) >>> 1; if(target < a[m]){j = m - 1;}else if(target >a[m]){i = m + 1;}else {//记录侯选位置condidate = m;i = m + 1;}}return condidate;
}

http://www.dtcms.com/a/558952.html

相关文章:

  • 专业电商网站海口网站开发师招聘
  • 宁波网站建设有限公司导购网站开发
  • 什么网站做海报赚钱盐城网站建设设计
  • 网站免费正能量破解版网站开发工资咋样
  • 江苏公司响应式网站建设报价网页是啥
  • AlReader,一款多格式电子书阅读器
  • 如何推广企业官方网站内容瑞安做网站建设
  • 怎样做网站首页网站域名注册申请
  • 利用tex调用csv文件中的数据
  • 硅云网站建设视频wordpress观点
  • 花都建设网站保定厂家推荐信息流推广
  • Python 虚拟环境和包管理
  • 高端网站建设 aspx做衣服的3d软件
  • 网站页面设计怎么做百度知道首页网
  • Day3:自动化脚本与 Lambda
  • 网站制作培训一般要多少钱网页设计的工作
  • 做直播 网站的上市公司北京市建设工程信息网官方网站
  • C++:用红黑数封装实现map,set
  • 手机网站友情链接怎么做和易企秀类似的软件免费的
  • 网站seo外链建设四川seo快速排名
  • 住房和城乡建设部网站预售证公司介绍模板图片
  • 可以做手机网页的网站服装网站建设方法
  • 外卖网站建设费用怎么上传网站源码
  • Linux操作系统母盘便捷持久化部署方案
  • 东莞网站建设优化技术成都网站建设哪家
  • 永久免费的wap建站平台宿松网站建设设计
  • 大连网站怎么推广360seo关键词优化
  • 自己做qq头像的网站中卫企业管理培训网站
  • 大良网站建设如何wordpress的登录地址
  • 番禺建设局网站首页如何给网站做右侧导航栏