zoukankan      html  css  js  c++  java
  • lower_bound和upper_bound的实现和基本用法

      最近一直在学dp,但是感觉进度明显慢了很多,希望自己可以加一把劲,不要总是拖延了...

      在LIS的优化中我遇到了二分查找的问题,之前也知道lower_bound和upper_bound两个函数,但是没有做一个具体的总结,在下面我会总结这两个函数的用法,也会给出这两个函数的实现代码,代码是参考c ++ Reference 里面的...

    lower_bound:

      这个函数的头文件为#include <algorithm>,函数的返回值为一个指向单调序列[first, last) 中第一个不小于val的元素的地址,如果不存在满足条件的

    元素则返回NULL。你可以用该函数得到的指针的值减去数组开头元素的地址得到他在单调序列中的位置。

      下面解释一下该函数的几个参数:lower_bound(first, last, val);

      表示在有序序列[first, lase) 的所有值中,第一个不小于val的元素的地址。

      下面给出我自己对于lower_bound优化后实现的代码:有错误还请多多指出...

      该代码并没有返回指针,而是直接返回了下标......

    1 int lower_bound(vector<int> &a, int val) {
    2     int first = 0, last = a.size() - 1, mid;
    3     while(first <= last) {
    4         mid = last - (last - first) / 2;
    5         if(a[mid] >= val) last = mid - 1;
    6         else first = mid + 1;
    7     }
    8     return first;
    9 }

    upper_bound

      这个函数和上面的函数内容只有一点不同,他返回的是单调序列中第一个大于val的元素的地址,如果不存在满足条件的元素则返回NULL,下面再给出我自己写的版本......

    1 int upper_bound(vector<int> &a, int val) {
    2     int first = 0, last = a.size() - 1, mid;
    3     while(first <= last) {
    4         mid = last - (last - first) / 2;
    5         if(a[mid] <= val) first = mid + 1;
    6         else last = mid - 1;
    7     }
    8     return first;
    9 }
  • 相关阅读:
    [原] JT SQL Server 性能调优札记之三
    [转]SQL Server 2000执行计划成本(4/5)
    [转]Oracle的Online Redo Log 相关操作
    [原]成功在ESX上搭建SQL Server 2005集群
    我的软设、系分考试经验(书)
    [转]Linux软RAID的技术概要及实现
    [原]Console小技巧——七彩输出
    SQL SERVER 2005 压缩日志及数据库文件大小
    [转]SQL Server 2000执行计划成本(2/5)
    [原]在SQL Server 2005 中使用.net程序集的一项注意
  • 原文地址:https://www.cnblogs.com/bianjunting/p/10581368.html
Copyright © 2011-2022 走看看