首页 > 其他分享 >二分查找

二分查找

时间:2024-06-13 14:11:50浏览次数:17  
标签:二分 int mid high 查找 low

二分查找

非递归

int bsearchWithoutRecursion(int a[], int key) {
    int low = 0;
    int high = a.length - 1;
    while (low <= high) {
        int mid = low + (high - low) / 2;
        if (a[mid] > key)
            high = mid - 1;
        else if (a[mid] < key)
            low = mid + 1;
        else
            return mid;
    }
    return -1;
}

递归

int binarysearch(int array[], int low, int high, int target) {
    if (low > high) return -1;
    int mid = low + (high - low) / 2;
    if (array[mid] > target)
        return binarysearch(array, low, mid - 1, target);
    if (array[mid] < target)
        return binarysearch(array, mid + 1, high, target);
    return mid;
}

二分查找中值的计算

这是一个经典的话题,如何计算二分查找中的中值?大家一般给出了两种计算方法:

  • 算法一(可能溢出): mid = (low + high) / 2
  • 算法二(正确): mid = low + (high – low)/2

乍看起来,算法一简洁,算法二提取之后,跟算法一没有什么区别。但是实际上,区别是存在的。算法一的做法,在极端情况下,(low + high)存在着溢出的风险,进而得到错误的mid结果,导致程序错误。而算法二能够保证计算出来的mid,一定大于low,小于high,不存在溢出的问题。

二分查找法的缺陷

二分查找法的O(log n)让它成为十分高效的算法。不过它的缺陷却也是那么明显的。就在它的限定之上:必须有序,我们很难保证我们的数组都是有序的。当然可以在构建数组的时候进行排序,可是又落到了第二个瓶颈上:它必须是数组。

数组读取效率是O(1),可是它的插入和删除某个元素的效率却是O(n)。因而导致构建有序数组变成低效的事情。

解决这些缺陷问题更好的方法应该是使用二叉查找树了,最好自然是自平衡二叉查找树了,既能高效的(O(n log n))构建有序元素集合,又能如同二分查找法一样快速(O(log n))的搜寻目标数。

标签:二分,int,mid,high,查找,low
From: https://www.cnblogs.com/zhengbiyu/p/18245741

相关文章

  • 二分法的总结
    一、前言最初始版的二分法是力扣704.BinarySearch,而后面的二分法都是在这个基础上进行的变化classSolution{public:intsearch(vector<int>&nums,inttarget){intleft=0;intright=nums.size()-1;while(left<=right){//在这里选择......
  • 杂题选讲 #1:二分图边着色
    Vizing定理定义考虑如下的问题:对一个无向图的边进行着色,要求相邻的边染不同种颜色。问需要的最少的颜色数是多少。解决上述问题需要借助Vizing定理(又称维金定理)。在开始之前,我们先进行一些符号的规定。\(\Delta(G)\):无向图\(G=(V,E)\)的最大度数,即\(\Delta(G)=\max_......
  • 华为OD机试 C++ - 根据IP查找城市
    根据IP查找城市前言:本专栏将持续更新互联网大厂机试真题,并进行详细的分析与解答,包含完整的代码实现,希望可以帮助到正在努力的你。关于大厂机试流程、面经、面试指导等,如有任何疑问,欢迎联系我,wechat:steven_moda;email:[email protected];备注:CSDN。题目描述某业务需要根据......
  • 二分查找详解
    二分查找(BinarySearch)是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果......
  • 二分#背包#快排#LCS详解
    二分#背包#快排#LCS详解文章目录二分#背包#快排#LCS详解1.二分搜索2.01背包问题3.快速排序4.最长公共子序列1.二分搜索在处理大规模数据集时,查找操作的效率显得尤为重要。二分搜索是一种在有序数组中查找目标值的高效算法,其时间复杂度为O(logn)。二分搜索通......
  • 每日一题(LeetCode·704)二分查找
    题目:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。示例1:输入:nums=[-1,0,3,5,9,12],target=9输出:4解释:9出现在nums中并且下标为4示例 2:输入:num......
  • 每日一题(LeetCode 34题,在排序数组中查找元素的第一个和最后一个元素)
    题目:给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1,-1]。你必须设计并实现时间复杂度为 O(logn) 的算法解决此问题示例1:输入:nums=[5,7,7,8,8,10],......
  • WQS 二分 & 凸优化dp
    WQS二分决策单调性,四边形不等式\(O(nk\logn)\toO(n\logn)\)想法转移转成最短路。最短路,转移代价\(\to\)边权。恰好选k条边的最短路为\(f\)。\(f\)必须有凸性。加上额外代价\(\lambda\):\(\lambda\to\inf\),选1边\(\lambda\to-\inf\),选n边二......
  • 详解二分查找
    二分法详解大家好,我是Weekoder!这是我的第一篇文章,如果有做的不好的地方,请见谅,我会尽力改正。本文中的图片截取于网络视频,非恶意搬运。二分法,是一个高效的算法,查找一个数的时间复杂度只需要\(O(\logn)\),大大优化了朴素算法(从头到尾地遍历)\(O(n)\)的线性复杂度。稍后我会对它的......
  • 【二分答案】P2390 地标访问
    \(\color{black}\text{P2390地标访问(传送门)}\)学过区间DP的,看到这题的第一反应都是:访问的地标一定是一个区间,并且在不断扩大,区间DP!可看到数据范围,又瞬间放弃了。与P1220关路灯不同,这题由于没有电量的消耗等额外因素,有这样一个小性质:贝西的行走路线只可能是三种:一路向......