zoukankan      html  css  js  c++  java
  • lower_bound和upper_bound算法

    参考:http://www.cnblogs.com/cobbliu/archive/2012/05/21/2512249.html

    ForwardIter lower_bound(ForwardIter first, ForwardIter last,const _Tp& val)算法返回一个非递减序列[first, last)中的第一个大于等于值val的位置。

    ForwardIter upper_bound(ForwardIter first, ForwardIter last, const _Tp& val)算法返回一个非递减序列[first, last)中第一个大于val的位置。

         lower_bound和upper_bound如下图所示:

    1. lower_bound

      这个序列中可能会有很多重复的元素,也可能所有的元素都相同,为了充分考虑这种边界条件,STL中的lower_bound算法总体上是采用了二分查找的方法,但是由于是查找序列中的第一个出现的值大于等于val的位置,所以算法要在二分查找的基础上做一些细微的改动。

    int lower_bound(int *array int size ,int key)
    {
        int first=0,middle;
        int half,len;
        len=size;
        while(len>0)
        {
            half=len>>1;
            middle=first+half;
            if(array[middle]<key)//当中间的数小于key,在右边的子序列查找
            {
                first=middle+1;
                len=len-half-1;
            }
            else len=half;//否则在左边
        }
        return first;
    }

    2. upper_bound

    upper_bound返回的是最后一个大于等于val的位置,也是有一个新元素val进来时的插入位置。

    int lower_bound(int *array int size ,int key)
    {
        int first=0,middle;
        int half,len;
        len=size;
        while(len>0)
        {
            half=len>>1;
            middle=first+half;
            if(array[middle]<=key)
            {
                first=middle+1;
                len=len-half-1;
            }
            else len=half;
        }
        return first;
    }
  • 相关阅读:
    有一个双重模板化的错误实现
    非类型模板参数
    C++模板
    初始化列表initializer_list
    C++类型转换
    const引用和constexpr
    逆元
    卡特兰数
    最短路问题
    Android打印机效果的闪屏
  • 原文地址:https://www.cnblogs.com/iwantstrong/p/5986003.html
Copyright © 2011-2022 走看看