有序向量二分查找的三个 版本
2015-11-19 00:36
288 查看
内容来自 TsinghuaX: 30240184X 数据结构(2015秋) 课程的Vector一章,对有序向量的二分查找有三个版本
三个版本的函数原型是一致的,都是 Rank search(T const& e, Rank lo, Rank hi) const;
其中,Rank为向量元素的秩,在此被定义为int型,lo和hi分别是查找区间的左、右界桩。
若查找成功,则返回元素出现的秩;查找失败返回-1.
版本a和版本b在实现上的区别可用下图描述,其中+1,+2表示进入此分支要进行的比较次数(即 if 语句的层数)。
![](http://images2015.cnblogs.com/blog/669964/201511/669964-20151119001304702-100445925.png)
就像老师说的,两个版本都比对方的最坏情况好一点,比最好情况坏一点。
b的命中总在叶结点,而a可在中间结点命中(有点像B树和B+),因此a有一半的情况比b要快,但b比a稳定且比较次数少。
版本c有更多语义上的规定,当查找成功时,若有多个元素与e相等,返回秩最大的那个;当查找失败时,返回应插入的位置,即最后一个小于等于e的元素的秩。
即对于成功或失败,都返回“不大于e的秩最大的元素的秩”
可用下图描述版本c
三个版本的函数原型是一致的,都是 Rank search(T const& e, Rank lo, Rank hi) const;
其中,Rank为向量元素的秩,在此被定义为int型,lo和hi分别是查找区间的左、右界桩。
若查找成功,则返回元素出现的秩;查找失败返回-1.
版本a和版本b在实现上的区别可用下图描述,其中+1,+2表示进入此分支要进行的比较次数(即 if 语句的层数)。
![](http://images2015.cnblogs.com/blog/669964/201511/669964-20151119001304702-100445925.png)
就像老师说的,两个版本都比对方的最坏情况好一点,比最好情况坏一点。
b的命中总在叶结点,而a可在中间结点命中(有点像B树和B+),因此a有一半的情况比b要快,但b比a稳定且比较次数少。
//版本a,中点命中直接返回(可在中间结点退出搜索),左右分支的比较次数不平衡(可用fibonacci查找优化),不稳定,失败返回-1 Rank search_a(T const& e, Rank lo, Rank hi) const{ while (lo < hi) { Rank mi = (lo + hi) >> 1;//向下取整,因此lo=hi时,mi=lo if (e < A[mi]) hi = mi;//进入左区间 else if (A[mi] < e) lo = mi + 1;//进入右区间 else return mi; } return -1; } //版本b,只能在区间长度收缩为1(抵达叶结点)时退出搜索,左右分支比较次数平衡,稳定,失败返回-1 Rank search_b(T const& e, Rank lo, Rank hi) const{ while (1 < hi - lo){ Rank mi = (lo + hi) >> 1; e < A[i] ? hi = mi : lo = mi; } return A[lo] == e ? lo : -1; }
版本c有更多语义上的规定,当查找成功时,若有多个元素与e相等,返回秩最大的那个;当查找失败时,返回应插入的位置,即最后一个小于等于e的元素的秩。
即对于成功或失败,都返回“不大于e的秩最大的元素的秩”
//版本c Rank search_c(T const& e, Rank lo, Rank hi) const{ while (lo < hi){ Rank mi = (lo + hi) >> 1; e < A[mi] ? hi = mi : lo = mi + 1; } return --lo; }
可用下图描述版本c
![](http://images2015.cnblogs.com/blog/669964/201511/669964-20151119003529171-2098037640.png)
相关文章推荐
- Linux用户配置sudo权限(visudo)
- 广告业务领域名词
- 轮廓边 二 使用膨胀扩充
- How to decode a H.264 frame on iOS by hardware decoding?
- Fiddler工具安装介绍
- python之auto鼠标/键盘事件
- HTML5游戏制作之路_02_剖析项目目录结构&&在浏览器中输出helloworld
- 项目冲刺-第十天
- 操作系统原理(三)——文件系统(File system)
- IOS UITableView 多选,全选删除,拖动,置顶的实现
- Android 4.4从图库选择图片,获取图片路径并裁剪
- 温故知新--数据结构的查询与排序
- 还是有必要确定一下自己到底在做是什么
- FileMode文件模式
- 2015年11月广师android群内容分享
- python之生成文件/目录的md5值
- JSTL标签详解
- js基础第四天
- 解析su,su -,sudo的区别
- php文件锁