第二十五章:二分查找实现(Jon Bentley:90%程序员无法正确实现)
作者:July
出处:结构之法算法之道
引言
Jon Bentley:90%以上的程序员无法正确无误的写出二分查找代码。也许很多人都早已听说过这句话,但我还是想引用《编程珠玑》上的如下几段文字:
“二分查找可以解决(预排序数组的查找)问题:只要数组中包含T(即要查找的值),那么通过不断缩小包含T的范围,最终就可以找到它。一开始,范围覆盖整个数组。将数组的中间项与T进行比较,可以排除一半元素,范围缩小一半。就这样反复比较,反复缩小范围,最终就会在数组中找到T,或者确定原以为T所在的范围实际为空。对于包含N个元素的表,整个查找过程大约要经过log(2)N次比较。
多数程序员都觉得只要理解了上面的描述,写出代码就不难了;但事实并非如此。如果你不认同这一点,最好的办法就是放下书本,自己动手写一写。试试吧。
我在贝尔实验室和IBM的时候都出过这道考题。那些专业的程序员有几个小时的时间,可以用他们选择的语言把上面的描述写出来;写出高级伪代码也可以。考试结束后,差不多所有程序员都认为自己写出了正确的程序。于是,我们花了半个钟头来看他们编写的代码经过测试用例验证的结果。几次课,一百多人的结果相差无几:90%的程序员写的程序中有bug(我并不认为没有bug的代码就正确)。
我很惊讶:在足够的时间内,只有大约10%的专业程序员可以把这个小程序写对。但写不对这个小程序的还不止这些人:高德纳在《计算机程序设计的艺术 第3卷 排序和查找》第6.2.1节的“历史与参考文献”部分指出,虽然早在1946年就有人将二分查找的方法公诸于世,但直到1962年才有人写出没有bug的二分查找程序。 ”——乔恩·本特利,《编程珠玑(第1版)》第35-36页。
你能正确无误的写出二分查找代码么?不妨一试。
二分查找代码
二分查找的原理想必不用多解释了,不过有一点必须提醒读者的是,二分查找是针对的排好序的数组。OK,纸上读来终觉浅,觉知此事要躬行。我先来写一份,下面是我写的一份二分查找的实现(之前去某一家公司面试也曾被叫当场实现二分查找,不过结果可能跟你一样,当时就未能完整无误写出),有任何问题或错误,恳请不吝指正:
简单测试下,运行结果如下所示(当然,一次测试正确不代表程序便0 bug了,且测试深度远远不够):
测试
也许你之前已经把二分查找实现过很多次了,但现在不妨再次测试一下。关闭所有网页,窗口,打开记事本,或者编辑器,或者直接在本文评论下,不参考上面我写的或其他任何人的程序,给自己十分钟到N个小时不等的时间,立即编写一个二分查找程序。独立一次性正确写出来后,可以留下代码和邮箱地址,我给你传一份本blog的博文集锦CHM文件 && 十三个经典算法研究带标签+目录的PDF文档(你也可以去我的资源下载处下载:http://download.csdn.net/user/v_july_v)。
当然,能正确写出来不代表任何什么,不能正确写出来亦不代表什么,仅仅针对Jon Bentley的言论做一个简单的测试而已。本博客算法交流群第17群:Algorithms_17,192036066(12月份内有效)。下一章,请见第二十六章:基于给定的文档生成倒排索引的编码与实践。谢谢。
总结
本文发表后,马上就有很多朋友自己尝试了。根据从朋友们在本文评论下留下的代码,发现出错率最高的在以下这么几个地方:
-
注释里已经说得很明白了,可还是会有不少朋友犯此类的错误:
-
还有一个最最常犯的错误是@土豆:
middle= (left+right)>>1; 这样的话left与right的值比较大的时候,其和可能溢出。
各位继续努力。
分享到:
相关推荐
[原网页] 程序员编程艺术第二十五章:Jon Bentley:90%无法正确实现二分查找 [原网页] 编程艺术第二十三~四章十一续:杨氏矩阵查找,倒排索引关键词Hash编码 [原网页] 六之再续:KMP算法之总结篇(12.09修订,必懂...
编程珠玑
编程珠玑(programming pearls)最早刊登在communications of the ACM 杂志上,有个连载的专栏。文章从1983年到1987年,一共30篇。 目前的书籍编程珠玑>>就是作者在上述文章的基础上修改而成的。 然而,无论你是否...
编程珠玑 第2版 修订版 Jon Bentley著 黄倩等译,高清带目录,人民邮电出版社。
《编程珠玑(第2版)》是计算机科学方面的经典名著。...作者Jon Bentley 以其独有的洞察力和创造力,引导读者理解这些问题并学会解决方法,而这些正是程序员实际编程生涯中至关重要的。——《豆瓣读书》
经典著作,不用多介绍了吧:P 如果你以前没听说过,那就先下载吧
第二十五章 可移植的 Perl 第二十六章 简单旧文档 第二十七章 Perl 文化 第五部分 参考资料 第二十八章 特殊名字 第二十九章 函数(A-D) 第二十九章 函数(E-N) 第二十九章 函数(O-R) 第二十九章 函数(S-Z...
编程珠玑第二版及源代码实现(C/C++) 如果让程序员们列举他们喜欢的书籍,Jon Bentley的《编程珠玑》一定可以归于经典之列。如同精美的珍珠出自饱受沙砾折磨的牡蛎,程序员们的精彩设计也来源于曾经折磨他们的实际...
乔恩·本特利(Jon Bentley)着名的《编程珍珠》的演练。 当前内容 第1栏 使用位图数据结构以及用于对范围[1, n] k唯一元素进行采样的高效算法的快速系统排序实现,为此,我使用了floyd的随机采样算法。 问题是要...
作者Jon Bentley 以其独有的洞察力和创造力,引导读者理解这些问题并学会解决方法,而这些正是程序员实际编程生涯中至关重要的。本书的特色是通过一些精心设计的有趣而又颇具指导意义的程序,对实用程序设计技巧及...
本书为第一卷,主要讨论计算机科学中最本质的问题:如何正确选择和高效地实现算法。.. 在书中,作者选取许多具有典型意义的复杂编程和算法问题,生动描绘了历史上众大师们在探索解决方案中发生的轶事、走过的弯路和...
二分查找函数模板及测试程序,它能实现查找方式中的二分查找,党查找失败时返回-1!
正如自然界里珍珠出自细沙对牡蛎的磨砺,计算机科学大师Jon Bentley以其独有的洞察力和创造力, 从磨砺程序员的实际问题中凝结出一篇篇不朽的编程“珠玑”, 成为世界计算机界名刊《ACM通讯》历史上最受欢迎的专栏...
正如自然界里珍珠出自细沙对牡蛎的磨砺,计算机科学大师Jon Bentley以其独有的洞察力和创造力,从磨砺程序员的实际问题中凝结出一篇篇不朽的编程“珠玑”,成为世界计算机界名刊《ACM通讯》历史上很受欢迎的专栏,...
本书为第一卷,主要讨论计算机科学中最本质的问题:如何正确选择和高效地实现算法。 在书中,作者选取许多具有典型意义的复杂编程和算法问题,生动描绘了历史上众大师们在探索解决方案中发生的轶事、走过的弯路和...
算法导论中文版第二版_Cormen_完整目录_扫描版pdf+编程珠玑pdf
二分查找法的windows环境下用c++编程出来 绝对是初学者的福音
作者Jon Bentley 以其独有的洞察力和创造力,引导读者理解这些问题并学会解决方法,而这些正是程序员实际编程生涯中至关重要的。《编程珠玑(第二版)》的特色是通过一些精心设计的有趣而又颇具指导意义的程序,对...
jcdroneservices:Jon和Kayla的网站