zoukankan      html  css  js  c++  java
  • 二分查找法注意事项

          二分查找法在我刚开始学习java时书上就有提到,这是一个很经典的算法,很容易理解,但事实上它那么容易写出来,有专家说90%的计算机专家不能在2小时内写出完全正确的二分搜索算法,不管这是不是真的,但现在得好好研究一下它,网上搜索一下二分查找,听有不少博客说公司面试时会考到这个,所以,就很有必要去了解。

    
    

    使用二分查找,必须要满足:

    存储在数组中(不可以是链表);

    有序排列

    public class BinarySearch{
        public static int BinarySearch(int []  list , int key ){
            int low = 0,high = list.length -1;
            while( low <= high ){                                   // 1
                int mid = low + ((hight - low) / 2) ;   //2
                if(key<list[mid])
                    high = mid - 1;       //3
                else if(key==list[mid])
                    return mid;
                else 
                    low = mid + 1;
            }
            return - low -1;            //4
        }
    }

    要值得留意的4点:

     

    1、如果low<=high 换成low<high,则查找可能会漏掉匹配元素,如当数组只有一个元素的时候。

     

    2、这应该是一个优化措施吧,采用(low+high)/2存在溢出的风险,我们知道int是16位,最大的值为65535,假设你定义的数组是60000,low和high分别为30000,40000,两者相加就会溢出,变成一个负数,而采用上面的代码,则不会发生这样的错误。其实我们在很多时候都应该留意一下溢出问题,毕竟计算机里的加减乘除是收到限制的。

    3、最近做的一道题目说如果把high = mid - 1换成high = mid可不可以,答案是不可以:
    考虑数组{2,4,6,8}如果查找一个不再数组中的值1,则会出现死循环。

     

    4、这也应该是一个优化措施,当没有找到要查找的关键字时,-(-low-1)就是一个插入点,这个位置插入关键字可以保持序列的有序性。
    解释:首先明确一下,一定要返回一个负值,表示关键值不在序列里面。
    但可不可以返回-low?
    答:不可以,如果关键字小于low[0],那么-0也是0,这表明关键字与list[0]匹配。
    所以一个好的选择是返回-low-1,不仅说明了关键字不在序列,也指出了它应该插在哪个位置。

     

    还有一点就是要留意序列是递增还是递减,在前面加一个if判断。

     

    网上有好多关于二分查找的资料,但来不及总结,它的用法和一些扩展,待遇到后在说吧,学无止境..

  • 相关阅读:
    Vue部署到相对目录和解决刷新404的问题
    JavaScript时间格式转换
    在Vue中使用Chart.Js
    进制转换和大数除法
    esp8266必备知识
    php 添加 freetype支持
    Linux系统时间同步问题
    busybox date 时间的加减
    kubesphere-wokespaces
    添加系统环境变量
  • 原文地址:https://www.cnblogs.com/LZYY/p/3465938.html
Copyright © 2011-2022 走看看