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

傻瓜式网站简单界面wordpress 简洁文章主题

傻瓜式网站简单界面,wordpress 简洁文章主题,郴州网约车,流量精灵app🔥博客主页: 小扳_-CSDN博客 ❤感谢大家点赞👍收藏⭐评论✍ 目录 1.0 二分查找法的说明 2.0 二分查找实现的多种版本 2.1 二分查找的基础版本 2.2 二分查找的改动版本 2.3 二分查找的平衡版本 2.4 二分查找的官方版本 3.0 二分查找的应用 1…

🔥博客主页: 小扳_-CSDN博客
❤感谢大家点赞👍收藏⭐评论✍
  

 

目录

        1.0 二分查找法的说明

        2.0 二分查找实现的多种版本

        2.1 二分查找的基础版本

        2.2 二分查找的改动版本

        2.3 二分查找的平衡版本

        2.4 二分查找的官方版本

        3.0 二分查找的应用


        1.0 二分查找法的说明

        二分查找法(Binary Search)是一种在有序数组有序列表中查找特定元素的搜索算法。其基本思想是将数组或列表分成两部分,取中间位置的元素进行比较,若该元素等于目标值,则查找成功若该元素大于目标值,则在左半部分继续查找若该元素小于目标值,则在右半部分继续查找。不断重复这个过程,直到找到目标值或查找范围缩小到只剩下一个元素为止。

        需要重点注意的是,使用二分查找的前提必须是数组是有序的或者列表是有序的。

        2.0 二分查找实现的多种版本

        基本来说可以分为基础版本和改动版本、平衡版、官方版本。

        2.1 二分查找的基础版本

        先来讲讲具体的实现吧,需要一个有序的数组 arr[] 或者有序列表,还有拿到需要查找的目标元素 int target

        需要定义一下三种变量:

        第一种,int left ;一开始记录着是最左边的元素的索引,即为 0.

        第二种,int right;一开始记录着是最右边的元素的索引,即为 array.length - 1

        第三种,int mid;记录着是中间的元素的索引,即为(left + right)>>> 1;

        接着先要用 arr[mid] 的元素与 target 进行对比,这时候就会有三种情况,分别做不同的处理,假如 if(arr[mid] < target ),中间的元素小于目标元素时,要对 left 进行 left = mid + 1处理,假如 if(arr[mid] > target ),中间的元素大于目标元素时,要对 right 进行 right = mid - 1处理,假如 if(arr[mid] = target ),这时候就找到了目标元素了,直接返回 mid ,因此这是一个循环的过程,不断缩小范围来寻找目标元素,这一切都需要满足 left <= right 这个条件。

具体代码实现如下:

public class BinarySearch {public static void main(String[] args) {int[] arr = {1,3,5,7,9,11};int target = 3;System.out.println(search(arr, target));}public static int search(int[] arr, int target){int left = 0;int right = arr.length - 1;while (left <= right){int mid = (left + right) >>> 1;if (arr[mid] < target){left = mid + 1;} else if (target < arr[mid]) {right = mid - 1;}else {return mid;}}return -1;}
}

运行结果如下:

        目标元素3的索引为1,补充一下,若没有找到的话,这里定义返回为 -1 。

        2.2 二分查找的改动版本

        这个版本在基础版本的基础上进行了三点改动:

        第一点;int right;一开始记录着是最右边的元素的索引,即为 array.length 。

        注意,在基础版本中是需要减1的,而这里直接取元素个数,当然我们都知道这个会出现越界情况,所以才会有第二点改动 。

        第二点;这一切都需要满足 left < right 这个条件。

        这基础版本中循环条件是需要 <= 的条件,这里就不需要了,来分析一下为什么呢?

        原因就在第一点,在 right 索引下的元素是不可取的,重点在<不可取>,仔细品味一下,无论right 在之后的循环中得到的所有索引都是不可取到的元素。

        第三点;假如 if(arr[mid] > target ),中间的元素大于目标元素时,要对 right 进行 right = mid 处理。

具体代码实现如下:

public class NewBinarySearch {public static void main(String[] args) {int[] arr = {1,3,5,7,9,11};int target = 3;System.out.println(search(arr, target));}public static int search(int[] arr, int target) {int left = 0;int right = arr.length;while (left < right) {int mid = (left + right) >>> 1;if (arr[mid] < target) {left = mid + 1;} else if (target < arr[mid]) {right = mid;} else {return mid;}}return -1;}
}

运行结果如下:

         2.3 二分查找的平衡版本

        相对比与第一、两种,这个版本的效率会更高一点。这种版本的思路就是将范围不断缩小为1,然后获取 left 索引下的元素,来判断是否等于目标元素。

具体代码如下:

public class NewBinarySearch {public static void main(String[] args) {int[] arr = {1,3,5,7,9,11};int target = 3;System.out.println(search(arr, target));}public static int search (int[] arr, int target){int left = 0;int right = arr.length;while (1 < right - left){int mid = (left + right) >>> 1;if (target < arr[mid]){right = mid;} else  {left = mid;}}if (arr[left] == target){return left;}else {return -1;}}
}

运行结果如下:

        2.4 二分查找的官方版本

直接来看原代码:

        来分析一下,从总体来看,官方的二分查找的实现跟第一种的基本版本是大致相同的,有一点跟基础版本的不同的是,就是返回值。在基础版本中,如果找不到就返回 -1,而这里返回的是 -(low + 1),接下来具体讲解一下。

        第一点low 代表的是插入点,这个值跟 left 的值是一样的。

        第二点,关于负数的说法,一般来说找不到的元素时,会返回负数。

具体代码的实现:

public class NewBinarySearch {public static void main(String[] args) {int[] arr = {1,3,5,7,9,11};int target = 2;System.out.println(search(arr, target));}public static int search(int[] arr, int target) {int left = 0;int right = arr.length - 1;while (left <= right) {int mid = (left + right) >>> 1;if (arr[mid] < target) {left = mid + 1;} else if (target < arr[mid]) {right = mid - 1;} else {return mid;}}return -(left + 1);}
}

运行结果如下:

        来算一下,我们知道 2 在数组中是不存在的,插入点为 1 ,则-(1+1)==  -2,验证了是符合的结果的。

 

        3.0 二分查找的应用

        给出下列数组 int[] arr {1,2,3,3,3,3,5,6,7} 要求返回目标元素3的起始位置与结束位置。

        实现的思路:先找起始位置,首先得先找到目标元素的索引,之后得往左边去找找结束位置也是同理,首先得先找到目标元素的索引,之后得往右边去找

代码如下:

public class NewBinarySearch {public static void main(String[] args) {int[] arr = {1,2,3,3,3,3,5,6,7};int target = 3;System.out.print(findLeft(arr, 3)+" ");System.out.println(findRight(arr, 3));}public static int findLeft(int[] arr,int target){int left = 0;int right = arr.length - 1;int sign = -1;while (left <= right){int mid = (left + right) >>> 1;if (arr[mid] < target){left = mid + 1;} else if (target < arr[mid]) {right = mid - 1;}else {sign = mid;right = mid - 1;}}return sign;}public static int findRight(int[] arr, int target){int left = 0;int right = arr.length - 1;int sign = -1;while (left <= right){int mid = (left + right) >>> 1;if (arr[mid] < target){left = mid + 1;} else if (target < arr[mid]) {right = mid - 1;}else {sign = mid;left = mid + 1;}}return sign;}
}

运行结果如下:

 

http://www.yayakq.cn/news/75293/

相关文章:

  • 永州市城乡建设规划局网站网站建设费要摊销
  • 佛山网站建设怎么办如何百度注册公司官网
  • 北京模板网站开发公司商城网站模板
  • asp网站500错误邯郸建移动网站费用
  • 邯郸网站建设报价养殖推广网站怎么做
  • 网络创作网站wordpress 留言插件
  • 创新的品牌网站建设嘉兴网站制作网站建设
  • 建设银行官网首页网站购纪念币wordpress 不能登录
  • 襄阳谷城网站开发WordPress无缩略图文章筛选
  • 建材有限公司光速东莞网站建设做网站长沙
  • 百度智能门户建站怎么样专门做搜索种子的网站
  • 企业网站的建设水平直接关系到网络营销的效果怎么下载在线视频
  • 教师做网站赚钱做高端网站
  • 前端网站搜索导航怎么做网站推广渠道咨询
  • 基于php网站建设论文做网站遇到的问题
  • 手机网站排行榜做网站为什么可以自学
  • 宿迁企业做网站网站建设除了凡科还有哪些
  • wordpress建站百科自助建站系统哪个最好用
  • 网站建设管理意见北京优秀网站建设
  • 做的门户网站怎么绑定ip地址毛网商城
  • wordpress 注册用户列表seo百度优化排名
  • 三好街网站建设与维护海南电子商务网站
  • 政务公开做的好的网站有哪些牡丹江做网站的公司
  • 企业微信网站建设有没有帮忙做网站的
  • 企业信息管理系统免费商城网站怎么做seo
  • 只有一个页面的网站昆明做网站首选互维
  • 企业网站建设合同模板html5和html的区别
  • 新余建网站猪八戒设计网站如何做兼职
  • 婚庆类网站模板北京网站建设116net
  • 政协网站法治建设免费做彩页网站