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的id()函数介绍
Feb 10 Python
Python引用(import)文件夹下的py文件的方法
Aug 26 Python
python获取从命令行输入数字的方法
Apr 29 Python
详解Python中break语句的用法
May 14 Python
简单了解Python中的几种函数
Nov 03 Python
python 对象和json互相转换方法
Mar 22 Python
Python类的继承、多态及获取对象信息操作详解
Feb 28 Python
如何使用Python进行OCR识别图片中的文字
Apr 01 Python
python简单区块链模拟详解
Jul 03 Python
pytorch 预训练层的使用方法
Aug 20 Python
解决Python3下map函数的显示问题
Dec 04 Python
Python面向对象程序设计之私有变量,私有方法原理与用法分析
Mar 23 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创建PDF中文文档
2006/10/09 PHP
解析在apache里面给php写虚拟目录的详细方法
2013/06/24 PHP
ThinkPHP中__initialize()和类的构造函数__construct()用法分析
2014/11/29 PHP
PHP基于pdo的数据库操作类【可支持mysql、sqlserver及oracle】
2018/05/21 PHP
PHP程序守护进程化实现方法详解
2020/07/16 PHP
浅谈javascript的数据类型检测
2010/07/10 Javascript
基于jquery实现的类似百度搜索的输入框自动完成功能
2011/08/23 Javascript
javascript自然分类法算法实现代码
2013/10/11 Javascript
基于jQuery实现淡入淡出效果轮播图
2020/07/31 Javascript
解析利用javascript如何判断一个数为素数
2016/12/08 Javascript
详解js中Number()、parseInt()和parseFloat()的区别
2016/12/20 Javascript
Javascript中数组去重与拍平的方法示例
2017/02/03 Javascript
微信小程序云开发之数据库操作
2019/05/18 Javascript
通过JQuery,JQueryUI和Jsplumb实现拖拽模块
2019/06/18 jQuery
关于layui 弹出层一闪而过就消失的解决方法
2019/09/09 Javascript
package.json中homepage属性的作用详解
2020/03/11 Javascript
[41:52]2018DOTA2亚洲邀请赛3月29日小组赛B组Effect VS Secret
2018/03/30 DOTA
python常用web框架简单性能测试结果分享(包含django、flask、bottle、tornado)
2014/08/25 Python
在Python的Django框架上部署ORM库的教程
2015/04/20 Python
Windows下python2.7.8安装图文教程
2016/05/26 Python
解决pandas.DataFrame.fillna 填充Nan失败的问题
2018/11/06 Python
Django 多环境配置详解
2019/05/14 Python
python由已知数组快速生成新数组的方法
2020/04/08 Python
python创建文本文件的简单方法
2020/08/30 Python
python批量生成条形码的示例
2020/10/10 Python
35款精致的 CSS3 和 HTML5 网页模板 推荐
2012/08/03 HTML / CSS
Linux管理员面试经常问道的相关命令
2013/04/29 面试题
办公设备采购方案
2014/03/16 职场文书
我的老师教学反思
2014/05/01 职场文书
幼儿园教师演讲稿
2014/05/06 职场文书
同志主要表现材料
2014/08/21 职场文书
2015年小学语文教师工作总结
2015/10/23 职场文书
2015年中学体育教师工作总结
2015/10/23 职场文书
酒店工程部的岗位职责汇总大全
2019/10/23 职场文书
俄罗斯十大城市人口排名,第三首都仅排第六,第二是北方首都
2022/03/20 杂记
nginx.conf配置文件结构小结
2022/04/08 Servers