美文网首页C++数据结构和算法分析程序员
可查找重复元素的二分查找算法

可查找重复元素的二分查找算法

作者: 奇迹迪 | 来源:发表于2018-05-26 14:12 被阅读127次

可查找重复元素的二分查找算法

二分查找算法思想:又称为 折半查找,二分查找适合对已经排序好的数据集合进行查找。假设有一升序的数据集合,先找出升序集合中最中间的元素,将数据集合划分为两个子集,将最中间的元素和关键字key进行比较,如果等于key则返回;如果大于关键字key,则在前一个数据集合中查找;否则在后一个子集中查找,直到找到为止;如果没找到则返回-1。

思路:

1、先定义两个下标 , left = 0 , right = arr.length -1;

2、因为我们也不知道要循环多少次,定义一个while循环,终止条件为right>left

3、因为是二分查找,定义一个mid = left + (right - left)/2; //;防止数据过大溢出

4、定义三个if语句,如果 target == arr[mid], return mid;这是经典的二分查找,我们需要在这做改进

4.1、改进经典二分算法,二分查找是基于有序的数组,重复的元素都在一起。我们只需要在if(target == arr[mid])里面修改即可;我们需要返回第一个出现target的下标;因为我们也不知道mid前面有几个重复的元素因此我们需要一个while(mid>=0)的循环,mid--,然后比对arr[mid]和target,只要不一样就终止,返回

5、如果 target < arr[mid] , right = mid - 1;

6、如果target > arr[mid] , left = mid + 1;

知道了思路,我们来编程实现一下吧

/**
     * 可查找重复元素的二分查找算法
     * 思路:  
     *  1、先定义两个下标 , left = 0 , right = arr.length -1;
     *  2、因为我们也不知道要循环多少次,定义一个while循环,终止条件为right>left
     *  3、因为是二分查找,定义一个mid = left + (right - left) / 2;防止数据过大溢出
     *  4、定义三个if语句,如果 target == arr[mid], return mid;这是经典的二分查找,我们需要在这做改进
     *  4.1、改进经典二分算法,因为可能有重复元素,我们需要返回第一个出现target的下标;因为我们也不知道mid前面有几个重复的元素
     * 因此我们需要一个while(mid>=0)的循环,mid--,然后比对arr[mid]和target,只要不一样就终止,返回
     *  5、如果 target < arr[mid] , right = mid - 1;
     *  6、如果target > arr[mid] , left = mid + 1;
     * @param nums
     * @param target
     * @return
     */
    public static int binarySearch(int[] nums , int target){
        
        int left = 0;
        int right = nums.length - 1;
        
        while(left <= right ) {
            int mid = (left + (right - left) / 2);
            if( target == nums[mid] ) {
                while(mid >= 0) {
                    if(nums[mid] != target) {
                        break;
                    }
                    mid--;
                }
                if(mid <= -1 ) {
                    return 0;
                }
                return mid + 1;//多减了一次,返回的时候需要再加1
            }else if( target < nums[mid] ) {
                right = mid - 1;
            }else {
                left = mid + 1;
            }
        }
        
        return -1;
    }

相关文章

  • 可查找重复元素的二分查找算法

    可查找重复元素的二分查找算法 二分查找算法思想:又称为 折半查找,二分查找适合对已经排序好的数据集合进行查找。假设...

  • 大厂敲门砖——算法!手撸3道高频算法题,检测真水平!

    3道高频算法题 手撸算法1:查找数组中重复元素和重复元素的个数 手撸算法2:写个二分查找demo吧 手撸算法3:把...

  • python二分查找算法

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

  • 2020-08-26

    二分查找 描述 二分查找是一种算法,其输入是一个有序的元素列表(元素可比较),如果查找的元素包含在列表中,二分查找...

  • 数据结构之二分查找

    二分查找(Binary Search)算法,也叫折半查找算法,当我们要从一个序列中查找一个元素的时候,二分查找是一...

  • 【leetcode边做边学】二分查找应用

    二分查找 二分查找算法是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好...

  • 二分查找

    二分查找必须是有序集 二分查找每次可排除掉一半的元素,最坏的情况下要查找 log(n) 次算法运行时间是 O(...

  • 数据结构和算法--二分查找

    二分查找 二分查找的思想 二分查找(Binary Search)算法,也叫折半查找算法。 二分查找针对的是一个有序...

  • 算法之二分查找

    排序算法 二分查找 用于有序元素列表的查找性能: Python实现: C#实现

  • 二分查找算法实现(图解)与实例

    前言 当我们要从一个序列中查找一个元素的时候,二分查找是一种非常快速的查找算法,二分查找又叫折半查找。 它对要查找...

网友评论

  • f18cf33bbd6c:这个是强行组合了二分查找+顺序查找吗???

    重复元素二分查找不应该是这样的,应该是纯粹的二分查找
    奇迹迪:@周_46ca 不好意思,当时没想这么多
  • a8a66c3a6fef:这个看着像邓老师书里面的代码。
    奇迹迪:如果变量都一样的话,我要到墙角反省一下了;
  • helloKimmy:搜索算法经典是二分法,但实际使用数据时,考虑到数据容量和访问量,二分法是不够优化的。这种情况下,通常要对数据建模,一般建模时使用的数学理论有线性理论和插值理论,其他的方法使用的理论模型通常要复杂得多。:smile::smile::smile:

本文标题:可查找重复元素的二分查找算法

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