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中的全局变量用法分析
Jun 09 Python
Python作用域用法实例详解
Mar 15 Python
Python内置函数 next的具体使用方法
Nov 24 Python
python基础教程项目三之万能的XML
Apr 02 Python
python读取文件名称生成list的方法
Apr 27 Python
python如何实现一个刷网页小程序
Nov 27 Python
详解pandas安装若干异常及解决方案总结
Jan 10 Python
Python实现的企业粉丝抽奖功能示例
Jul 26 Python
python模拟鼠标点击和键盘输入的操作
Aug 04 Python
Python(PyS60)实现简单语音整点报时
Nov 18 Python
Python实现实时数据采集新型冠状病毒数据实例
Feb 04 Python
Python 数据可视化之Bokeh详解
Nov 02 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无限分类(树形类)
2013/09/28 PHP
php分页示例分享
2014/04/30 PHP
基于thinkPHP类的插入数据库操作功能示例
2017/01/06 PHP
PHP和MYSQL实现分页导航思路详解
2017/04/11 PHP
网站被恶意镜像怎么办 php一段代码轻松搞定(全面版)
2018/10/23 PHP
laravel 创建命令行命令的图文教程
2019/10/23 PHP
JavaScript中数组的排序、乱序和搜索实现代码
2011/11/30 Javascript
使用JavaScript修改浏览器URL地址栏的实现代码
2013/10/21 Javascript
js随机生成网页背景颜色的方法
2015/02/26 Javascript
简单学习JavaScript中的for语句循环结构
2015/11/10 Javascript
JS iFrame加载慢怎么解决
2016/05/13 Javascript
JavaScript 字符串常用操作小结(非常实用)
2016/11/30 Javascript
Node.js中.pfx后缀文件的处理方法
2017/03/10 Javascript
使用Vue写一个datepicker的示例
2018/01/27 Javascript
js中apply和Math.max()函数的问题及区别介绍
2018/03/27 Javascript
Vue.js中Line第三方登录api的实现代码
2020/06/29 Javascript
使用eslint和githooks统一前端风格的技巧
2020/07/29 Javascript
wepy--用vantUI 实现上弹列表并选择相应的值操作
2020/11/03 Javascript
[46:21]Liquid vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
python处理文本文件并生成指定格式的文件
2014/07/31 Python
Python正则捕获操作示例
2017/08/19 Python
Python爬虫工程师面试问题总结
2018/03/22 Python
如何利用python制作时间戳转换工具详解
2018/09/12 Python
python函数参数(必须参数、可变参数、关键字参数)
2019/08/16 Python
音频处理 windows10下python三方库librosa安装教程
2020/06/20 Python
Python用SSH连接到网络设备
2021/02/18 Python
Html5实现移动端、PC端 刮刮卡效果
2016/06/30 HTML / CSS
Ray-Ban雷朋太阳眼镜英国官网:Ray-Ban UK
2019/11/23 全球购物
中职生自我鉴定范文
2013/10/03 职场文书
社区党建工作汇报材料
2014/08/14 职场文书
职业道德模范事迹材料
2014/08/24 职场文书
交通事故协议书范文
2014/10/23 职场文书
2014年反洗钱工作总结
2014/11/22 职场文书
英语辞职信范文
2015/02/28 职场文书
python自动化八大定位元素讲解
2021/07/09 Python
Win11 vmware不兼容怎么办?Win11与VMware虚拟机不兼容的解决方法
2023/01/09 数码科技