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 相关文章推荐
合并Excel工作薄中成绩表的VBA代码,非常适合教育一线的朋友
Apr 09 Python
python判断一个集合是否包含了另外一个集合中所有项的方法
Jun 30 Python
python中星号变量的几种特殊用法
Sep 07 Python
django ajax json的实例代码
May 29 Python
Python3中列表list合并的四种方法
Apr 19 Python
TensorFlow实现简单的CNN的方法
Jul 18 Python
解决pytorch GPU 计算过程中出现内存耗尽的问题
Aug 19 Python
Python爬虫爬取Bilibili弹幕过程解析
Oct 10 Python
Django 项目布局方法(值得推荐)
Mar 22 Python
完美解决jupyter由于无法import新包的问题
May 26 Python
python自动化之如何利用allure生成测试报告
May 02 Python
如何理解及使用Python闭包
Jun 01 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一些有意思的小区别
2006/12/06 PHP
php之Memcache学习笔记
2013/06/17 PHP
php使用pdo连接并查询sql数据库的方法
2014/12/24 PHP
PHP输出XML格式数据的方法总结
2017/02/08 PHP
Yii2框架自定义类统一处理url操作示例
2019/05/25 PHP
js checkbox(复选框) 使用集锦
2009/04/28 Javascript
Extjs学习笔记之四 工具栏和菜单
2010/01/07 Javascript
js不完美解决click和dblclick事件冲突问题
2012/07/16 Javascript
jQuery之日期选择器的深入解析
2013/06/19 Javascript
jQuery操作元素css样式的三种方法
2014/06/04 Javascript
JavaScript设计模式之工厂方法模式介绍
2014/12/28 Javascript
JQuery插件ajaxfileupload.js异步上传文件实例
2015/05/19 Javascript
jquery SweetAlert插件实现响应式提示框
2015/08/18 Javascript
JavaScript生成图形验证码
2020/08/24 Javascript
jQuery选择器中的特殊符号处理方法
2017/09/08 jQuery
react router 4.0以上的路由应用详解
2017/09/21 Javascript
JavaScript模拟实现封装的三种方式及写法区别
2017/10/27 Javascript
JavaScript canvas实现围绕旋转动画
2017/11/18 Javascript
探索Vue高阶组件的使用
2018/01/08 Javascript
JavaScript面向对象核心知识与概念归纳整理
2020/05/09 Javascript
JavaScript动态生成表格的示例
2020/11/02 Javascript
[02:36]DOTA2上海特锦赛 回忆电竞生涯的重要瞬间
2016/03/25 DOTA
Python实现螺旋矩阵的填充算法示例
2017/12/28 Python
Python 使用PIL numpy 实现拼接图片的示例
2018/05/08 Python
解决Python下json.loads()中文字符出错的问题
2018/12/19 Python
详解python做UI界面的方法
2019/02/27 Python
用django-allauth实现第三方登录的示例代码
2019/06/24 Python
Django框架组成结构、基本概念与文件功能分析
2019/07/30 Python
应届毕业生求职信范文
2013/12/18 职场文书
个人求职信范文分享
2014/01/06 职场文书
十八届三中全会学习方案
2014/02/16 职场文书
学校三八妇女节活动情况总结
2014/03/09 职场文书
写给老师的保证书
2015/05/09 职场文书
2015年加油站工作总结
2015/05/13 职场文书
导游词之井冈山
2019/11/20 职场文书
JS实现九宫格拼图游戏
2022/06/28 Javascript