lower_bound()和upper_bound()的简单讲解
2016-03-12 13:41
495 查看
前几天复习二分然后百度了下lower_bound()和upper_bound()函数,现在将我的理解说下,先贴出我写的代码!
#include<iostream> using namespace std; int lower_bound(int *a, int n, int value) //二分查找第一个大于或等于value的下标key { int l = 0; int r = n - 1; while (l <= r) { int mid = (l + r) >> 1; if (a[mid] < value) l = mid + 1; else r = mid - 1; } return l; } int upper_bound(int *a, int n, int value) // 返回第一个大于value的key { int l = 0; int r = n - 1; while (l <= r) { int mid = (l + r) >> 1; if (a[mid] <= value) l = mid + 1; else r = mid - 1; } return l; } int main() { int input[20] = {0, 2, 3, 4, 4, 5, 5, 7, 8, 9}; int key1,key2; key1 = lower_bound(input, 10, 4); key2 = upper_bound(input, 10, 5); cout << key1 << "\t" << key2 << endl; return 0; }仔细观察大家就会发现上面的代码两个函数只差一个等于符号,现在就来简单的讲解一下我对于这个等号的理解,第一个函数lower_bound()是二分查找第一个大于或者等于value的数组下标,故如果二分查找到的值等value相等那我们就要向左继续查找,因为你要找的是第一个大于或者等于vlaue的数组下标,如果有相等的肯定要找到最左边的值的数组下标,故要向左找。反之亦然!
相关文章推荐
- SQL数据类型
- C#数据结构-树 data Structure Tree
- Java每日一题(6)
- 简单排序(Java 实现)
- 数据结构(Java 实现)之线性表
- 手动实现单向链表跟双向链表的一个简单demo
- 162. Find Peak Element
- 94. Binary Tree Inorder Traversal
- 希尔排序
- 链表的反转
- 链表的创建
- 最大上升子序列(LIS)
- 快速排序算法
- 重建二叉树
- 算法绪论
- 数据结构绪论
- Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
- 搭建Hadoop2.7.2开发环境1(编译Eclipse中hadoop插件hadoop2x-eclipse-plugin)
- VIM
- 软件测试面试可能会遇到的一些问题