• 二分查找算法


    二分查找算法(也称为折半查找算法)效率相对较高,是一种在有序数组中查找某一特定元素的搜索算法。(来源: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 ;
    }
  • 相关阅读:
    K3Wise K3List.OCX引入dotnet问题处理方法
    k3wise dotnet开发老单据时序簿工具条添加按钮
    c#调用dotnet写的com组件碰到注册失败的错误的补救方法
    bat注册dotnet com
    dotnet动态加载以及卸载dll的代码
    c#获取com对象的progid
    jpg和png的区别
    Fragment的FragmentTransaction 的commit()和commitAllowingStateLoss()以及commitNow()和commitNowAllowingStateLoss()
    Java泛型类型擦除与运行时类型获取
    rxjava介绍
  • 原文地址:https://www.cnblogs.com/scottdinggo/p/4419958.html
Copyright © 2020-2023  润新知