STL之二分查找 (Binary search in STL)
2015-12-21 19:03
351 查看
STL之二分查找 (Binary search in STL)
Section I正确区分不同的查找算法count,find,binary_search,lower_bound,upper_bound,equal_range
本文是对Effective STL第45条的一个总结,阐述了各种查找算法的异同以及使用他们的时机。
首先可供查找的算法大致有count,find,binary_search,lower_bound,upper_bound,equal_range。带有判别式的如count_if,find_if或者binary_search的派别式版本,其用法大致相同,不影响选择,所以不作考虑。
注意这些查找算法需要序列式容器,或者数组。关联容器有相应的同名成员函数except binary_search。
首先,选择查找算法时,区间是否排序是一个至关重要的因素。
可以按是否需要排序区间分为两组:
A. count,find
B. binary_search,lower_bound,upper_bound,equal_range
A组不需排序区间, B组需要排序区间。
当一个区间被排序,优先选择B组,因为他们提供对数时间的效率。而A则是线性时间。
另外A组B组所依赖的查找判断法则不同,A使用相等性法则(查找对象需要定义operator==), B使用等价性法则(查找对象需要定义operator<,必须在相等时返回false)。
A组的区别
count:计算对象区间中的数目。
find:返回第一个对象的位置。
查找成功的话,find会立即返回,count不会立即返回(直到查找完整个区间),此时find效率较高。
因此除非是要计算对象的数目,否则不考虑count。
B组的区别 {1,3,4,5,6}
binary_search:判断是否存在某个对象
lower_bound: 返回>=对象的第一个位置,lower_bound(2)=3, lower_bound(3)=3
目标对象存在即为目标对象的位置,不存在则为后一个位置.
upper_bound: 返回>对象的第一个位置, upper_bound(2)=3,upper_bound(3)=4
相关文章推荐
- C#基础笔记
- java设计模式--六大设计原则
- 在iOS7中修改状态栏字体的颜色
- 多层级Spinner列表选项实时更新树形层级(选择城市)
- Apple Watch Human Interface Guidelines (Watch 人机交互指南) (官方文档翻译)
- oc 学习(3) 字符串方法
- oc float数字去末无效零
- Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks程序(Python)配置问题总结
- android任意view爆炸效果--第三方开源--ExplosionField
- 简单打开和保存txt文件
- nvl函数
- 做产品必须知道的:从产品助理到产品总监的职业进阶
- Objective-c语言_协议
- COIDE下重定向printf
- 杭电ACM2571——命运
- 带有Header的SOAP 请求
- 解决tomcat运行statup.bat的闪退问题
- TextView字符串波浪式跳动--第三方开源---JumpingBeans
- shell脚本学习(三)
- 经济--分级基金2