二分查找的小改进
来源:互联网 发布:联合国商品数据库 编辑:程序博客网 时间:2024/05/16 13:55
本文是我对二分查找的学习和认识,很多人都在说二分查找是基本算法中的基础,考察一个人写算法的基本功,个人很是赞同,当初裸写(学习后不借助任何书或网络)
二分算法很是恼火,发现并解决了各种问题,现在记录心得如下:(代码写得丑,不要在意这些细节 0.0)
什么是二分查找 ?
大家都清楚所谓二分,便是一分为二,将一个问题划分成两个小一点的子问题,我们所找的目标一定在我们划分的两个子问题中的一个,我们就可以在很大程度上节省时间(毕竟查找范围不断地缩小)我问过度娘,萌娘百科,不,度娘百科轻轻地告诉我二分查找优点在于比较次数少、查找速度快、平均性能好,然,缺点甚是明了,只可查有序表且插入删除困难。写代码无非周全,写算法无非细节,考察算法无非也是考察各种细节。话不多说,代码参上:
#coding=utf-8# l:左边界# r:右边界print '快速查找'def quicksort(item,l,r,i,isproc=False): right = r left = l mid = (right+left)/2 while left < right: if isproc == True: print mid,left,right if i == item[left]: return left if i == item[right]: return right if i == item[mid]: return mid if i < item[mid]: #print 'i(%s) < %s|item[%s]'%(i,item[mid],mid) right = mid - 1 if i > item[mid]: #print 'i(%s) > %s|item[%s]'%(i,item[mid],mid) left = mid + 1 mid = (right+left)/2 else: print '成功完成快速查找'ap = [4,9,14,8,274,-882192,913,-492,-3]print '%s 中查找%s,其位置:%s'%(ap,14,quicksort(ap,0,len(ap)-1,14))print '%s 中查找%s,其位置:%s'%(ap,8,quicksort(ap,0,len(ap)-1,8))apc = [4,9,14,19,274,4821,91342]print '%s 中查找%s,其位置:%s'%(apc,91342,quicksort(apc,0,len(apc)-1,91342))unsi = [92,23,52,-45,175,99,3,-24,-7,3,0]print '%s 中查找%s,其位置:%s'%(unsi,99,quicksort(unsi,0,len(unsi)-1,99,False))
你问我 为毛叫quicksort,我想说不要在意这些细节
代码并不多,可是要独自写出来可不易,参数的检验是交由调用者完成的,我们无条件信任调用者。
我依旧如C语言一样,提供Left,Right参数自定义list(在C语言中的数组基本等价Python的list对象)的查找边界,len并没有写进函数里
如果你担心 mid溢出 ,那么你可以灵活变换一下使用 mid = left +(right - left)/2 可以解决少见的溢出问题
对于while循环条件,right = = left ,真的没几个人会这么蛋疼的拿[4,4]的区间或者单个元素来让你找不同的,即便是循环造成的也无大碍我们有大if语句在
情况无非,我们的目标 i 在 mid上,i 或在 mid右,i 亦或在 mid左,还是i 在 left 上,i 也是可在 right上
在坐标mid、right、left上的,问君犹豫什么,赶快告诉妈妈(输出啊,adc,快上)
不在那我们去邻居家找,在 mid右边,left = mid + 1,同理,对于在mid左边的藏匿的同学,right = mid - 1
把查找范围尺调整,边界right或left使原来的查找范围缩小一半,left ,mid,right相对位置不变就可以继续循环找,left和right相遇了就够了,不能再找了。
循环最后更新了边界坐标,怎能亏待mid呢,也要mid = (left+right)/2 刷新刷新
总得来说还看得过去,此代码可以较为巧妙地运用在非有序表上,至今我没发现什么问题
看来不认真写博客,以后工作都找不到了
- 二分查找的小改进
- 改进的二分查找
- 对二分查找的改进
- 二分查找的改进--差值查找
- 二分查找的一点改进优化
- 改进二分查找
- 二分查找的小BUG
- 二分查找法及改进
- 二分查找以及改进算法
- 插入排序的改进版本(二分查找)
- 二分查找小问题
- 二分查找小总结
- 二分查找的改进 差值查找(low<=high,这与快排low<high)
- 顺序查找的改进
- 折半查找的改进
- 在js中的改进版的冒泡排序法 和 二分查找法
- [2778]小明的花费预算 (二分查找)SDUT
- 二分查找算法的原理及一个实用小技巧
- iOS开发UI高级—10使用picker View控件完成一个简单的选餐应用
- 【SDUT 3253】 Game!
- iOS CoreData详解(七)性能相关
- 美素数备忘
- redis (二)
- 二分查找的小改进
- 黑马程序员_面向对象(多态)
- iOS开发UI高级—11ios应用数据存储方式(XML属性列表-plist)
- Java Struts2 中文乱码问题
- IoC容器Autofac(4) - Autofact + Asp.net MVC + EF Code First(附源码)
- 后端设计中特殊单元
- C++11:override 与 final
- HDU ACM 4502 吉哥系列故事——临时工计划 ->动态规划
- iOS开发UI高级—12ios应用数据存储方式(偏好设置)