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

腾讯云学生机做网站四川省住房与城乡建设 厅网站

腾讯云学生机做网站,四川省住房与城乡建设 厅网站,如何用代码做网站,慈溪白云小学班级网站建设【数据结构与算法】二分查找 一、算法描述二、基础版三、改动版四、平衡版五、Java版六、LeftMost七、RightMost八、leftMost和rightMost改进1、leftMost2、rightMost 九、leftMost和rightMost应用 一、算法描述 在有序数组A内,查找值target: 如果找到…

【数据结构与算法】二分查找

  • 一、算法描述
  • 二、基础版
  • 三、改动版
  • 四、平衡版
  • 五、Java版
  • 六、LeftMost
  • 七、RightMost
  • 八、leftMost和rightMost改进
    • 1、leftMost
    • 2、rightMost
  • 九、leftMost和rightMost应用

一、算法描述

在有序数组A内,查找值target:

  • 如果找到返回索引
  • 查找失败返回-1

二、基础版

public static int binarySearchBasic(int[] a, int target) {int i = 0,j = a.length - 1;//设置指针和初值while (i <= j) {//i~j范围内有东西int m = (i + j) / 2;if(target < a[m]) {//目标在左边j = m - 1;} else if (a[m] < target) { //目标在右边i = m + 1;}else {//找到了return m;}}return -1;
}

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

  • i 和 j 同时指向的元素也会参与比较
  • i < j 只意味着m指向的元素参与比较

问题二:( i + j)/ 2 运算问题

  • 溢出,最后计算结果变为负数
  • int m = (i + j) / 2 修改为 int m = (i +j)>>>1

问题三:比较时都是小于符号好处?

三、改动版

public static int binarySearchBasic(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 (a[m] < target) { i = m + 1;}else {return m;}}return -1;
}

在基础版中i和j不止代表搜索边界,并且他们指向的元素也会参与计算,也叫左闭右闭。
在改动版中,j所指向的位置不希望参与运算。

四、平衡版

  1. 左闭右开的区间,i指向的可能是目标,而j指向的不是目标
  2. 不在循环内找出,等范围内只剩i时,退出循环,在循环外比较a[i]与target
  3. 循环内的平均比较次数减少了
  4. 时间复杂度e(log(n))
public static int binarySearch3(int[] a,int target){
int i = 0,j = a.length;while(1<j- i){int m =(i+ j)>>>1;if (target < a[m]){j =m;}else{i= m;}}if (a[i]== target){return i;}else {return -1;}
}

五、Java版

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如果找到了就返回索引,如果没找到就返回负的插入点-1,所以如果没有找到target那么我们的返回值中的low其实就是实际该插入的位置

为何不直接返回low?
为了区分插入点是0的情况,因为索引0存放的有数据,如果直接返回low,无法判断你是返回的索引还是想插入的位置。

eg:在数组[2,5,8]中插入4
在这里插入图片描述

    public int[] binarySearchInsert(int[] nums, int insertNum ){int i = Arrays.binarySearch(nums, insertNum);//返回值应该是-(插入位置+1)i= Math.abs(i+1);//插入位置int[] newNums = new int[nums.length+1];//先将插入位置前的数据拷贝进去System.arraycopy(nums,0,newNums,0,i);//将目标值放进去newNums[i] = insertNum;//将初始数组剩下部分放进去System.arraycopy(nums,i,newNums,i+1,nums.length-i);return newNums;}

六、LeftMost

在之前的版本中如有出现重复元素,那么则返回遇到的第一个重复元素,改动代码 返回重复元素的最靠左侧的元素。
在这里插入图片描述
①设置变量记录候选位置,初始化-1
②当找的一个满足条件的数,不直接返回,而是记录候选位置
③找到重复元素的最左侧元素,应该往左侧区域查找,设置j=m-1
④返回候选位置,为正数代表存在且找到,返回负数代表不存在

七、RightMost

找到重复元素中最靠右的元素的位置。
在这里插入图片描述

八、leftMost和rightMost改进

1、leftMost

在leftMost和rightMost中没有查找到时都是返回一个没有意义的 -1 ,如何改进使之具有意义? 返回 i 。

  • 返回i 之后变量candidata的存在就没有意义,删除
  • 删除后,if判断和else板块内容一样,合并
    在这里插入图片描述
    改进后如下:
    在这里插入图片描述
    在查找到的情况下,依旧返回重复元素最靠左元素的索引位置。
    在查找不到的情况,返回的是比查找目标大的最左侧的索引位置。
    总结: i就是大于等于目标的最靠左的位置。
    在这里插入图片描述

2、rightMost

在这里插入图片描述
在这里插入图片描述
i就是小于等于目标的最靠右的位置。

九、leftMost和rightMost应用

①求排名
②求前任、后任、最近邻居
③求某个区间的数
在这里插入图片描述

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

相关文章:

  • 广州知名网站提高网站可用性的策略有哪些
  • 自己做网站nas什么网站做博客好
  • 成都网站内容策划关于网站建设的技巧
  • 网站建设可行性及需求分析什么网站能接单做网站
  • 乐清站在那儿专门做书单的网站
  • 企业网站ui设计wordpress ftp服务器
  • 太仓建设局网站网站首页设计效果图
  • 织梦可以做视频网站么域名服务器分为
  • 北京网站优化公司哪里稳定网站网址怎么写
  • 甘肃网站建设费用工会网站建设方案
  • 热门关键词查询新上线的网站怎么做优化
  • 网站 多线买医疗产品的网站建设
  • 微信网站案例三门峡做网站推广
  • 南阳网站运营学软件开发需要学什么
  • 邢台网站网站建设wordpress 上传
  • dedecms 5.7 通用企业网站模板吾爱网站
  • 创建网站的步骤网站客户端ip做爬虫
  • 上地网站制作客户关系管理系统软件有哪些
  • 网站的源码织梦网站优化
  • 凡客诚品被谁取代了长沙seo优化方案
  • 电子商务网站开发人员要求想创业做网站
  • html5网站制作软件临沂专业网站制作
  • 秦皇岛市网站制作公司网站开发使用软件环境
  • 东莞石龙网站建设定制互联网推广是什么工作
  • python 组合求和 (回溯-中等)含源码(十七)
  • 注册域名哪个网站好京东的网站建设
  • 怎么用织梦模板做网站短视频动画制作
  • 重庆网站域名备案地址东营区住建行业信用平台
  • 2013电子商务网站建设考试试卷网站三d图怎么做
  • 网站建设平台计划书开发网站网络公司怎么样