内容来自 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】有序向量二分查找的三个 版本的更多相关文章

  1. LC T668笔记 & 有关二分查找、第K小数、BFPRT算法

    LC T668笔记 [涉及知识:二分查找.第K小数.BFPRT算法] [以下内容仅为本人在做题学习中的所感所想,本人水平有限目前尚处学习阶段,如有错误及不妥之处还请各位大佬指正,请谅解,谢谢!] !! ...

  2. 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+ ...

  3. Java基础知识强化60:经典查找之二分查找

    1. 二分查找       二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表. 比较 ...

  4. Java之二分查找算法

    算法说明:取中间位置的值与待查字比较.如果比待查字更大,则去列表的前半部分查找,如果比待查字小,则去列表的后半部分查找,直到找到这个待查字,或者返回没有找到这个待查字.其中给定的列表是从大到小排列的有 ...

  5. Python 实现二分查找(递归版)

    二分查找 为什么使用二分查找: python中的列表,一般取值为遍历这个列表,直到取到你想要的值,但是如果你的列表是一个有着百万元素的列表呢,那样for循环遍历列表就会很慢,可能会循环几十万次,才能找 ...

  6. STL 二分查找三兄弟(lower_bound(),upper_bound(),binary_search())

    一:起因 (1)STL中关于二分查找的函数有三个:lower_bound .upper_bound .binary_search  -- 这三个函数都运用于有序区间(当然这也是运用二分查找的前提),以 ...

  7. [19/03/13-星期三] 数组_二维数组&冒泡排序&二分查找

    一.二维数组 多维数组可以看成以数组为元素的数组.可以有二维.三维.甚至更多维数组,但是实际开发中用的非常少.最多到二维数组(我们一般使用容器代替,二维数组用的都很少). [代码示例] import ...

  8. java面试记录二:spring加载流程、springmvc请求流程、spring事务失效、synchronized和volatile、JMM和JVM模型、二分查找的实现、垃圾收集器、控制台顺序打印ABC的三种线程实现

    注:部分答案引用网络文章 简答题 1.Spring项目启动后的加载流程 (1)使用spring框架的web项目,在tomcat下,是根据web.xml来启动的.web.xml中负责配置启动spring ...

  9. 跳表--怎么让一个有序链表能够进行"二分"查找?

    对于一个有序数组,如果要查找其中的一个数,我们可以使用二分查找(Binary Search)算法,将它的时间复杂度降低为O(logn).那查找一个有序链表,有没有办法将其时间复杂度也降低为O(logn ...

随机推荐

  1. javascript代码混淆原理

    https://www.google.com/search?biw=1440&bih=729&q=javascript%E4%BB%A3%E7%A0%81%E6%B7%B7%E6%B7 ...

  2. Windows SVN变化邮件通知(Python2.7实现)

    1,新增文件post-commit.bat 内容: rem REPOS-PATH (the path to this repository) set REPOS=%1 rem REV (the num ...

  3. CDH 1、CDH简介

    1.Apache Hadoop 不足之处 • 版本管理混乱 • 部署过程繁琐.升级过程复杂 • 兼容性差 • 安全性低 2.Hadoop 发行版 • Apache Hadoop • Cloudera’ ...

  4. UIColor-Hex-Swift

    // // UIColorExtension.swift // HEXColor // // Created by R0CKSTAR on 6/13/14. // Copyright (c) 2014 ...

  5. iOS 字体设置

    使用无衬线字体 body {     font-family: "Helvetica Neue", Helvetica, STHeiTi, sans-serif; }  iOS 4 ...

  6. python 笔记1--基础类型

    list 操作 append() 添加最外面 insert(pos,content) 插入指定地方 pop() 删除最外面 pop(pos) 删除指定地方 list中可以有list,且能用二维数组的方 ...

  7. Mysql的安装(二进制免编译包) 5.1版本

    一,Mysql的安装: 1.下载mysql,可以通过http://mirrors.sohu.com/下载mysql软件. wget http://mirrors.sohu.com/mysql/MySQ ...

  8. 使用Marshal.Copy把Txt行数据转为Struct类型值

    添加重要的命名空间: using System.Runtime.InteropServices; 先建立结构相同(char长度相同)的Struct类型用于转换: [StructLayout(Layou ...

  9. Identity 验证,Authorize 特性

    多类型角色访问 //[Authorize] //[Authorize(Roles = "User")] //[Authorize(Roles="Administrator ...

  10. 在SQL中修改数据库名称

    假设SQL Server 2008中有个数据库test,现在要将其改名为zhy步骤:(1) 分离数据库:打开management studio,找到test数据库-->右键-->任务--& ...