Java 使用二分查找快速定位元素位置

简介: Java 使用二分查找快速定位元素位置

转载请注明出处:

  快速定位 一个有序数列中 某一个元素的位置;

  共有三种思路:

    第一种:使用 for 循环,匹配元素值 与循环变量的值是否相等,相等则循环变量时的 i 则为元素位置

    第二种:使用 二分法 与递归,二分法为折半思想,通过递归折半,找到元素的位置

    第三种:使用 二分发 与 while 循环,在while 循环中,以 元素值得 最大值与最小值关系,在while 循环中,通过二分法,不断修改 元素区间的最大值与最小值

  实现:

    第一种 for 循环的代码省略。

    第二种,使用 二分法 与 递归 与 第三种实现方式如下:

转载请注明出处:

  快速定位 一个有序数列中 某一个元素的位置;

  共有三种思路:

    第一种:使用 for 循环,匹配元素值 与循环变量的值是否相等,相等则循环变量时的 i 则为元素位置

    第二种:使用 二分法 与递归,二分法为折半思想,通过递归折半,找到元素的位置

    第三种:使用 二分发 与 while 循环,在while 循环中,以 元素值得 最大值与最小值关系,在while 循环中,通过二分法,不断修改 元素区间的最大值与最小值

  实现:

    第一种 for 循环的代码省略。

    第二种,使用 二分法 与 递归 与 第三种实现方式如下:

复制代码
package com.example.demo.lettcode;

/**
 * 使用二分查找,快速定位元素位置和是否存在
 * 当使用二分查找时,必须保证是有序数列,只有有序数列才能进行大小的左右分边
 */
public class BinarySearch {
    public static void main(String[] args) {
        int arr[] = {1,3,4,5,6,7,8,12};
        System.out.println(arr.length);
        // 使用递归与二分法
        int index = binarySearch(arr,4,0,arr.length-1);
        System.out.println(index);
        // 使用while 循环与二分法
        int index2 = cycleFind(arr,4);
        System.out.println(index2);
    }

    /**
     * 使用递归与二分法
     * @param arr
     * @param value
     * @param start
     * @param end
     * @return
     */
    public static int binarySearch(int[] arr, int value, int start, int end) {
        //判断在有序列表中是否存在
        if (value < arr[start] || value > arr[end] || start > end) {
            return -1;
        }

        int middle = (start + end) / 2;
        int index = 0;
        if (arr[middle] > value) {
            //位于中间值得左边
            index = binarySearch(arr, value, start, middle - 1);
        } else if (arr[middle] < value) {
            // 位于中间值得右边
            index = binarySearch(arr, value,middle + 1, end );

        } else {
            return middle;
        }
        return index;
    }

    /**
     * 使用while循环与二分法
     * @param arr
     * @param value
     * @return
     */
    public static int cycleFind(int[] arr, int value) {
        int low = 0;
        int middle = 0;
        int high = arr.length - 1;

        while (low <= high) {
            middle = (low + high) / 2;
            if (arr[middle] > value) {
                high = middle - 1;
            } else if (arr[middle] < value) {
                low = middle + 1;
            } else {
                return middle;
            }
        }
        return -1;
    }

}
复制代码
 

  分析:

    使用递归方式时,递归的次数和深度都是log2 N,每次所需要的辅助空间都是常数级别的: 空间复杂度:O(log2N )

    非递归方式时,空间复杂度为 O(1)

 

标签: 算法与数据结构

 

  分析:

    使用递归方式时,递归的次数和深度都是log2 N,每次所需要的辅助空间都是常数级别的: 空间复杂度:O(log2N )

    非递归方式时,空间复杂度为 O(1)

 

标签: 算法与数据结构

目录
相关文章
|
11月前
|
存储 缓存 安全
除了变量,final还能修饰哪些Java元素
在Java中,final关键字不仅可以修饰变量,还可以用于修饰类、方法和参数。修饰类时,该类不能被继承;修饰方法时,方法不能被重写;修饰参数时,参数在方法体内不能被修改。
137 3
|
6月前
|
监控 Java Unix
6个Java 工具,轻松分析定位 JVM 问题 !
本文介绍了如何使用 JDK 自带工具查看和分析 JVM 的运行情况。通过编写一段测试代码(启动 10 个死循环线程,分配大量内存),结合常用工具如 `jps`、`jinfo`、`jstat`、`jstack`、`jvisualvm` 和 `jcmd` 等,详细展示了 JVM 参数配置、内存使用、线程状态及 GC 情况的监控方法。同时指出了一些常见问题,例如参数设置错误导致的内存异常,并通过实例说明了如何排查和解决。最后附上了官方文档链接,方便进一步学习。
664 4
|
3月前
|
Arthas 监控 Java
Java死锁 如何定位?如何避免Java死锁?(图解+秒懂+史上最全)
Java死锁 如何定位?如何避免Java死锁?(图解+秒懂+史上最全)
Java死锁 如何定位?如何避免Java死锁?(图解+秒懂+史上最全)
|
5月前
|
搜索推荐 Java 定位技术
Java实现利用GeoLite2-City.mmdb根据IP定位城市的方法
在城市,国家,地区等地理位置数据获取之后,你可以依指定的业务需求,来进行进一步的数据处理。例如,你可以设计一个应用,根据用户的 IP 地址来个性化地展示内容,或者用于分析网络请求的来源等。
856 20
|
12月前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
134 3
|
12月前
|
Java
在Java的世界里,Set只接纳独一无二的元素。
【10月更文挑战第16天】在Java的世界里,Set只接纳独一无二的元素。本文通过拟人化的手法,讲述了重复元素从初次尝试加入Set被拒绝,到经历挣扎、反思,最终通过改变自己,成为独特个体并被Set接纳的全过程。示例代码展示了这一过程的技术实现。
77 1
|
11月前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
604 113
|
11月前
|
监控 算法 Java
jvm-48-java 变更导致压测应用性能下降,如何分析定位原因?
【11月更文挑战第17天】当JVM相关变更导致压测应用性能下降时,可通过检查变更内容(如JVM参数、Java版本、代码变更)、收集性能监控数据(使用JVM监控工具、应用性能监控工具、系统资源监控)、分析垃圾回收情况(GC日志分析、内存泄漏检查)、分析线程和锁(线程状态分析、锁竞争分析)及分析代码执行路径(使用代码性能分析工具、代码审查)等步骤来定位和解决问题。
214 6
|
11月前
|
Java
那些与Java Set擦肩而过的重复元素,都经历了什么?
在Java的世界里,Set如同一位浪漫而坚定的恋人,只对独一无二的元素情有独钟。重复元素虽屡遭拒绝,但通过反思和成长,最终变得独特,赢得了Set的认可。示例代码展示了这一过程,揭示了成长与独特性的浪漫故事。
71 4
|
12月前
|
存储 Java
深入理解java对象的访问定位
这篇文章深入探讨了Java对象的访问定位机制,比较了使用句柄和直接指针两种主流的对象访问方式,并指出了它们各自的优势,例如句柄访问在对象移动时的稳定性和直接指针访问的速度优势。
106 1
深入理解java对象的访问定位