美文网首页Leetcode
二分查找&变体

二分查找&变体

作者: zxmcoder | 来源:发表于2020-04-29 21:55 被阅读0次
  • 二分查找其实占用的内存比较少,但是如果是寻找给定值的数据时,二分查找虽然占用内存小,但是用散列表或者二叉搜索树代替。
  • 二分查找不适合非数组,也不适合数组一直在频繁的插入删除(因为要频繁排序)
  • 二分查找的变体情况用的比较多,也就是搜索近似。

代码&测试如下:

import java.util.*;

public class BinSearch
{
    //测试的主类
    public static void main(String args[])
    {
        // int[] arr=new int[10];
        // for(int i=0;i<10;++i)
        //     arr[i]=(int)(Math.random()*20); 
        // Arrays.sort(arr);       
        // for(int i=0;i<arr.length;++i)
        //     System.out.print(arr[i]+" ");
        // System.out.println();
        // //随机生成10个数,测试b1,b2
        // System.out.println(bSearch(arr,3));
        // System.out.println(bSearch2(arr,3));
        // //测试哦bSearch3
        int[] arr2={1,1,1,1,2,2,2,3,3,3};
        // System.out.println(bSearch3(arr2,1));
        // System.out.println(bSearch3(arr2,2));
        // System.out.println(bSearch3(arr2,3));
        //测试b4
        // System.out.println(bSearch4(arr2,1));
        // System.out.println(bSearch4(arr2,2));
        // System.out.println(bSearch4(arr2,3));
        // System.out.println(bSearch4(arr2,4));
        //测试b5
        // System.out.println(bSearch5(arr2,1));
        // System.out.println(bSearch5(arr2,2));
        // System.out.println(bSearch5(arr2,3));
        // System.out.println(bSearch5(arr2,4));
        //测试b6
        System.out.println(bSearch6(arr2,1));
        System.out.println(bSearch6(arr2,2));
        System.out.println(bSearch6(arr2,3));
        System.out.println(bSearch6(arr2,4));
    }
    //第一种二分搜索,适用与判断数组中有没有这个元素
    public static boolean bSearch(int[] arr,int num)
    {
        int low=0;
        int high=arr.length-1;
        int mid;
        while(low<=high)
        {
            //mid=(low+high)/2;
            mid=low+((high-low)>>2);
            if(arr[mid]==num)
                return true;
            else if(arr[mid]<num)
                low=mid+1;
            else
                high=mid-1;
        }
        return false;
    }
    //第二种二分搜索,适用无重复元素,搜索num出现的唯一的下标
    public static int bSearch2(int[] arr,int num)
    {
        int low=0;
        int high=arr.length-1;
        int mid;
        while(low<=high)
        {
            //mid=(low+high)/2;
            mid=low+((high-low)>>2);
            if(arr[mid]==num)
                return mid;
            else if(arr[mid]<num)
                low=mid+1;
            else
                high=mid-1;
        }
        return -1;
    }
    //第三种二分搜索,寻找有重复元素中的第一个元素的下标
    public static int bSearch3(int[] arr,int num)
    {
        int low=0;
        int high=arr.length-1;
        int mid;
        while(low<=high)
        {
            //mid=(low+high)/2;
            mid=low+((high-low)>>2);
            if(arr[mid]>num)
                high=mid-1;
            else if(arr[mid]<num)
                low=mid+1;
            else
            {
                if(mid==0||arr[mid-1]!=num)
                    return mid;
                else
                    high=mid-1;
            }
        }
        return -1;
    }
    //第四种二分搜索,寻找有重复元素中的最后一个元素的下标
    public static int bSearch4(int[] arr,int num)
    {
        int low=0;
        int high=arr.length-1;
        int n=arr.length;
        int mid;
        while(low<=high)
        {
            //mid=(low+high)/2;
            mid=low+((high-low)>>2);
            if(arr[mid]>num)
                high=mid-1;
            else if(arr[mid]<num)
                low=mid+1;
            else
            {
                if(mid==n-1||arr[mid+1]!=num)
                    return mid;
                else
                    low=mid+1;
            }
        }
        return -1;
    }
    //第五种二分搜索,寻找第一个大于等于num的元素
    public static int bSearch5(int[] arr,int num)
    {
        int low=0;
        int high=arr.length-1;
        int n=arr.length;
        int mid;
        while(low<=high)
        {
            //mid=(low+high)/2;
            mid=low+((high-low)>>2);
            if(arr[mid]>=num)
            {
                if(mid==0||arr[mid-1]<num)
                    return mid;
                else
                    high=mid+1;
            }
            else
                low=mid+1;
        }
        return -1;
    }
    //第六种二分搜索,寻找最后一个小于等于num的元素
    public static int bSearch6(int[] arr,int num)
    {
        int low=0;
        int high=arr.length-1;
        int n=arr.length;
        int mid;
        while(low<=high)
        {
            //mid=(low+high)/2;
            mid=low+((high-low)>>2);
            if(arr[mid]<=num)
            {
                if(mid==n-1||arr[mid+1]>num)
                    return mid;
                else
                    low=mid+1;
            }
            else
                high=mid-1;
        }
        return -1;
    }
}

相关文章

  • 二分查找&变体

    二分查找其实占用的内存比较少,但是如果是寻找给定值的数据时,二分查找虽然占用内存小,但是用散列表或者二叉搜索树代替...

  • 二分查找(变体)

    今天写4种二分查找的变体分别是查找第一个值等于给定值的元素查找最后一个值等于给定值的元素查找第一个值大于等于给定值...

  • 【算法打卡60天】Day14二分查找(下):如何快速定位IP对应

    学习内容:四种常见的二分查找变形问题1.变体一:查找第一个值等于给定值的元素2.变体二:查找最后一个值等于给定值的...

  • 二分查找以及变体

    标准二分查找 使用场景 排序的数组(排序,且支持随机读取) 不大不小的数据, 大了的话,数组太大,木有那么大的连续...

  • 二分查找的变体

    二分查找在已经排序好的数组中寻找某个值。它是最常见的O(lgn)时间复杂度算法。 标准写法 大学教科书上只会给出一...

  • 二分查找的几种变体

    在一个有序数组中查找某个元素,采用二分查找是非常高效的,其查找只需要 O(logn) 的时间复杂度就可以了。如果数...

  • 二分查找(变体)代码框架

    1.说明 前面介绍了二分查找代码框架[https://www.jianshu.com/p/6423f7367615...

  • 二分查找的4种变体

    在基本的二分查找法中,我们规定给定数组是不重复且有序的(一般为升序),这几个变体的规则有些变化,仍然是升序元素,但...

  • 二分查找

    使用场景:下标随机访问元素的顺序表,有序,数据量适中(过小顺序查找,过大连续内存不够)二分法变体:查找第一个给定值元素。

  • python二分查找算法

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

网友评论

    本文标题:二分查找&变体

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