Python二分查找详解


Posted in Python onSeptember 13, 2015

先来看个实例

#!/usr/bin/env python 
import sys  
 
def search2(a,m): 
  low = 0  
  high = len(a) - 1  
  while(low <= high): 
    mid = (low + high)/2 
    midval = a[mid] 
   
    if midval < m: 
      low = mid + 1  
    elif midval > m: 
      high = mid - 1  
    else: 
      print mid  
      return mid  
  print -1 
  return -1 
 
if __name__ == "__main__": 
  a = [int(i) for i in list(sys.argv[1])] 
  m = int(sys.argv[2]) 
  search2(a,m)

运行:

administrator@ubuntu:~/Python$ python test_search2.py 123456789 4

3

注:

1.'__':由于python的类成员都是公有、公开的被存取public,缺少像正统面向对象语言的私有private属性。
于是就用__来将就一下,模拟私有属性。这些__属性往往是内部使用,通常情况下不用改写。也不用读取。
加上2个下划线的目的,一是不和普通公有属性重名冲突,二是不让对象的使用者(非开发者)随意使用。
2.__name__ == "__main__"表示程序脚本是直接被执行的.
如果不等于表示脚本是被其他程序用import引入的.则其__name__属性被设为模块名

Python采用二分查找找出数字的下标

要考虑有重复数字的情况

class Solution(object):
  def searchRange(self, nums, target):
    """
    :type nums: List[int]
    :type target: int
    :rtype: List[int]
    """
    def binary_search(start,end,value):
      while end>=start:
        mid = (start+end)//2
        print(mid)
        if nums[mid]>target:
          end = mid-1
        elif nums[mid]<target:
          start = mid+1
        else: 
          if value==-1:
            if mid-1>=start and nums[mid+value] == target:
              end = mid+value
            else:
              return mid
          else:
            if mid+1<=end and nums[mid+value] == target:
              start = mid+value
            else:
              return mid
 
      return -1
    a=binary_search(0,len(nums)-1,-1)
    b=binary_search(0,len(nums)-1,1)
    return [a,b]
a = Solution()
l = [2,2]
print(a.searchRange(l,2))

二分算法的定义不在多说了,百度一下就知道(支持国产大笑)

import sys 
source = [1,2,3,4,5,6,7,8,9,10] #must be in order 
des = int(sys.argv[1]) 
low = 0 
high = len(source) - 1 
targetIndex = -1 
print "des=",des 
while low <= high: 
  middle = (low + high)/2 
  if des == source[middle]: 
    targetIndex = middle 
    break 
  elif des < source[middle]: 
    high = middle -1 
    print "middle element[index=",middle,",value=",source[middle],"] is bigger than des, continue search from[",low,"to",high,"]" 
  else: 
    low = middle + 1 
    print "middle element[index=",middle,",value=",source[middle],"] is smaller than des, continue search from[",low,"to",high,"]" 
print "search complete, target element's index in source list is ",targetIndex

最后在分享一个

'fileName--BinarySearch.py' 
 
src = [] 
 
def BinarySearch(low, high, target, *src): 
  '二分查找' 
  while low <= high: 
    mid = (low + high) // 2 
    midVal = src[mid] 
    if target < midVal: 
      high = mid - 1 
    elif target > midVal: 
      low = mid + 1 
    else: 
      return mid 
    BinarySearch(low, high, target, *src) 
 
print('Please input 10 number:') 
for number in range(10): 
  src.append(int(input('Num %d:' % number))) 
 
sortList = tuple(src) 
 
key = int(input('Please input key:')) 
location = BinarySearch(0, len(src) - 1, key, *sortList) 
 
if location != None: 
  print('Find target at %d' % (location + 1)) 
else: 
  print('No target!')
Python 相关文章推荐
Python标准异常和异常处理详解
Feb 02 Python
分享一个常用的Python模拟登陆类
Mar 29 Python
理解Python中函数的参数
Apr 27 Python
简要讲解Python编程中线程的创建与锁的使用
Feb 28 Python
利用Python破解斗地主残局详解
Jun 30 Python
Python3使用turtle绘制超立方体图形示例
Jun 19 Python
Python实用技巧之利用元组代替字典并为元组元素命名
Jul 11 Python
TensorFlow Session使用的两种方法小结
Jul 30 Python
python dict乱码如何解决
Jun 07 Python
获取python运行输出的数据并解析存为dataFrame实例
Jul 07 Python
记录一下scrapy中settings的一些配置小结
Sep 28 Python
Pytorch数据读取之Dataset和DataLoader知识总结
May 23 Python
基python实现多线程网页爬虫
Sep 06 #Python
python杀死一个线程的方法
Sep 06 #Python
在Python的Flask框架中验证注册用户的Email的方法
Sep 02 #Python
Python实现身份证号码解析
Sep 01 #Python
实例Python处理XML文件的方法
Aug 31 #Python
通过实例浅析Python对比C语言的编程思想差异
Aug 30 #Python
使用Python脚本将文字转换为图片的实例分享
Aug 29 #Python
You might like
将OICQ数据转成MYSQL数据
2006/10/09 PHP
php foreach、while性能比较
2009/10/15 PHP
在Windows系统上安装PHP运行环境文字教程
2010/07/19 PHP
php文件上传表单摘自drupal的代码
2011/02/15 PHP
通过缓存数据库结果提高PHP性能的原理介绍
2012/09/05 PHP
php遍历解析xml字符串的方法
2016/05/05 PHP
css图片自适应大小
2007/11/28 Javascript
onsubmit阻止form表单提交与onclick的相关操作
2010/09/03 Javascript
同一页面多个商品倒计时JS 基于面向对象的javascript
2012/02/16 Javascript
使用jquery动态加载javascript以减少服务器压力
2012/10/29 Javascript
jquery比较简洁的软键盘特效实现方法
2015/03/19 Javascript
jQuery实现页面滚动时动态加载内容的方法
2015/03/20 Javascript
nodejs简单实现中英文翻译
2015/05/04 NodeJs
jQuery简单获取键盘事件的方法
2016/01/22 Javascript
原生JS实现图片轮播与淡入效果的简单实例
2016/08/21 Javascript
Angular中的$watch方法详解
2017/09/18 Javascript
vue.js实现的经典计算器/科学计算器功能示例
2018/07/11 Javascript
jQuery实现上下滚动公告栏详细代码
2018/11/21 jQuery
浅谈vue 多个变量同时赋相同值互相影响
2020/08/05 Javascript
vant-ui组件调用Dialog弹窗异步关闭操作
2020/11/04 Javascript
Python通过递归遍历出集合中所有元素的方法
2015/02/25 Python
python常规方法实现数组的全排列
2015/03/17 Python
在Linux系统上部署Apache+Python+Django+MySQL环境
2015/12/24 Python
python 文件操作删除某行的实例
2017/09/04 Python
Python multiprocessing多进程原理与应用示例
2019/02/28 Python
django 实现将本地图片存入数据库,并能显示在web上的示例
2019/08/07 Python
python global和nonlocal用法解析
2020/02/03 Python
pandas数据选取:df[] df.loc[] df.iloc[] df.ix[] df.at[] df.iat[]
2020/04/24 Python
FitFlop澳大利亚官网:英国符合人体工学的鞋类品牌
2017/06/05 全球购物
迷你唐卡软皮鞋:Minnetonka Moccasin
2018/05/01 全球购物
BLACKMORES澳洲官网:澳大利亚排名第一的保健品牌
2018/09/27 全球购物
应届毕业生个人求职自荐信
2014/01/06 职场文书
出纳工作岗位责任制
2014/02/02 职场文书
2014年秋季开学典礼致辞
2014/08/02 职场文书
宪法宣传标语100条
2019/10/15 职场文书
CSS 鼠标选中文字后改变背景色的实现代码
2023/05/21 HTML / CSS