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)

 

标签: 算法与数据结构

目录
相关文章
|
4月前
|
存储 缓存 安全
除了变量,final还能修饰哪些Java元素
在Java中,final关键字不仅可以修饰变量,还可以用于修饰类、方法和参数。修饰类时,该类不能被继承;修饰方法时,方法不能被重写;修饰参数时,参数在方法体内不能被修改。
51 3
|
5月前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
68 3
|
5月前
|
Java
在Java的世界里,Set只接纳独一无二的元素。
【10月更文挑战第16天】在Java的世界里,Set只接纳独一无二的元素。本文通过拟人化的手法,讲述了重复元素从初次尝试加入Set被拒绝,到经历挣扎、反思,最终通过改变自己,成为独特个体并被Set接纳的全过程。示例代码展示了这一过程的技术实现。
41 1
|
4月前
|
监控 算法 Java
jvm-48-java 变更导致压测应用性能下降,如何分析定位原因?
【11月更文挑战第17天】当JVM相关变更导致压测应用性能下降时,可通过检查变更内容(如JVM参数、Java版本、代码变更)、收集性能监控数据(使用JVM监控工具、应用性能监控工具、系统资源监控)、分析垃圾回收情况(GC日志分析、内存泄漏检查)、分析线程和锁(线程状态分析、锁竞争分析)及分析代码执行路径(使用代码性能分析工具、代码审查)等步骤来定位和解决问题。
|
4月前
|
Java
那些与Java Set擦肩而过的重复元素,都经历了什么?
在Java的世界里,Set如同一位浪漫而坚定的恋人,只对独一无二的元素情有独钟。重复元素虽屡遭拒绝,但通过反思和成长,最终变得独特,赢得了Set的认可。示例代码展示了这一过程,揭示了成长与独特性的浪漫故事。
39 4
|
4月前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
4月前
|
存储 算法 Java
为什么Java Set如此“挑剔”,连重复元素都容不下?
在Java的集合框架中,Set是一个独特的接口,它严格要求元素不重复,适用于需要唯一性约束的场景。Set通过内部数据结构(如哈希表或红黑树)和算法(如哈希值和equals()方法)实现这一特性,自动过滤重复元素,简化处理逻辑。示例代码展示了Set如何自动忽略重复元素。
48 1
|
5月前
|
存储 Java 数据处理
Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。
【10月更文挑战第16天】Java Set:无序之美,不重复之魅!Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。通过 hashCode() 和 equals() 方法实现唯一性,适用于需要唯一性约束的数据处理。示例代码展示了如何使用 HashSet 添加和遍历元素,体现了 Set 的高效性和简洁性。
89 4
|
5月前
|
存储 Java 数据处理
Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。
Java Set:无序之美,不重复之魅!Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。它通过 hashCode() 和 equals() 方法确保元素唯一性,适用于需要唯一性约束的数据处理。示例代码展示了如何使用 HashSet 实现这一特性。
56 5
|
5月前
|
Java 开发者
在Java集合世界中,Set以其独特的特性脱颖而出,专门应对重复元素
在Java集合世界中,Set以其独特的特性脱颖而出,专门应对重复元素。通过哈希表和红黑树两种模式,Set能够高效地识别并拒绝重复元素的入侵,确保集合的纯净。无论是HashSet还是TreeSet,都能在不同的场景下发挥出色的表现,成为开发者手中的利器。
48 2

热门文章

最新文章