【DSA MOOC】有序向量二分查找的三个 版本
内容来自 TsinghuaX: 30240184X 数据结构(2015秋) 课程的Vector一章,对有序向量的二分查找有三个版本
三个版本的函数原型是一致的,都是 Rank search(T const& e, Rank lo, Rank hi) const;
其中,Rank为向量元素的秩,在此被定义为int型,lo和hi分别是查找区间的左、右界桩。
若查找成功,则返回元素出现的秩;查找失败返回-1.
版本a和版本b在实现上的区别可用下图描述,其中+1,+2表示进入此分支要进行的比较次数(即 if 语句的层数)。

就像老师说的,两个版本都比对方的最坏情况好一点,比最好情况坏一点。
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) >> ;//向下取整,因此lo=hi时,mi=lo
if (e < A[mi]) hi = mi;//进入左区间
else if (A[mi] < e) lo = mi + ;//进入右区间
else return mi;
}
return -;
} //版本b,只能在区间长度收缩为1(抵达叶结点)时退出搜索,左右分支比较次数平衡,稳定,失败返回-1
Rank search_b(T const& e, Rank lo, Rank hi) const{
while ( < hi - lo){
Rank mi = (lo + hi) >> ;
e < A[i] ? hi = mi : lo = mi;
}
return A[lo] == e ? lo : -;
}
版本c有更多语义上的规定,当查找成功时,若有多个元素与e相等,返回秩最大的那个;当查找失败时,返回应插入的位置,即最后一个小于等于e的元素的秩。
即对于成功或失败,都返回“不大于e的秩最大的元素的秩”
//版本c
Rank search_c(T const& e, Rank lo, Rank hi) const{
while (lo < hi){
Rank mi = (lo + hi) >> ;
e < A[mi] ? hi = mi : lo = mi + ;
}
return --lo;
}
可用下图描述版本c

【DSA MOOC】有序向量二分查找的三个 版本的更多相关文章
- LC T668笔记 & 有关二分查找、第K小数、BFPRT算法
LC T668笔记 [涉及知识:二分查找.第K小数.BFPRT算法] [以下内容仅为本人在做题学习中的所感所想,本人水平有限目前尚处学习阶段,如有错误及不妥之处还请各位大佬指正,请谅解,谢谢!] !! ...
- java for循环和数组--冒泡排序、二分查找法
//100以内与7相关的数 for(int a=1;a<=100;a++){ if(a%7==0||a%10==7||a/10==7){ System.out.print(a+ ...
- Java基础知识强化60:经典查找之二分查找
1. 二分查找 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表. 比较 ...
- Java之二分查找算法
算法说明:取中间位置的值与待查字比较.如果比待查字更大,则去列表的前半部分查找,如果比待查字小,则去列表的后半部分查找,直到找到这个待查字,或者返回没有找到这个待查字.其中给定的列表是从大到小排列的有 ...
- Python 实现二分查找(递归版)
二分查找 为什么使用二分查找: python中的列表,一般取值为遍历这个列表,直到取到你想要的值,但是如果你的列表是一个有着百万元素的列表呢,那样for循环遍历列表就会很慢,可能会循环几十万次,才能找 ...
- STL 二分查找三兄弟(lower_bound(),upper_bound(),binary_search())
一:起因 (1)STL中关于二分查找的函数有三个:lower_bound .upper_bound .binary_search -- 这三个函数都运用于有序区间(当然这也是运用二分查找的前提),以 ...
- [19/03/13-星期三] 数组_二维数组&冒泡排序&二分查找
一.二维数组 多维数组可以看成以数组为元素的数组.可以有二维.三维.甚至更多维数组,但是实际开发中用的非常少.最多到二维数组(我们一般使用容器代替,二维数组用的都很少). [代码示例] import ...
- java面试记录二:spring加载流程、springmvc请求流程、spring事务失效、synchronized和volatile、JMM和JVM模型、二分查找的实现、垃圾收集器、控制台顺序打印ABC的三种线程实现
注:部分答案引用网络文章 简答题 1.Spring项目启动后的加载流程 (1)使用spring框架的web项目,在tomcat下,是根据web.xml来启动的.web.xml中负责配置启动spring ...
- 跳表--怎么让一个有序链表能够进行"二分"查找?
对于一个有序数组,如果要查找其中的一个数,我们可以使用二分查找(Binary Search)算法,将它的时间复杂度降低为O(logn).那查找一个有序链表,有没有办法将其时间复杂度也降低为O(logn ...
随机推荐
- mongodb数据库备份恢复
MongoDB数据文件备份与恢复 备份与恢复数据对于管理任何数据存储系统来说都是非常重要的. 1.冷备份与恢复——创建数据文件的副本(前提是要停止MongoDB服务器),也就是直接copy ...
- 关于xhEditor
关于xhEditor xhEditor是一个基于jQuery开发的简单迷你并且高效的在线可视化HTML编辑器,基于网络访问并且兼容IE 6.0+,Firefox 3.0+,Opera 9.6+,Chr ...
- AIX5.3CPU占用高的问题核查
AIX5.3 CPU占用高问题核查步骤 1.topas查看占用cpu占用最高的进程的PID 2.执行: ps -mp PID -o THREAD 以查找相应进程下所有正在占用 CPU 的线程的TID ...
- Yougth的最大化(好题,二分查找 0 1分数规划)
Yougth的最大化 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中选出k个物品使得单位重量的价 ...
- 【sql语句】好用的sql语句之项目数据库学习总结
转载请注明出处:http://blog.csdn.net/pearyangyang/article/details/41115491 这几天学习公司系统的数据流向.主要涉及到几个表的数据. 可是表中的 ...
- UVa 1394: And Then There Was One
设置一个数组Winner记录经典约瑟夫问题中的剩余者即可递归解决该问题. 注: 约瑟夫问题:有编号为0~n-1的n个人,从0号开始报数1,2,3......报到k的杀死,然后从下一个人开始继续报数1, ...
- Lua多重继承
http://blog.csdn.net/ssihc0/article/details/7742421 代码收藏了,以后用的到 --多重继承 local function search(k,plist ...
- 更新-----Scripts:执行双网卡绑定
#!/bin/bash #------------------------------------------------------------------------------- # Name: ...
- 【求出所有最短路+最小割】【多校第一场】【G题】
题意 A从1要追在N的 B 只能走最短的路 问B最少切断多少条路可以让A不能过来 问B最多切断多少条路A还是能过来 对于1 求出1到N的所有最短路的路径,对其求最小割 对于2 求出长度最小的最短路即可 ...
- WPF实现窗体最小化后小图标在右边任务栏下
一 基本功能 1. 这里是用 NotifyIcon 控件来实现,但 WPF 下没有 NotifyIcon 控件,怎么办,用 WinForm 下的呗. 先引用 .NET 自带的两个程序集 Syste ...