数据结构

http://mp.weixin.qq.com/s/1qUPyysDYDMkjjYVCMCfow

二分查找有着查找速度快,平均性能好等优点,但必须要求待查表为有序表,且插入删除困难,面试比较常考,今天我们具体看一下二分查找算法


二分查找思想


某日,克唤来两名得意弟子谦子和慧子,准备考考他们


谦子和慧子来到老师跟前,只见老师在纸上写了一行数,如下:




你们谁能用程序在最短的时间找出15?

只需要从第一个元素开始往后依次比较,比较六次就可以找到了


谦子

谦子抢先答道

我只需两次就可以找到


慧子

哦,如何做到的?


谦子

谦子急忙问道

老师给的数字是升序的,所以没有必要一个一个比较,可以逐渐缩小要查找的范围来查找,我先看中间的元素,如果是15,那就直接找到了,如果比15比中间的元素大,那就应该去中间元素的右边去找,反之在左边找


慧子

慧子一边说着一边画了个图



你看,我用名为arr的数组存储这些元素,用low和high两个变量去划定我查找的区间,第一次比较15大于中间元素8,那么下次我就在8的右边查找


慧子

这时慧子又画了一个图


这次查找区间变小了,同时也查找到了,一共就用了两次


慧子

谦子听了之后不得不佩服




慧子的思想非常好,这就是今天想给你说的二分查找

那如果查12呢?


谦子

如果查12,同样的思路,第一次查找和15一样,第二次查找12小于15,应该在15左边,8的右边查找


慧子

慧子画出了第三张图


这次只剩下10一个元素了,但是还是不相等,那就查找失败了,表明给定的元素中没有12这个元素


慧子


二分代码


请输入


那你能写出这个查找算法的代码吗?

没问题


慧子

慧子的代码功底还是非常强的,说着说着写了短短几行代码


你给我一个排好序的数组,和你要查的元素,我查到了给你返会该元素在数组中的位置,如果没有则返回-1


慧子

慧子解释道

这个low<=high的循环条件能不能改为low<high呢?


谦子

不行,如果改为 low < high,就有可能出现本来数组中有待查元素,却查不到的情况,比如查10,前两次查找和查12一样,最后low和high指向了元素10,但是此时while(low<high)不成立,所以会跳出循环


慧子

慧子画出了下图解释道


哦,我懂了,只有在low>high的时候循环才可以结束


谦子



你觉得你的程序写的怎么样,再检查检查

这时克发话了

慧子还在欣赏自认为完美无瑕的代码,听了老师的话一下变得紧张起来

这。。。看不出来


慧子

慧子嘿嘿地笑了一下



你看你的 mid = (low+high)/2 这行代码,low 和 high 都是整形,当你的low和high很大的时候,是不是 low+high 就会产生溢出,low+high 的结果就会变为负数,那么 (low+high)/2也就是负数了,程序运行时就错了


哦,原来是这样,那该如何解决呢?


慧子




给你两个容量相同杯子,里面水的体积不同,你该如何将两杯水变成体积相同呢?




你之前的做法就相当于把其中一个杯子的水倒入另一个杯子中,然后均分,这样有可能水会溢出,你现在换个思路,你先算出两个杯子水之前的差值,然后给水少的杯子倒入差值的一半,这不就两个杯子的水一样了吗?

克自问自答起来,顺手画了一个图



作者注:此例子为冒泡大神指点时所用例子

慧子恍然大悟,原来写成 mid=low+(high-low)/2 就可以了


时间复杂度



那你说说这个算法的时间复杂度

这个。。。,弟子不才,还请老师指点


慧子




要分析时间复杂度,其实也不难,只要算出while循环了几次就行了

你这样想一下,你要查找的数据规模如果是n,那二分一次后规模就变为n/2^1,二分两次后规模为n/2^2,...,二分m次后规模为n/2^m,若二分m次后跳出循环,则m就是循环的次数(不管查找是否成功)


下来分析最坏情况,也就是查找不到

前提:查找不到元素

假设你二分m次后剩下一个元素,那么此时规模为1,同时二分m次后规模变为n/2^m,则:n/2^m = 1, 解出 m = lg(n),此时再循环一次,查找不到,跳出循环,所以说最多有 m+1 次循环(二分m次未跳出循环,还要二分一次),也就是查找一个元素最多需要m+1次,即lg(n)+1次比较,故二分的最坏时间复杂度为O(n) = lg(n)

lg(n) 这里是以2为底



说完克看弟子还是不是很明白,说道



就拿我们今天讨论的数分析吧,我们要查找25[为了使查找次数变的最大]




你看,查找25我们二分了两次后查找区间变为一个元素了,这时7/2^m=1;m=lg7=2(向下取整),再循环一次跳出循环,循环次数为3

哦,我懂了


慧子

x向下取整表示小于或等于x的最大整数



今天慧子表现不错

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

推荐阅读更多精彩内容

  • 八爪鱼采集器 2018-02-08星夜读书区 今天,星夜小编为大家讲解八爪鱼采集器是什么、八爪鱼采集器怎么用和八爪...
    最美有品阅读 2,315评论 0 2
  • iOS数据结构和面试那些http://www.jianshu.com/collection/7b615f55ef1...
    高小杰阅读 254评论 0 0
  • 今年国庆回老家看望奶奶。 大学毕业之后已经很少回去了,时隔几年,老家并没有什么明显的变化,一样的种植模式,掰了玉米...
    一个读书匠阅读 641评论 1 3
  • 那一天,万物复苏 清风将你我引见 万物的气息把我们层层围绕 而我,也深深被你陶醉 我愿牵你的手,没有尽头 我愿给你...
    来杯橙子阅读 201评论 0 3