STL源码剖析之【二分查找】
来源:互联网 发布:ubuntu 怎么进入u盘 编辑:程序博客网 时间:2024/04/30 03:08
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的源码
template <class _ForwardIter, class _Tp, class _Distance>_ForwardIter __lower_bound(_ForwardIter __first, _ForwardIter __last, const _Tp& __val, _Distance*) { _Distance __len = 0; distance(__first, __last, __len); _Distance __half; _ForwardIter __middle; while (__len > 0) { __half = __len >> 1; __middle = __first; advance(__middle, __half); if (*__middle < __val) { __first = __middle; ++__first; __len = __len - __half - 1; } else __len = __half; } return __first;}
(将迭代器改掉后更容易懂)
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; //在左边子序列(包含middle)中查找 } return first;}
改成平时大家写的二分形式:(经过测试,和STL源码效果一样,在OJ平台测试过)
int Lower_bound(int *a , int n , int value){ int left = 0; int right = n-1; while(left <= right) { int mid = (left + right)/2; if(a[mid] < value) { left = mid+1; } else right = mid -1; } return left;}
2:upper_bound(已将迭代器改掉了)
源码:
int upper_bound(int *array, int size, int key){ int first = 0, len = size-1; int half, middle; while(len > 0){ half = len >> 1; middle = first + half; if(array[middle] > key) //中位数大于key,在包含last的左半边序列中查找。 len = half; else{ first = middle + 1; //中位数小于等于key,在右半边序列中查找。 len = len - half - 1; } } return first;}
改成平时大家写的二分形式:(经过测试,和STL源码效果一样,在OJ平台测试过)
int Lower_bound(int *a , int n , int value){ int left = 0; int right = n-1; while(left <= right) { int mid = (left + right)/2; if(a[mid] <= value) { left = mid+1; } else right = mid -1; } return left;}
3:binary_search()是基于lower_bound的,先找出lower_bound的位置,然后判断该位置是否是我们需要找的目标,返回对比结果
0 0
- STL源码剖析之【二分查找】
- STL之二分查找
- STL源码剖析——STL算法之find查找算法
- STL源码剖析——STL算法之find查找算法
- STL之Vector源码剖析
- STL之list源码剖析
- STL之deque源码剖析
- STL之priority_queue源码剖析
- STL 之 pair 源码剖析
- STL 之 vector 源码剖析
- STL 之 deque 源码剖析
- STL 之 list 源码剖析
- STL 之 set 源码剖析
- STL 之 multiset 源码剖析
- STL 之 map 源码剖析
- STL 之 multimap 源码剖析
- STL 之 stack 源码剖析
- STL源码剖析之list
- 程序员常去的14个顶级开发社区
- [Android][Studio] Import and existing project
- 计算Fibonacci数,循环和递归
- at91sam9260ek的板级、irq初始化-小试牛刀
- MYSQL分库分表总结
- STL源码剖析之【二分查找】
- Android 基于Netty的消息推送方案之概念和工作原理(二)
- signal与定时器
- Eclipse启动时f出现ail to create Java Virtual Machine问题的解决
- C#基础-----虚方法实现多态
- [pgsql]pgsql数据库时间函数
- Android 基于Netty的消息推送方案之字符串的接收和发送(三)
- 查看可执行程序的依赖库
- Js获取当前日期时间及其它操作