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爬虫之抓取百度贴吧代码分享
Nov 06 Python
python通过正则查找微博@(at)用户的方法
Mar 13 Python
Python回文字符串及回文数字判定功能示例
Mar 20 Python
15行Python代码带你轻松理解令牌桶算法
Mar 21 Python
快速解决pandas.read_csv()乱码的问题
Jun 15 Python
python实现飞机大战
Sep 11 Python
python感知机实现代码
Jan 18 Python
python实现祝福弹窗效果
Apr 07 Python
如何基于Python实现电子邮件的发送
Dec 16 Python
利于python脚本编写可视化nmap和masscan的方法
Dec 29 Python
PyTorch 实现L2正则化以及Dropout的操作
May 27 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下利用shell后台运行PHP脚本,并获取该脚本的Process ID的代码
2011/09/19 PHP
PHPMYADMIN导入数据最大为2M的解决方法
2012/04/23 PHP
php将字符串随机分割成不同长度数组的方法
2015/06/01 PHP
yii2框架中使用下拉菜单的自动搜索yii-widget-select2实例分析
2016/01/09 PHP
javascript入门·动态的时钟,显示完整的一些方法,新年倒计时
2007/10/01 Javascript
JavaScript创建对象的写法
2013/08/29 Javascript
基于jquery插件实现常见的幻灯片效果
2013/11/01 Javascript
如何书写高质量jQuery代码(使用jquery性能问题)
2014/06/30 Javascript
JavaScript基础语法、dom操作树及document对象
2014/12/02 Javascript
jQuery实现的调整表格行tr上下顺序
2016/01/10 Javascript
前端js文件合并的三种方式推荐
2016/05/19 Javascript
jQuery处理XML文件的几种方法
2016/06/14 Javascript
JS实现图片剪裁并预览效果
2016/08/12 Javascript
Vuejs第八篇之Vuejs组件的定义实例解析
2016/09/05 Javascript
JSON与XML的区别对比及案例应用
2016/11/11 Javascript
jQuery的$.extend 浅拷贝与深拷贝
2017/03/08 Javascript
jquery版轮播图效果和extend扩展
2017/07/18 jQuery
vuejs 动态添加input框的实例讲解
2018/08/24 Javascript
vue2中,根据list的id进入对应的详情页并修改title方法
2018/08/24 Javascript
Mint UI组件库CheckList使用及踩坑总结
2018/12/20 Javascript
python基础教程之数字处理(math)模块详解
2014/03/25 Python
Python实现将目录中TXT合并成一个大TXT文件的方法
2015/07/15 Python
Django Admin实现上传图片校验功能
2016/03/06 Python
Python引用类型和值类型的区别与使用解析
2017/10/17 Python
Python格式化输出%s和%d
2018/05/07 Python
详解Python3.6的py文件打包生成exe
2018/07/13 Python
win7 x64系统中安装Scrapy的方法
2018/11/18 Python
详解解决Python memory error的问题(四种解决方案)
2019/08/08 Python
Python:slice与indices的用法
2019/11/25 Python
纯css3实现鼠标经过图片显示描述的动画效果
2014/09/01 HTML / CSS
美国顶级品牌男士大码服装店:DXL
2017/08/30 全球购物
Tory Burch德国官网:美国时尚生活品牌
2018/01/03 全球购物
向领导表决心的话
2014/03/11 职场文书
委托证明书
2014/09/17 职场文书
Python进阶学习之带你探寻Python类的鼻祖-元类
2021/05/08 Python
nginx作grpc的反向代理踩坑总结
2021/07/07 Servers