二分查找 —— 从三分支到二分支
二分查找,三分支向二分支的转变,降低的是时间复杂度的常系数。
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
二分查找 —— 从三分支到二分支相关推荐
- 2022-04-07 西安 javaSE(04) 方法可变参数、重载、递归,数组、冒泡排序、二分查找、动态操作,二维数组、jvm内存区域划分
方法 1.方法传递参数 形参是基本类型: 1.参数传递的内容是该基本类型的数据值. 2.对形式参数的改变不会影响实际参数的数据值 形参是引用类型: 1.参数传递的是地址值 2.对形 ...
- Python二分查找的三种思路
二分查找的条件: 1.列表是有序的 2.掐头去尾去中间 第一种(最普通的方式): lst = [1, 4, 5, 7, 12, 15, 16, 23, 35, 56] n = 5 left = 0 r ...
- if单分支,二分支,多分支
# 单分支 guess = input("单分支请输入0或者1:") if guess=="1":print("你当前输入的为1,输入0则不提示&qu ...
- 无序链表(顺序查找)和有序数组(二分查找)-基础实现-符号表(二)-数据结构和算法(Java)
文章目录 1 无序链表的顺序查找 1.1 无序链表实现 1.2 分析 2 有序数组中的二分查找 2.1 实现 2.2 分析 3 对二分查找的分析 4 总结 5 后记 1 无序链表的顺序查找 1.1 无 ...
- 二分查找 —— 有序数组不小于(不大于)某数的第一个(最后一个)元素
1. 不小于某数的第一个元素 def bisearch(l, e, lo, hi):while lo < hi:mi = (lo + hi)//2if e > l[mi]: lo = mi ...
- 关于二分查找及其上下界问题的一些思考
个人认为在编程的时候,我的代码能力应该是到位的,但是昨天参加的某公司笔试彻底把这个想法给终结了,才意识到自己是多么的弱.其中印象最深刻的是一道关于二分查找上下界的问题.当时洋洋得意,STL 分分钟搞定 ...
- c语言实现二分查找法
目录 一.前言 二.二分查找法 1.什么是二分查找法 2.如何用c语言来实现二分查找法 三.总结 一.前言 假如今天我们需要在一个有序的数组中来寻找一个数的下标,就用"1,2,3,4,5,6 ...
- java二分查找(含二分查找代码)
目录 一:二分查找的条件 二:二分查找思想 三:二分查找代码(循环) 四:二分查找代码(递归) 一:二分查找的条件 1.1 必须是顺序存储结构 1.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+ ...
最新文章
- C语言将字符串转换成对应的数字(十进制、十六进制)【转】
- .net core 文件流保存图片_使用JSDelivr加速Github、博客文件
- Exynos4412 内核移植(二)—— 内核编译过程分析
- 多商户商城源码_多商户小程序开发搭建?开达应用多商户入驻商城小程序制作教程...
- 简单html5作品,最新HTML5简单入门系列精选
- 组合框绑定字符串数组的数据 c# 1614236088
- Spring源码学习路线
- mysql有if选择更新_使用IF条件的MySQL更新
- 成功解决python.exe 无法找到入口 无法定位程序输入点
- 计算机键盘中英文,电脑键盘中英文切换键
- 关于天猫(淘宝)评论爬虫
- python utf 8 mac_Mac python 开发环境一些设置
- 计算机学院早操规定,宜宾学院早操管理规定
- 《Git与Github使用笔记》第12章 Pull Request的使用
- 【BDTC 2017】最后两天!BDTC大会抢票倒计时!
- 2022-2028全球碳纤维山地自行车行业调研及趋势分析报告
- 获取文件哈希值_图解:什么是哈希?
- linux源码0.11解析pdf,linux0.11 赵炯的Linux源代码剖析中的带中文注释的源代码 - 下载 - 搜珍网...
- 网络安全2.0主动防御体系有哪些新思路?
- 无人零售的黑科技:RFID技术
热门文章
- java压缩文件太慢_java 解压6万个ZIP文件,如何提升速度?
- HBuilderX真机调试检测不到魅族手机
- Android:沉浸式状态栏(二)集成
- Android中Fragment生命周期和基本用法
- HTML网页实训的目的,网页设计实习目的及意义.doc
- 顺序循环队列类c#语言,C#--循环队列的顺序存储
- python 写一个计算器_Python | 写个计算器吧
- Qt面试题(一)Qt信号槽第五个参数
- Anders Hejlsberg谈C#、Java和C++中的泛型
- 【OCR一】字符识别技术总览(转)