漫画:什么是二分查找?

举报
且听风吟 发表于 2019/10/28 19:19:01 2019/10/28
【摘要】 本文用漫画的形式轻松带您了解什么是二分法查找算法。

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1



—————  第二天  —————



640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1


640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1


什么意思呢?我们来举两个栗子:


给定一个有序数组 

2,5,7,9,12,14,20,26,30


Case 1:

640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1


Case 2:

640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1


640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1


640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1


640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1


640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1



————————————



640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1


640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1


640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1


640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1

640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1


640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1


为什么说这样效率最高呢?因为每一次选择数字,无论偏大还是偏小,都可以让剩下的选择范围缩小一半。


给定范围0到1000的整数:


640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1



第一次我们选择500,发现偏大了,那么下一次的选择范围,就变成了1到499:


640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1


第二次我们选择250,发现还是偏大了,那么下一次的选择范围,就变成了1到249:


640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1


第三次我们选择125,发现偏小了,那么下一次的选择范围,就变成了126到249:


640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1


以此类推,最坏的情况需要猜测多少次呢?答案是 log1000 = 10次,也就是让原本的区间范围进行10次 “折半”。



刚才我们所分析的是猜数字的游戏。如果我们把场景转换成最初的面试问题:在包含1000个整型元素的有序数组中查找某个特定整数,又该如何去做呢?


同样道理,我们可以首先判断下标是499的元素(因为数组下标从0开始,到999结束),如果元素大于要查找的整数,我们再去判断下标是249的元素,然后判断下标124的元素......以此类推,直到最终找到想要的元素,或者选择范围等于0为止。


上述这个过程,就是所谓的二分查找算法,查找的时间复杂度是log(n)


640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1


640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1

image.png

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1


640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1


640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1


640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1


640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1


640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1


本文转载自微信公众号【java学习之道】。

原文链接:https://mp.weixin.qq.com/s?__biz=MzU4NzYwNDAwMg==&mid=2247485604&idx=2&sn=4fff1235fe17d125dda8a104474c4a65&chksm=fde8c1e9ca9f48ff3556361239823b9db5d773452be7118848e22cde0d87480dce555e300376&scene=0#rd


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。