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自动安装pip
Apr 24 Python
Python中使用select模块实现非阻塞的IO
Feb 03 Python
Python中使用bidict模块双向字典结构的奇技淫巧
Jul 12 Python
Python 爬虫学习笔记之单线程爬虫
Sep 21 Python
python 3.7.0 下pillow安装方法
Aug 27 Python
用python生成1000个txt文件的方法
Oct 25 Python
python实现kmp算法的实例代码
Apr 03 Python
python被修饰的函数消失问题解决(基于wraps函数)
Nov 04 Python
python的scipy实现插值的示例代码
Nov 12 Python
Python run()函数和start()函数的比较和差别介绍
May 03 Python
python实现移动木板小游戏
Oct 09 Python
Python性能测试工具Locust安装及使用
Dec 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 八种基本的数据类型小结
2011/06/01 PHP
php中将数组转成字符串并保存到数据库中的函数代码
2013/09/29 PHP
javascript 用记忆函数快速计算递归函数
2010/03/15 Javascript
jQuery 获取对象 根据属性、内容匹配, 还有表单元素匹配
2010/05/31 Javascript
纯Javascript实现Windows 8 Metro风格实现
2013/10/15 Javascript
javascript字符串替换及字符串分割示例代码
2013/12/12 Javascript
jQuery ui 利用 datepicker插件实现开始日期(minDate)和结束日期(maxDate)
2014/05/22 Javascript
jQuery实现下滑菜单导航效果代码
2015/08/25 Javascript
使用canvas实现仿新浪微博头像截取上传功能
2015/09/02 Javascript
jQuery计算文本框字数及限制文本框字数的方法
2016/03/01 Javascript
JS代码防止SQL注入的方法(超简单)
2016/04/12 Javascript
无缝滚动的简单实现代码(推荐)
2016/06/07 Javascript
javascript基础练习之翻转字符串与回文
2017/02/20 Javascript
Vue声明式渲染详解
2017/05/17 Javascript
vue生成token保存在客户端localStorage中的方法
2017/10/25 Javascript
vue router嵌套路由在history模式下刷新无法渲染页面问题的解决方法
2018/01/25 Javascript
puppeteer实现html截图的示例代码
2019/01/10 Javascript
详解Vue中使用Axios拦截器
2019/04/22 Javascript
JavaScript页面倒计时功能完整示例
2019/05/15 Javascript
JS实现多选框的操作
2020/06/24 Javascript
在nodejs中创建child process的方法
2021/01/26 NodeJs
[54:56]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第三局
2016/03/06 DOTA
python搭建简易服务器分析与实现
2012/12/15 Python
python基础教程之实现石头剪刀布游戏示例
2014/02/11 Python
Python生成8位随机字符串的方法分析
2017/12/05 Python
python 接收处理外带的参数方法
2018/12/03 Python
Pandas之DataFrame对象的列和索引之间的转化
2019/06/25 Python
Python类如何定义私有变量
2020/02/03 Python
python属于跨平台语言码
2020/06/09 Python
GNC健安喜官方海外旗舰店:美国著名保健品牌
2017/01/04 全球购物
美国礼品卡交易网站:Cardpool
2018/08/27 全球购物
求职推荐信范文
2013/12/01 职场文书
优秀演讲稿范文
2013/12/29 职场文书
九华山导游词
2015/02/03 职场文书
2016年第32个教师节致辞
2015/11/26 职场文书
《合作意向书》怎么写?
2019/08/20 职场文书