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

      lower_bound算法要求在已经按照非递减顺序排序的数组中找到第一个大于等于给定值key的那个数,其基本实现原理是二分查找,如下所示:

    int lower_bound(vector<int> arr, int key) {
        int half;
        int len = arr.size();
        int mid;
        int first = 0;
        while (len > 0) {
            half = len >> 1;
            mid = first + half;
            //in the right part
            if (arr[mid] < key) {
                first = mid + 1;
                //因为first=mid+1,所以这里的len需要在减去half的基础之上再减去1
                len = len - half - 1;
            } else {
                //in the left part
                len = half;
            }
        }
        return first;
    }

      upper_bound函数要求在按照非递减顺序排好序的数组中找到第一个大于给定值key的那个数,其基本实现原理是二分查找,具体实现如下所示:

    int upper_bound(vector<int> arr, int key) {
        int mid;
        int first = 0;
        int len = arr.size();
        int half;
        while (len > 0) {
            half = len >> 1;
            mid = half + first;
            if (arr[mid] > key) {//in the left part
                len = half;
            } else {//if arr[mid]<= key ,in the right part
                first = mid + 1;
                len = len - half - 1;
            }
        }
        return first;
    }

      上述两种实现参考了stl中的实现方式,返回满足条件的值在数组中的下标。如果找不到满足条件的值,将会返回数组的大小,就像迭代器中的end一样,对应有效下标的下一个值。

  • 相关阅读:
    js实现快速排序(in-place)简述
    手把手原生js简单轮播图
    基于superagent 与 cheerio 的node简单爬虫
    浅谈HTTP事务的一个过程
    css小技巧
    DesignPatternPrinciple(设计模式原则)二
    DesignPatternPrinciple(设计模式原则)一
    Attribute(特性)与AOP
    Thread(线程)四
    Thread(线程)三
  • 原文地址:https://www.cnblogs.com/zhoudayang/p/5679066.html
Copyright © 2011-2022 走看看