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的urllib库提交WEB表单
Feb 24 Python
用Python登录Gmail并发送Gmail邮件的教程
Apr 17 Python
深入浅析Python中join 和 split详解(推荐)
Jun 30 Python
Python全局变量用法实例分析
Jul 19 Python
python如何读写json数据
Mar 21 Python
Python实现获取前100组勾股数的方法示例
May 04 Python
Python3.x爬虫下载网页图片的实例讲解
May 22 Python
python re库的正则表达式入门学习教程
Mar 08 Python
Python搭建代理IP池实现接口设置与整体调度
Oct 27 Python
Python通过socketserver处理多个链接
Mar 18 Python
Django form表单与请求的生命周期步骤详解
Jun 07 Python
Python爬虫之Selenium中frame/iframe表单嵌套页面
Dec 04 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
php 网页播放器用来播放在线视频的代码(自动判断并选择视频文件类型)
2010/06/03 PHP
php封装单文件上传到数据库(路径)
2017/10/15 PHP
thinkPHP框架动态配置用法实例分析
2018/06/14 PHP
JS URL传中文参数引发的乱码问题
2009/09/02 Javascript
jquery的$getjson调用并获取远程的JSON字符串问题
2012/12/10 Javascript
引用 js在IE与FF之间的区别详细解析
2013/11/20 Javascript
javaScript如何生成xmlhttp
2013/12/16 Javascript
js禁止回车提交表单的示例代码
2013/12/23 Javascript
Jquery使用css方法改变样式实例
2015/05/18 Javascript
Vuex模块化实现待办事项的状态管理
2017/03/15 Javascript
windows下vue.js开发环境搭建教程
2017/03/20 Javascript
JS设置随机出现2个数字的实例代码
2017/07/19 Javascript
微信小程序之页面跳转和参数传递的实现
2017/09/29 Javascript
Vue加载组件、动态加载组件的几种方式
2018/08/31 Javascript
Python基础中所出现的异常报错总结
2016/11/19 Python
python操作列表的函数使用代码详解
2017/12/28 Python
Python实现爬虫从网络上下载文档的实例代码
2018/06/13 Python
python list转置和前后反转的例子
2019/08/26 Python
在Matplotlib图中插入LaTex公式实例
2020/04/17 Python
用python读取xlsx文件
2020/12/17 Python
html5 canvas 使用示例
2010/10/22 HTML / CSS
教你使用Canvas处理图片的方法
2017/11/28 HTML / CSS
乡镇消防工作实施方案
2014/03/27 职场文书
原料仓管员岗位职责
2014/04/12 职场文书
中班幼儿评语大全
2014/04/30 职场文书
服务标语大全
2014/06/18 职场文书
伦敦奥运会的口号
2014/06/21 职场文书
2014年乡镇人大工作总结
2014/11/25 职场文书
2015年考研复习计划
2015/01/19 职场文书
六一儿童节主持开场白
2015/05/28 职场文书
贫困证明怎么写
2015/06/16 职场文书
六一亲子活动感想
2015/08/07 职场文书
JavaScript使用canvas绘制坐标和线
2021/04/28 Javascript
java中重写父类方法加不加@Override详解
2021/06/21 Java/Android
Python中文纠错的简单实现
2021/07/07 Python
Python 避免字典和元组的多重嵌套问题
2022/07/15 Python