二分查找,三分支向二分支的转变,降低的是时间复杂度的常系数。

1. 三分支版本

template <typename T>
Rank binSearch(T *A, T const& e, Rank lo, Rank hi){while (lo < hi){Rank mi = (lo + hi)/2;if (A[mi] < e){lo = mi + 1;} else (A[mi] > e){hi = mi;} else {return mi;}}return A[lo] == e ? lo : -1;
}

2. 二分支版本

template <typename T>
Rank binSearch(T *A, T const& e, Rank lo, Rank hi){while (lo < hi - 1){Rank mi = (lo + hi)/2;if (e < A[mi]) hi = mi;else lo = mi;}return A[lo] == e ? lo : -1;
}

注:

  • (1)hi 始终指向区间之外的第一个元素;
  • (2)分支条件必须为 if (e < A[mi]) else
  • (3)循环条件必须为while (lo < hi-1),如果为while (lo < hi)时,当 lo 符合条件,而 hi = lo + 1 时,将造成死循环。因为:

    a+(a+1)2=a

    \frac{a+(a+1)}2=a

3. 说明

无论是二分支还是三分支,执行搜索时,如果有多个匹配项,返回的未必是第一个匹配项。

int A[] = {4, 4, 4};binSearch(A, 4, 0, 3);// 三分支直接返回 A[1]// 二分支的情况,进入一次循环,A[1] <= 4,退出循环,lo=1A[lo] = A[1] == 4所以也是返回 A[1]

且二分支还是三分支最终返回的结果也未必相同,

int A[] = {0, 4, 4, 4};
binSearch(A, 4, 0, 4);// 三分支,直接返回 A[2]// 二分支,A[2]/A[4] ⇒ A[3]退出循环,A[3] == 4返回 3

二分查找 —— 从三分支到二分支相关推荐

  1. 2022-04-07 西安 javaSE(04) 方法可变参数、重载、递归,数组、冒泡排序、二分查找、动态操作,二维数组、jvm内存区域划分

    方法 1.方法传递参数 形参是基本类型: 1.参数传递的内容是该基本类型的数据值.   2.对形式参数的改变不会影响实际参数的数据值 形参是引用类型:     1.参数传递的是地址值     2.对形 ...

  2. Python二分查找的三种思路

    二分查找的条件: 1.列表是有序的 2.掐头去尾去中间 第一种(最普通的方式): lst = [1, 4, 5, 7, 12, 15, 16, 23, 35, 56] n = 5 left = 0 r ...

  3. if单分支,二分支,多分支

    # 单分支 guess = input("单分支请输入0或者1:") if guess=="1":print("你当前输入的为1,输入0则不提示&qu ...

  4. 无序链表(顺序查找)和有序数组(二分查找)-基础实现-符号表(二)-数据结构和算法(Java)

    文章目录 1 无序链表的顺序查找 1.1 无序链表实现 1.2 分析 2 有序数组中的二分查找 2.1 实现 2.2 分析 3 对二分查找的分析 4 总结 5 后记 1 无序链表的顺序查找 1.1 无 ...

  5. 二分查找 —— 有序数组不小于(不大于)某数的第一个(最后一个)元素

    1. 不小于某数的第一个元素 def bisearch(l, e, lo, hi):while lo < hi:mi = (lo + hi)//2if e > l[mi]: lo = mi ...

  6. 关于二分查找及其上下界问题的一些思考

    个人认为在编程的时候,我的代码能力应该是到位的,但是昨天参加的某公司笔试彻底把这个想法给终结了,才意识到自己是多么的弱.其中印象最深刻的是一道关于二分查找上下界的问题.当时洋洋得意,STL 分分钟搞定 ...

  7. c语言实现二分查找法

    目录 一.前言 二.二分查找法 1.什么是二分查找法 2.如何用c语言来实现二分查找法 三.总结 一.前言 假如今天我们需要在一个有序的数组中来寻找一个数的下标,就用"1,2,3,4,5,6 ...

  8. java二分查找(含二分查找代码)

    目录 一:二分查找的条件 二:二分查找思想​​​​​​​ 三:二分查找代码(循环) 四:二分查找代码(递归) 一:二分查找的条件 1.1 必须是顺序存储结构 1.2 必须有序序列 二:二分查找思想 当 ...

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

最新文章

  1. C语言将字符串转换成对应的数字(十进制、十六进制)【转】
  2. .net core 文件流保存图片_使用JSDelivr加速Github、博客文件
  3. Exynos4412 内核移植(二)—— 内核编译过程分析
  4. 多商户商城源码_多商户小程序开发搭建?开达应用多商户入驻商城小程序制作教程...
  5. 简单html5作品,最新HTML5简单入门系列精选
  6. 组合框绑定字符串数组的数据 c# 1614236088
  7. Spring源码学习路线
  8. mysql有if选择更新_使用IF条件的MySQL更新
  9. 成功解决python.exe 无法找到入口 无法定位程序输入点
  10. 计算机键盘中英文,电脑键盘中英文切换键
  11. 关于天猫(淘宝)评论爬虫
  12. python utf 8 mac_Mac python 开发环境一些设置
  13. 计算机学院早操规定,宜宾学院早操管理规定
  14. 《Git与Github使用笔记》第12章 Pull Request的使用
  15. 【BDTC 2017】最后两天!BDTC大会抢票倒计时!
  16. 2022-2028全球碳纤维山地自行车行业调研及趋势分析报告
  17. 获取文件哈希值_图解:什么是哈希?
  18. linux源码0.11解析pdf,linux0.11 赵炯的Linux源代码剖析中的带中文注释的源代码 - 下载 - 搜珍网...
  19. 网络安全2.0主动防御体系有哪些新思路?
  20. 无人零售的黑科技:RFID技术

热门文章

  1. java压缩文件太慢_java 解压6万个ZIP文件,如何提升速度?
  2. HBuilderX真机调试检测不到魅族手机
  3. Android:沉浸式状态栏(二)集成
  4. Android中Fragment生命周期和基本用法
  5. HTML网页实训的目的,网页设计实习目的及意义.doc
  6. 顺序循环队列类c#语言,C#--循环队列的顺序存储
  7. python 写一个计算器_Python | 写个计算器吧
  8. Qt面试题(一)Qt信号槽第五个参数
  9. Anders Hejlsberg谈C#、Java和C++中的泛型
  10. 【OCR一】字符识别技术总览(转)