广告位联系
返回顶部
分享到

两种java实现二分查找的方式的介绍

java 来源:转载 作者:秩名 发布时间:2021-09-27 15:13:39 人浏览
摘要

起初在数据结构中学习递归时实现二分查找,实际上不用递归也可以实现,毕竟递归是需要开辟额外的空间的来辅助查询。本文就介绍两种方法 1、二分查找算法思想 有序的序列,每次都是以序列的中间位置的数来与待查找的关键字进行比较,每次缩小一半的查找范围,

起初在数据结构中学习递归时实现二分查找,实际上不用递归也可以实现,毕竟递归是需要开辟额外的空间的来辅助查询。本文就介绍两种方法

1、二分查找算法思想

有序的序列,每次都是以序列的中间位置的数来与待查找的关键字进行比较,每次缩小一半的查找范围,直到匹配成功。

一个情景:将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

2、二分查找图示说明

图片来源百度图片:



3、二分查找优缺点

优点:
比较次数少,查找速度快,平均性能好;

缺点:
是要求待查表为有序表,且插入删除困难。

因此,折半查找方法适用于不经常变动而查找频繁的有序列表。

使用条件:
查找序列是顺序结构,有序。

3、java代码实现

3.1 使用递归实现

/**
  * 使用递归的二分查找
  *title:recursionBinarySearch
  *@param arr 有序数组
  *@param key 待查找关键字
  *@return 找到的位置
  */
 public static int recursionBinarySearch(int[] arr,int key,int low,int high){
  
  if(key < arr[low] || key > arr[high] || low > high){
   return -1;   
  }
  
  int middle = (low + high) / 2;   //初始中间位置
  if(arr[middle] > key){
   //比关键字大则关键字在左区域
   return recursionBinarySearch(arr, key, low, middle - 1);
  }else if(arr[middle] < key){
   //比关键字小则关键字在右区域
   return recursionBinarySearch(arr, key, middle + 1, high);
  }else {
   return middle;
  }
  
 }

3.1 不使用递归实现(while循环)

 

/**
 * 不使用递归的二分查找
 *title:commonBinarySearch
 *@param arr
 *@param key
 *@return 关键字位置
 */
public static int commonBinarySearch(int[] arr,int key){
 int low = 0;
 int high = arr.length - 1;
 int middle = 0;   //定义middle
 
 if(key < arr[low] || key > arr[high] || low > high){
  return -1;   
 }
 
 while(low <= high){
  middle = (low + high) / 2;
  if(arr[middle] > key){
   //比关键字大则关键字在左区域
   high = middle - 1;
  }else if(arr[middle] < key){
   //比关键字小则关键字在右区域
   low = middle + 1;
  }else{
   return middle;
  }
 }
 
 return -1;  //最后仍然没有找到,则返回-1
}

3.3 测试

测试代码:

public static void main(String[] args) {

 int[] arr = {1,3,5,7,9,11};
 int key = 4;
 //int position = recursionBinarySearch(arr,key,0,arr.length - 1);
 
 int position = commonBinarySearch(arr, key);

              if(position == -1){
  System.out.println("查找的是"+key+",序列中没有该数!");
 }else{
  System.out.println("查找的是"+key+",找到位置为:"+position);
 }
 
}

recursionBinarySearch()的测试:key分别为0,9,10,15的查找结果

查找的是0,序列中没有该数!
 
查找的是9,找到位置为:4
 
查找的是10,序列中没有该数!
 
查找的是15,序列中没有该数!

commonBinarySearch()的测试:key分别为-1,5,6,20的查找结果

查找的是-1,序列中没有该数!
查找的是5,找到位置为:2
查找的是6,序列中没有该数!
查找的是20,序列中没有该数

4、时间复杂度

采用的是分治策略

最坏的情况下两种方式时间复杂度一样:O(log2 N)

最好情况下为O(1)

5、空间复杂度

算法的空间复杂度并不是计算实际占用的空间,而是计算整个算法的辅助空间单元的个数

非递归方式:
由于辅助空间是常数级别的所以:空间复杂度是O(1);

递归方式:递归的次数和深度都是log2 N,每次所需要的辅助空间都是常数级别的:

空间复杂度:O(log2N )


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://blog.csdn.net/maoyuanming0806/article/details/78176957
相关文章
  • SpringBoot自定义错误处理逻辑介绍

    SpringBoot自定义错误处理逻辑介绍
    1. 自定义错误页面 将自定义错误页面放在 templates 的 error 文件夹下,SpringBoot 精确匹配错误信息,使用 4xx.html 或者 5xx.html 页面可以打印错误
  • Java实现手写一个线程池的代码

    Java实现手写一个线程池的代码
    线程池技术想必大家都不陌生把,相信在平时的工作中没有少用,而且这也是面试频率非常高的一个知识点,那么大家知道它的实现原理和
  • Java实现断点续传功能的代码

    Java实现断点续传功能的代码
    题目实现:网络资源的断点续传功能。 二、解题思路 获取要下载的资源网址 显示网络资源的大小 上次读取到的字节位置以及未读取的字节
  • 你可知HashMap为什么是线程不安全的
    HashMap 的线程不安全 HashMap 的线程不安全主要体现在下面两个方面 在 jdk 1.7 中,当并发执行扩容操作时会造成环形链和数据丢失的情况 在
  • ArrayList的动态扩容机制的介绍

    ArrayList的动态扩容机制的介绍
    对于 ArrayList 的动态扩容机制想必大家都听说过,之前的文章中也谈到过,不过由于时间久远,早已忘却。 所以利用这篇文章做做笔记,加
  • JVM基础之字节码的增强技术介绍

    JVM基础之字节码的增强技术介绍
    字节码增强技术 在上文中,着重介绍了字节码的结构,这为我们了解字节码增强技术的实现打下了基础。字节码增强技术就是一类对现有字
  • Java中的字节码增强技术

    Java中的字节码增强技术
    1.字节码增强技术 字节码增强技术就是一类对现有字节码进行修改或者动态生成全新字节码文件的技术。 参考地址 2.常见技术 技术分类 类
  • Redis BloomFilter布隆过滤器原理与实现

    Redis BloomFilter布隆过滤器原理与实现
    Bloom Filter 概念 布隆过滤器(英语:Bloom Filter)是1970年由一个叫布隆的小伙子提出的。它实际上是一个很长的二进制向量和一系列随机映射
  • Java C++算法题解leetcode801使序列递增的最小交换次

    Java C++算法题解leetcode801使序列递增的最小交换次
    题目要求 思路:状态机DP 实现一:状态机 Java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 class Solution { public int minSwap(int[] nums1, int[] nums2) { int n
  • Mybatis结果集映射与生命周期介绍

    Mybatis结果集映射与生命周期介绍
    一、ResultMap结果集映射 1、设计思想 对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了 2、resultMap的应用场
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计