zoukankan      html  css  js  c++  java
  • 数据结构基础 查找 之 二分查找

    【算法思想】

    二分查找又称折半查找。对排好序的数组,每次取这个数和数组中间的数进行比較,复杂度是O(logn)

    :设数组为a[n],查找的数x,

    假设x==a[n/2]。则返回n/2;

    假设x < a[n/2],则在a[0]到a[n/2-1]中进行查找;

    假设x > a[n/2],则在a[n/2+1]到a[n-1]中进行查找。

    长处是比較次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。

    条件:查找的数组必需要为有序数组。

    【递归方法源代码】

    /*  
    arrat:数组 , low:上界;  high:下界;  target:查找的数据。 返回target所在数组的下标  
    */  
    int binarySearch(int array[], int low, int high, int target) {  
        int middle = (low + high)/2;  
        if(low > high) {  
            return -1;  
        }  
        if(target == array[middle]) {  
            return middle;  
        }  
        if(target < array[middle]) {  
            return binarySearch(array, low, middle-1, target);  
        }  
        if(target > array[middle]) {  
            return binarySearch(array, middle+1, high, target);  
        }   
    } 

    【非递归方法源代码】

    /*  
    arrat:数组 。 n:数组的大小;  target:查找的数据; 返回target所在数组的下标  
    */  
    int binarySearch2(int array[], int n, int target) {  
        int low = 0, high = n, middle = 0;  
        while(low < high) {  
            middle = (low + high)/2;  
            if(target == array[middle]) {  
                return middle;  
            } else if(target < array[middle]) {  
                high = middle;  
            } else if(target > array[middle]) {  
                low = middle + 1;  
            }  
        }  
        return -1;  
    }  

    递归与非递归方法,应该注意到,递归方式high是上界。也就是array的lenth()-1。变换 mid 的时候有增1和减1操作。

    非递归的方法是size()是上界,也就是array的lenth(),变换 mid 的时候有增1操作而没有减1操作。

    这 2 点一定要引起重视!!!

    【STL方法实现二分查找】

    STL中关于二分查找的函数主要有三个。各自是lower_bound/upper_bound/ 
    binary_search。

    这三个函数都运用于有序区间,当然这也是二分查找思想运用的前提。以下逐一对这三个函数进行剖析。
    这三个函数都包括在算法库中。因此首先应该包括头文件。例如以下所看到的:

    #include <algorithm>
    using namespace std;
    lower_bound算法返回一个非递减序列[first, last)中的第一个大于等于val的位置。 
    upper_bound算法返回一个非递减序列[first, last)中的第一个大于val的位置。

    ForwardIter lower_bound(ForwardIter first, ForwardIter last,const _Tp& val)
    ForwardIter upper_bound(ForwardIter first, ForwardIter last, const _Tp& val)
    ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last,
                                 const T& val, Compare comp);
    ForwardIterator upper_bound (ForwardIterator first, ForwardIterator last,
                                 const T& val, Compare comp);
    STL源代码实现

    Template <class ForwardIterator, class T>  
    bool binary_search(ForwardIterator first, ForwardIterator last, const T& value) {  
     ForwardIterator i = lower_bound(first, last, value);    
     //这里的实现就是调用的lower_bound ,而且假设元素不存在那么lower_bound指向的元素一定是 operator 为ture的地方。

    return i != last && !(value < *i);// 返回是否查找到,而不是元素索引 }

    
    
    
    

    參考详址:

    http://blog.csdn.net/luoweifu/article/details/16656737
    http://blog.csdn.net/u012878643/article/details/46723609


  • 相关阅读:
    主从热备+负载均衡(LVS + keepalived)
    这12行代码分分钟让你电脑崩溃手机重启
    Linux 下虚拟机——Virtual Box
    软件著作权登记证书申请攻略
    ecshop整合discuz教程完美教程
    NetHogs——Linux下按进程实时统计网络带宽利用率
    深入研究CSS
    SSH远程会话管理工具
    nginx防止SQL注入规则
    mysql完美增量备份脚本
  • 原文地址:https://www.cnblogs.com/jhcelue/p/6894759.html
Copyright © 2011-2022 走看看