自己犯得错---二分查找

二分查找都好难啊... 路途漫漫兮。没看书之前自己第一遍的实现,循环的终止条件是仅仅判断mid值是否落在区间内。当然这个是错误的,而且比较愚蠢。

第二次 查了下网上的实现后 把循环的判读条件改成了while(l < h) ,循环外直接return -1;对于我的实现,又犯了一个错误,这种条件下会少比较一个元素,就是少比较 l = h 时 指向的元素。

最后我把 循环条件改成了 while(l <= h) 才没有测试出错。

不过可能我的测试用例可能没有覆盖完全,明天再继续论证下。

二分查找还要一个重要的易错点是 整数加法的溢出... 不知道这世上有多少的bug是出在溢出上,一定要多留心眼。

书上给出的解决方案是 mid = l + ((h - l)>> 1);

就是数学公式 (a + b) / 2 = b + (b - a) / 2 得应用。

时间: 2025-01-15 03:22:37

自己犯得错---二分查找的相关文章

二分查找实现(Jon Bentley:90%程序员无法正确实现)

二分查找实现(Jon Bentley:90%程序员无法正确实现)作者:July出处:结构之法算法之道引言Jon Bentley:90%以上的程序员无法正确无误的写出二分查找代码.也许很多人都早已听说过这句话,但我还是想引用<编程珠玑>上的如下几段文字:“二分查找可以解决(预排序数组的查找)问题:只要数组中包含T(即要查找的值),那么通过不断缩小包含T 的范围,最终就可以找到它.一开始,范围覆盖整个数组.将数组的中间项与T 进行比较,可以排除一半元素,范围缩小一半.就这样反复比较,反复缩小范围,

9.10 二分查找 gcc makefile gdb调试

 二分查找的迭代和递归实现: #include <stdio.h> #include <stdlib.h> int find1(int *a, int low , int high , int key)//迭代二分查找 { int mid = 0; while (low <= high) { mid = (low+high)/2; if (a[mid] == key) return mid; else if (a[mid] < key) low = mid + 1; e

【转】STL之二分查找 (Binary search in STL)

Section I正确区分不同的查找算法count,find,binary_search,lower_bound,upper_bound,equal_range 本文是对Effective STL第45条的一个总结,阐述了各种查找算法的异同以及使用他们的时机. 首先可供查找的算法大致有count,find,binary_search,lower_bound,upper_bound,equal_range.带有判别式的如count_if,find_if或者binary_search的派别式版本,其

二分查找实现

二分查找 二分查找的前提是数组必须有序.这个算法据某本说,百分之九十的都会写错.编写程序需要注意的是 非法输入 尽量使用迭代,因为如果数组很大的话,递归有可能是栈溢出 循环判断条件 注意mid的求值方法,mid = ((right - left) >> 1) + left ;可以防止两个整型值相加时溢出.并注意>>运算符优先级低于+ - * / %,所以要对左移右移加括号.如果没有加括号,得出的答案是错误的.比如:2 >> 1 + 2 你试下打印出来是多少. 数组里的数

二分查找小结

在弄dp时感觉一道题需非要弄清二分查找不可.以前学二分一直就很迷惑,网上资料也各种各样.的确二分是个很容易写错的算法,今天只好不算太耐心的再看一遍二分.总感觉时间不够用.. 二分查找有许多细节,这次先抓主要矛盾.关于什么(left+rigth)/2溢出的问题啊先不考虑了.对我来说二分迷惑的地方还是在1.while(left?right) ?处到底是<还是<= 2.判断后mid到底是加一还是减一还是不变? 3.返回left还是right? 这次大概明白了一些,因为二分查找是看区间开闭的,对于左闭

养成良好的编程风格--论二分查找的正确姿势

摘自:http://www.cnblogs.com/ider/archive/2012/04/01/binary_search.html 在学习算法的过程中,我们除了要了解某个算法的基本原理.实现方式,更重要的一个环节是利用big-O理论来分析算法的复杂度.在时间复杂度和空间复杂度之间,我们又会更注重时间复杂度. 时间复杂度按优劣排差不多集中在: O(1), O(log n), O(n), O(n log n), O(n2), O(nk), O(2n) 到目前位置,似乎我学到的算法中,时间复杂度

二分查找的实现和应用汇总(转载)

转载地址:http://www.cnblogs.com/ider/archive/2012/04/01/binary_search.html 二分查找法的实现和应用汇总 在学习算法的过程中,我们除了要了解某个算法的基本原理.实现方式,更重要的一个环节是利用big-O理论来分析算法的复杂度.在时间复杂度和空间复杂度之间,我们又会更注重时间复杂度. 时间复杂度按优劣排差不多集中在: O(1), O(log n), O(n), O(n log n), O(n2), O(nk), O(2n) 到目前位置

#转 二分查找

二分查找 二分查找算法基本思想 二分查找算法的前置条件是,一个已经排序好的序列(在本篇文章中为了说明问题的方便,假设这个序列是升序排列的),这样在查找所要查找的元素时,首先与序列中间的元素进行比较,如果大于这个元素,就在当前序列的后半部分继续查找,如果小于这个元素,就在当前序列的前半部分继续查找,直到找到相同的元素,或者所查找的序列范围为空为止. 用伪代码来表示, 二分查找算法大致是这个样子的: 1 left = 0, right = n -1 2 3 while (left <= right)

关于二分查找及其上下界问题的一些思考

个人认为在编程的时候,我的代码能力应该是到位的,但是昨天参加的某公司笔试彻底把这个想法给终结了,才意识到自己是多么的弱.其中印象最深刻的是一道关于二分查找上下界的问题.当时洋洋得意,STL 分分钟搞定,结果到了面试的时候他要我自己重新实现一下.这个时候就拙计了,拿着笔的我是写了改改了写,最后勉强算是完成. 今天反思一下,决定自己再把二分查找重新实现一下.也作为给自己的一个警醒,不要总以为自己能力有多高,总有一天会被打脸的. 一.二分查找思想(参照<算法竞赛入门经典>,感谢刘老师). 在有序表中