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更新数据库脚本两种方法及对比介绍
Jul 27 Python
Django配置celery(非djcelery)执行异步任务和定时任务
Jul 16 Python
python使用folium库绘制地图点击框
Sep 21 Python
Python 串口读写的实现方法
Jun 12 Python
解决python执行不输出系统命令弹框的问题
Jun 24 Python
Python绘图Matplotlib之坐标轴及刻度总结
Jun 28 Python
python网络爬虫 CrawlSpider使用详解
Sep 27 Python
详解Django CAS 解决方案
Oct 30 Python
Python调用钉钉自定义机器人的实现
Jan 03 Python
使用 Python 读取电子表格中的数据实例详解
Apr 17 Python
Selenium获取登录Cookies并添加Cookies自动登录的方法
Dec 04 Python
Python异常类型以及处理方法汇总
Jun 05 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
迅雷下载《中学科技》怀旧期刊下载
2021/02/27 无线电
php类
2006/11/27 PHP
微信公众平台开发关注及取消关注事件的方法
2014/12/23 PHP
CodeIgniter配置之autoload.php自动加载用法分析
2016/01/20 PHP
JS启动应用程序的一个简单例子
2008/05/11 Javascript
JavaScript中的style.cssText使用教程
2014/11/06 Javascript
jquery+easeing实现仿flash的载入动画
2015/03/10 Javascript
jquery.validate表单验证插件使用方法解析
2016/11/07 Javascript
javascript简单进制转换实现方法
2016/11/24 Javascript
使用vue构建移动应用实战代码
2017/08/02 Javascript
JS开发中基本数据类型具体有哪几种
2017/10/19 Javascript
Vue的移动端多图上传插件vue-easy-uploader的示例代码
2017/11/27 Javascript
Vue用v-for给循环标签自身属性添加属性值的方法
2018/10/18 Javascript
mpvue性能优化实战技巧(小结)
2019/04/17 Javascript
小程序:授权、登录、session_key、unionId的详解
2019/05/15 Javascript
JavaScript中的连续赋值问题实例分析
2019/07/12 Javascript
d3.js 地铁轨道交通项目实战
2019/11/27 Javascript
js实现带积分弹球小游戏
2020/07/21 Javascript
bootstrap实现tab选项卡切换
2020/08/09 Javascript
Python正则表达式匹配ip地址实例
2014/10/09 Python
Python实现多并发访问网站功能示例
2017/06/19 Python
Python双精度浮点数运算并分行显示操作示例
2017/07/21 Python
Python Matplotlib库安装与基本作图示例
2019/01/09 Python
Python面向对象程序设计之私有属性及私有方法示例
2019/04/08 Python
如何在Django中使用聚合的实现示例
2020/03/23 Python
python3+selenium获取页面加载的所有静态资源文件链接操作
2020/05/04 Python
用pip给python安装matplotlib库的详细教程
2021/02/24 Python
优秀村官事迹材料
2014/01/10 职场文书
法定代表人身份证明书
2014/09/10 职场文书
简单租房协议书(范本)
2014/10/13 职场文书
会计实训报告范文
2014/11/04 职场文书
青年岗位能手事迹材料
2014/12/23 职场文书
2015暑期社会实践个人总结
2015/07/13 职场文书
2016元旦晚会主持词开场白和结束语
2015/12/04 职场文书
如何在Python中妥善使用进度条详解
2022/04/05 Python
JS setTimeout与setInterval的区别
2022/04/20 Javascript