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 相关文章推荐
Django1.3添加app提示模块不存在的解决方法
Aug 26 Python
详解在Python程序中使用Cookie的教程
Apr 30 Python
python中字典(Dictionary)用法实例详解
May 30 Python
将Emacs打造成强大的Python代码编辑工具
Nov 20 Python
pandas DataFrame 根据多列的值做判断,生成新的列值实例
May 18 Python
Python numpy实现二维数组和一维数组拼接的方法
Jun 05 Python
python实现输入数字的连续加减方法
Jun 22 Python
Python使用pymysql从MySQL数据库中读出数据的方法
Jul 25 Python
Python爬虫库BeautifulSoup的介绍与简单使用实例
Jan 25 Python
使用 Python 遍历目录树的方法
Feb 29 Python
浅谈Python的方法解析顺序(MRO)
Mar 05 Python
keras的ImageDataGenerator和flow()的用法说明
Jul 03 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网页木马一枚 附PHP木马的防范方法
2009/10/09 PHP
Php Mssql操作简单封装支持存储过程
2009/12/11 PHP
php分页思路以及在ZF中的使用
2012/05/30 PHP
PHP文件锁函数flock()详细介绍
2014/11/18 PHP
详解WordPress开发中过滤属性以及Sql语句的函数使用
2015/12/25 PHP
thinkPHP导出csv文件及用表格输出excel的方法
2015/12/30 PHP
jquery实现奇偶行赋值不同css值
2012/02/17 Javascript
jQuery中append()方法用法实例
2014/12/25 Javascript
jquery果冻抖动效果实现方法
2015/01/15 Javascript
jQuery控制Div拖拽效果完整实例分析
2015/04/15 Javascript
纯js模拟div层弹性运动的方法
2015/07/27 Javascript
AngularJS实现textarea记录只能输入规定数量的字符并显示
2016/04/26 Javascript
jQuery实现的超链接提示效果示例【附demo源码下载】
2016/09/09 Javascript
Angular6 用户自定义标签开发的实现方法
2019/01/08 Javascript
JavaScript中常用的简洁高级技巧总结
2019/03/10 Javascript
解决Layui中layer报错的问题
2019/09/03 Javascript
Javascript Worker子线程代码实例
2020/02/20 Javascript
javascript递归函数定义和用法示例分析
2020/07/22 Javascript
Python3导入自定义模块的三种方法详解
2018/04/13 Python
利用python如何处理百万条数据(适用java新手)
2018/06/06 Python
pygame实现弹球游戏
2020/04/14 Python
Python如何将字符串转换为日期
2020/07/31 Python
HTML5 canvas基本绘图之绘制线段
2016/06/27 HTML / CSS
html5 制作地图当前定位箭头的方法示例
2020/01/10 HTML / CSS
Vans(范斯)德国官网:美国南加州的原创极限运动潮牌
2017/05/02 全球购物
linux面试题参考答案(9)
2015/01/07 面试题
高中生自我鉴定范文
2013/10/30 职场文书
班主任工作年限证明
2014/01/12 职场文书
服装设计师职业生涯规划范文
2014/02/28 职场文书
篝火晚会策划方案
2014/05/16 职场文书
2014年煤矿工人工作总结
2014/12/08 职场文书
药品销售内勤岗位职责
2015/04/13 职场文书
2015年实习生工作总结报告
2015/04/28 职场文书
2016北大自主招生自荐信模板
2016/01/28 职场文书
2019大学生实习报告
2019/06/21 职场文书
Golang Elasticsearches 批量修改查询及发送MQ
2022/04/19 Golang