美文网首页
数据结构--二分查找法

数据结构--二分查找法

作者: Hayley__ | 来源:发表于2020-12-17 17:17 被阅读0次

二分查找法 (Binary Search)

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

示例(Java)

递归逻辑

   public static <E extends Comparable<E>> int search(E[] data, E target){
        return search(data, 0, data.length - 1, target);
    }

    //递归
    private static  <E extends Comparable<E>> int search(E[] data, int l, int r, E target) {
        if( l > r) return  -1;
        int mid = l + (r - l)/2;
        if (data[mid].compareTo(target) > 0)
            return search(data, l, mid, target);
        if(data[mid].compareTo(target) < 0)
            return search(data, mid + 1, r, target);
        return mid;
    }

非递归逻辑

    public static <E extends Comparable<E>> int search2(E[] data, E target) {
        int l = 0, r = data.length - 1;
        while (l <= r) {
            int mid = l + (r - l)/2;
            if (data[mid].compareTo(target) == 0)
                return mid;
            if (data[mid].compareTo(target) < 0)
                l = mid + 1;
            else
                r = mid - 1;
        }
        return -1;
    }
Binary Search

时间复杂度:

时间复杂度(不算排序):O(logn)

相关变种问题

    // >target 的最小值的索引
    public static <E extends Comparable<E>> int upper(E[] data, E targt){
        // r = data.length 表示>target的值在数组最后一个元素的后面 数组中的所有元素都<target
        int l = 0, r = data.length;
        while (l< r) {
            int mid = l + (r- l)/2;
            if (data[mid].compareTo(targt) <= 0)
                l = mid + 1;
            else
                r = mid;
        }
        return l;
    }

    // > target, 返回最小索引
    // = target, 返回最大索引
    public static <E extends Comparable<E>> int upperCeil(E[] data, E targt){
        int u = upper(data,targt);
        if (u - 1 >= 0 && data[u - 1].compareTo(targt) == 0)
            return u - 1;
        return  u;
    }

    // >= target 的最小索引
    public static <E extends Comparable<E>> int lowerCeil(E[] data, E target){
        int l = 0, r = data.length;
        while (l < r) {
            int mid = l + (r - l)/2;
            if (data[mid].compareTo(target) < 0)
                l = mid + 1;
            else
                r = mid;
        }
        return l;
    }

    // <target 的最大值的索引
    public static <E extends Comparable<E>> int lower(E[] data, E target){
        int l = -1, r = data.length - 1;
        //当l与r相邻时 eg:0, 1 是 mid由于计算机下取整 mid = l + (r - l)/2 = 0, 所以l = 0 引起死循环。
        //解决办法: mid = l + (r - l + 1)/2 采用上取整
        while (l < r) {
            int mid = l + (r - l + 1)/2;
            if (data[mid].compareTo(target) >= 0)
                r = mid - 1;
            else
                l = mid;
        }
        return l;
    }

    // <= target 的最大索引
    public static <E extends Comparable<E>> int upperFloor(E[] data, E target){
        int l = -1, r = data.length - 1;
        //当l与r相邻时 eg:0, 1 是 mid由于计算机下取整 mid = l + (r - l)/2 = 0, 所以l = 0 引起死循环。
        //解决办法: mid = l + (r - l + 1)/2 采用上取整
        while (l < r) {
            int mid = l + (r - l + 1)/2;
            if (data[mid].compareTo(target) > 0)
                r = mid - 1;
            else
                l = mid;
        }
        return l;
    }

    // < target 的最大索引
    // = target 的最小索引
    public static <E extends Comparable<E>> int lowerFloor(E[] data, E target){
        int l = lower(data, target);
        if (l + 1 <  data.length && data[l + 1].compareTo(target) == 0)
            return l + 1;
        return  l;
    }

相关文章

  • 排序算法

    算法与数据结构基础 查找算法: 二分查找法: 简介:二分查找法又被称为折半查找法,用于预排序的查找问题 过程: 如...

  • 二分查找法

    二分查找法 二分查找法(递归)

  • 【爬虫】数据结构实现折半查找的算法

    数据结构实现折半查找的算法 折半查找技术,也就是二分查找,通常称为二分法查找。它的前期是线性表中的记录必须是关键码...

  • [老实李] 算法初探:二分查找法 Binary Search

    二分查找法主要用来解决查找的问题 1、二分查找法Binary Search (注)对于有序数列才能使用二分查找法。...

  • 算法:二分法查找(折半查找法)

    算法:二分法查找(折半查找法) 这是最经典的折半查找,而在面试的时候往往会对某些经典的数据结构和算法进行魔改,这道...

  • 二分法查找

    二分法基本查找 二分法遍历查找

  • 二分法查找

    二分法查找的前提是数组必须排序!!!二分法查找的前提是数组必须排序!!!二分法查找的前提是数组必须排序!!!二分法...

  • 二分排序法

    二分排序法,实际上是二分查找法+直接插入排序法的灵活组合。 先来看看二分查找法,二分查找法的前提是给出的队列是有序...

  • 算法(3)- 数组

    数组中的问题其实最常见如:排序(选择排序、插入排序、归并排序、快速排序)、查找(二分查找法)、数据结构(栈、队列、...

  • python二分查找算法

    文章概述 二分查找法介绍 简单查找与二分查找对比 二分查找  二分查找算法主要思想:在有序列表中查找指定元素,先从...

网友评论

      本文标题:数据结构--二分查找法

      本文链接:https://www.haomeiwen.com/subject/nqjogktx.html