zoukankan      html  css  js  c++  java
  • 二分查找算法

    二分查找算法(也称为折半查找算法)效率相对较高,是一种在有序数组中查找某一特定元素的搜索算法。(来源:wikipedia

    步骤:

    第一步:从数组的中间元素开始查找,如果数组中的中间元素等于要查找的元素,查找结束;

    第二步:如果要查找的元素大于或者小于数组的中间元素,则在数组大于或小于中间元素的那一半中查找,和步骤一同样从中间元素开始查找;

    第三步:如果数组为空,则代表找不到;

    折半查找算法每次把搜索范围缩小一半,时间复杂度为: log(n)

    二分查找需要注意的问题(何登成的技术博客

    一、检查参数的有效性

    例如:low和high是否相同、数组中是否存在元素、low和high构成的数组是否有效等,代码的鲁棒性要强

    二、二分查找中值的计算

    常规算法:  mid = (low + high)/ 2

    试想一种极端的情况,low = 2147483640 , high = 10 , 则算出来的 mid 肯定是一个错误答案 ;

    上面的表达式可以转化成:    mid = ( (high - low + low + low)  / 2 = low + ( high - low ) / 2

    这样就可以避免 (low + high) 溢出的情况

    同时 mid = low + ( high - low ) / 2 得出的结果更合期望的一致,向下取整

    三、从效率来看,一般不采用递归形式实现二分查找算法

    下面给出算法的两种实现方法(循环实现和递归实现):

    循环实现代码:

    #import <Foundation/Foundation.h>
    int main(int argc , const char * argv[])  {
        int array[] = {0,1,2,3,4,5,6,7,8,9,10} ;
        int count = sizeof(array) / sizeof(array[0]) ;
        int target = 4 ;
        int low = 0 , high = count - 1 , mid = 0 ;
        while(low <= high)  {
            mid = low + (high - low) / 2 ;
            if(array[mid] > target)
                high = mid - 1 ;
            else if(array[mid] < target)
                low = mid + 1 ;
            else
                break ;
        }
        if(low <= high)
            NSLog(@"%d",mid) ;
        else
            NSLog(@"NO") ;
        return 0 ;
    }

    递归实现代码:

    #import <Foundation/Foundation.h>
    
    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)
            BinarySearch(array , low , mid - 1 , target) ;
        else if(array[mid] < target)
            BinarySearch(array , mid + 1 , high , target) ;
        else
            return mid ;
    }
    
    int main(int argc , const char * argv[])  {
        int array[] = {0,1,2,3,4,5,6,7,8,9,10} ;
        int temp = BinarySearch(array , 0 , 10 , 4) ;
        if(temp != -1)
            NSLog(@"%d",temp) ;
        else
            NSLog(@"NO") ;
        return 0 ;
    }
  • 相关阅读:
    Firefly AIO-3399ProC开发板安装RKNN Toolkit 1.6.0开发环境
    用1kΩ电阻可以组合出多少个阻值?
    电气元件与电气控制的保护(PPT)
    MASM汇编DOS
    可免费解锁PDF的网站
    org.springframework.web.filter.CharacterEncodingFilter cannot be cast to javax.servlet.Filter和java.lang.LinkageError: loader constraint violation: loader (instance of org/apache/jasper/servlet/JasperL
    访问联合类型中某个类型特有的属性或方法
    防止攻击者篡改外部脚本
    对 state 中的数组使用 v-model
    TS 定义一个最简单的字符串数组类型
  • 原文地址:https://www.cnblogs.com/scottdinggo/p/4419958.html
Copyright © 2011-2022 走看看