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 相关文章推荐
phpsir 开发 一个检测百度关键字网站排名的python 程序
Sep 17 Python
python实现数通设备tftp备份配置文件示例
Apr 02 Python
Python搭建APNS苹果推送通知推送服务的相关模块使用指南
Jun 02 Python
利用Python爬取可用的代理IP
Aug 18 Python
Python 装饰器使用详解
Jul 29 Python
python实现随机森林random forest的原理及方法
Dec 21 Python
Python Numpy 数组的初始化和基本操作
Mar 13 Python
对Python通过pypyodbc访问Access数据库的方法详解
Oct 27 Python
Python流行ORM框架sqlalchemy安装与使用教程
Jun 04 Python
python画图把时间作为横坐标的方法
Jul 07 Python
在python shell中运行python文件的实现
Dec 21 Python
Python Pandas知识点之缺失值处理详解
May 11 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中根据某年第几天计算出日期年月日的代码
2011/02/24 PHP
PHP中使用file_get_contents抓取网页中文乱码问题解决方法
2014/12/17 PHP
CentOS6.5 编译安装lnmp环境
2014/12/21 PHP
php 把数字转换成汉字的代码
2015/07/21 PHP
jQuery使用手册之一
2007/03/24 Javascript
基于jquery的气泡提示效果
2010/05/31 Javascript
javascript各浏览器中option元素的表现差异
2011/04/07 Javascript
5个最佳的Javascript日期处理类库分享
2012/04/15 Javascript
『jQuery』名称冲突使用noConflict方法解决
2013/04/22 Javascript
jquery上传插件fineuploader上传文件使用方法(jquery图片上传插件)
2013/12/05 Javascript
分享20款美化网站的 jQuery Lightbox 灯箱插件
2014/10/10 Javascript
js鼠标点击图片实现随机变换图片的方法
2015/02/16 Javascript
jQuery动画显示和隐藏效果实例演示(附demo源码下载)
2015/12/31 Javascript
jQuery简单实现中间浮窗效果
2016/09/04 Javascript
基于vue2.0+vuex+localStorage开发的本地记事本示例
2017/02/28 Javascript
详解Vue.use自定义自己的全局组件
2017/06/14 Javascript
基于jquery实现多级菜单效果
2017/07/25 jQuery
react-native 完整实现登录功能的示例代码
2017/09/11 Javascript
自己动手封装一个React Native多级联动
2018/09/19 Javascript
vue路由事件beforeRouteLeave及组件内定时器的清除方法
2018/09/29 Javascript
[32:56]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第二场 12.11
2020/12/16 DOTA
跟老齐学Python之大话题小函数(2)
2014/10/10 Python
Python的Flask框架标配模板引擎Jinja2的使用教程
2016/07/12 Python
Django中STATIC_ROOT和STATIC_URL及STATICFILES_DIRS浅析
2018/05/08 Python
用Python开发app后端有优势吗
2020/06/29 Python
python字典key不能是可以是啥类型
2020/08/04 Python
css 元素选择器的简单实例
2016/05/23 HTML / CSS
Alba Moda瑞士网上商店:独家意大利时尚女装销售
2016/11/28 全球购物
澳大利亚最大的网上油画销售画廊:Direct Art Australia
2018/04/15 全球购物
《赵州桥》教学反思
2014/02/17 职场文书
财务担保书范文
2014/04/02 职场文书
公司副总经理任命书
2014/06/05 职场文书
2015年元旦联欢晚会活动总结
2014/11/28 职场文书
2015年五一劳动节活动总结
2015/02/09 职场文书
离职信范本
2015/06/23 职场文书
Python开发五子棋小游戏
2022/04/28 Python