二分查找,教你如何提高搜索效率

二分查找,是程序员入门必会的一个高效搜索算法。本文将对二分查找,以及时间复杂度等概念进行讲解。


1.什么是算法和时间复杂度

在计算机科学中,算法是指在有限时间内解决一个问题的一系列确定的指令。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度时间复杂度来衡量。算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述。使用这种方式时,时间复杂度可被称为是渐近的,亦即考察输入值大小趋近无穷时的情况。

一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)

2.二分查找

我们通过一道题来理解时间复杂度。有个整数x在1-100的范围内,每当你给出一个数y时,能够得到y比x大还是y比x小的信息。****你的任务是用尽可能少的次数猜到x的准确值。
最简单粗暴的做法:从1开始尝试,试到100。这种做法,最终一定能得到结果,但是,最坏的情况下,假如这个数刚好是100,需要试100次。这种方法也称为顺序查找
聪明的做法:每次猜最中间的数,得到这个数比目标大还是小的结果后,在目标所在的区间继续猜中间的数。这样每次至少能排除一半的数。假如目标数是100,1到100存储在数组a[0]到a[99]中。
第一次从50开始猜,会告诉你小了,因此可以排除1-50之间的数,一下子排除了一半。
第二次猜75,会告诉你小了,排除51-75
第三次猜88,会告诉你小了,排除76-88
第四次猜94,会告诉你小了,排除89-94
第五次猜97,会告诉你小了,排除95-97
第六次猜99,命中。
我们猜的范围每次都能够减少一半,因此这个查找方式也被叫做二分查找,又称折半查找。它适用于有序数组中的查找。
二分查找的代码如下:

image

3. 效率分析

由于二分查找每次都能够削减一半的范围,我们搜索的范围为100,小于2^7=128,因此最多只需要搜索7次就可以找到。

假设搜索的范围为1到n,那么,方案1的顺序查找最坏需要遍历n次,而方案二的二分查找法最坏需要遍历logn次。这个效率明显不是一个数量级的。例如n=100W时,穷举法需要100W次搜索,而二分查找只需要20次。

借助这个例子,我们可以引出时间复杂度的概念。一般来说,我们只考虑一个算法在最坏情况下的时间复杂度,因为他可以帮助我们粗略估计算法最长需要运行的时间。用大O来表示这个时间复杂度。

比如,方案1中的穷举法,对应的时间复杂度为O(n)。方案2的二分查找,对应的时间复杂度为O(logn)。除了这两种时间复杂度之外,还有O(1),O(n^2),O(nlogn)等时间复杂度,O(1)表示最坏情况在常数时间内。例如,一次简单的加法,简单的除法,数组中通过下标访问。

如果我们的程序中,有很多部分,其中有一些是O(1)的,有些是O(n)的,有些是O(logn)的。这种情况下,怎么估计程序的运行时间呢?最直接的,把他们加起来,T(n)=O(1)+O(n)+O(logn)。刚刚我们也提到了,方案1的穷举法比方案2的二分搜索要差很多,由于我们是要看最坏情况下程序的情况,所以,我们看耗时最久的,也就是T(n)=O(n)。这能够说明,O(n)这部分的算法占整个程序运行时间的大头。如果我们需要优化我们的代码,就要从这部分入手。当然,O(n)的复杂度其实已经算好的了,后面还有更复杂的,比如O(n^2 ),O(n^3)之类的复杂度。

image

以这段代码为例子,

39-41行的循环中,循环n次,执行循环体需要O(1)的复杂度,总体是T(n)=O(n)O(1)=O(n)
42行,调用了二分搜索,复杂度为O(logn)
43-45行的循环中,循环n次,执行循环体需要O(logn)的复杂度,整体时间复杂度为T(n)=O(n)
O(logn)=O(nlogn)
最终,整个程序总的时间复杂度为T(n)=O(n)+O(logn)+O(nlogn)=O(nlogn),可以看出这段程序最耗时的部分是43-45行。


关于二分查找和时间复杂度的介绍就到这里,欢迎大家关注我的公众号:萌凯的程序人生

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容