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一样,对应有效下标的下一个值。

  • 相关阅读:
    新建一个类并绑定一个activity
    关于fragment保存变量的问题
    关于使用别人方法的效率问题
    使用asynctask的问题
    关于整个头像更新问题(2)
    关于查找所需代码的问题
    静态变量的使用问题
    关于更换头像的整个过程理解
    fill_parent 和 match_parent区别
    关于ui修改的若干想法
  • 原文地址:https://www.cnblogs.com/zhoudayang/p/5679066.html
Copyright © 2011-2022 走看看