码迷,mamicode.com
首页 > 其他好文 > 详细

二分查找如何“花式”卖萌

时间:2015-10-03 00:57:42      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:

  二分查找,敢说这货埋在土里化到灰里应该都是认得的。其原理思想也是如此的简单明了,敲代码时都懒得经过反射弧。但事实上,据Knuth神犇描述,第一个木有bug的二分查找是这个算法发表之后12年在出现,但后来发现还是存在一些数组越界的小问题。而如今,我们大都是开门见山的学习被前辈们优化证明的算法,这也是“牛逼顿”所谓的站在巨人的肩膀上,却也如此。

  回头来看二分查找如何“花式”卖萌。

  Problem:给定一个有序数组A,且数组中的元素存在重复,各大一个目标值target,求目标值在数组的的下标的区间(即目标元素的起始下标和结束下标组成的区间)。

  eg:

  int a[9]={0, 1, 2, 3, 3, 3, 4, 5, 6 } ,给定target=3,则返回区间为[3 5].

  分析:显然这必然会用到二分查找的思想,但要稍作修改。只要分别找到左边界和右边界下标即可。

  左边界

  版本一:

  技术分享

  版本二:

  技术分享

  事实上,二分寻找左区间闭着眼睛写都不会有bug的,但是右区间就有点搞笑了。

  右边界

  版本一:

  技术分享

  嗯,这个版本也没有问题,真是幸福!!

  且慢,下面这个版本就显得有点任性了!

  版本二:

  技术分享

  运行之,死循环!应该说在某些情况下会死循环。

  哪里有问题呢?

  嗯,就是low=mid;的问题。

  为什么呢?

  因为当low+1等于high且a[mid]等于target时,mid等于low+(high-low)/2等于low;但是mid又赋值给了low,那么,结果是low和high都没有移动,“原地踏步”,循环往复。。。。。。

  所以,这个版本就虾米了!

  譬如:a1[9]={1,2,3,3,3,5,7,8,9};运行结果会死球!

     a2[8]={1,3,3,3,5,7,8,9};运行结果会ok!

  另外,用二分思想求区间右边界的的思想在另外一个小算法中也有体现。---------折半插入排序。

  折半插入排序可以在保证排序结果稳定的前提下,减少直接插入排序的寻找如入位置的时间,但相对直接插入排序而言,也仅仅是减少了寻找插入位置的时间。但其思想还是可借鉴滴!

 



 

BY QCER

2015.10.2

 

  

 

  

  

二分查找如何“花式”卖萌

标签:

原文地址:http://www.cnblogs.com/qcblog/p/4834060.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!