python 二分法详解

为君一笑 提交于 2020-02-07 07:38:02

目录

一、二分法基本思想

二、二分法适用情况

三、代码示例


一、二分法基本思想

二分法是一个非常高效的算法,它常常用于计算机的查找过程中。

先玩一个小游戏。预先给定一个小于100的正整数x,让你猜,猜测过程中给予大小判断的提示,问你怎样快速地猜出来?

这样猜测最快,先猜50,如果猜对了,结束;如果猜大了,往小的方向猜,再猜25;如果猜小了,往大的方向猜,再猜75;…,每猜测1次就去掉一半的数,就这样可以逐步逼近预先给定的数字。这种思想就是二分法。

 


二、二分法适用情况

  1. 该数组,必须是有序
    1. 二分查找依赖的是顺序表结构,即数组。
    2. 二分查找针对的是有序数据,因此只能用在插入、删除操作不频繁,一次排序多次查找的场景中。
  2. 对数据量大小有要求。
    1. 数据量太小不适合二分查找,与直接遍历相比效率提升不明显。但有一个例外,就是数据之间的比较操作非常费时,比如数组中存储的都是组成长度超过100的字符串。
    2. 数据量太大也不适合用二分查找,因为数组需要连续的空间,若数据量太大,往往找不到存储如此大规模数据的连续内存空间。
  3. 一般要求找到的是某一个值或一个位置。

三、代码示例

#判断301在不在l列表中(l列表是有序列表)
l  = [1,2,3,4,7,8, 11, 34,65,76,301,887,888,55454,777777]

#运用递归来进行二分法查找
def dichotomy(l,num):
    print(l)
    max_index = len(l)//2
    if num >l[max_index] :
        dichotomy(l[max_index+1:], num)
    elif num < l[max_index]:
        dichotomy(l[0:max_index], num)
    else:
        print('In the list')

dichotomy(l,301)


#案例二,更直观。
def ErFenFa(array,key):
      print ('列表长度为:',len(array)) #先计算列表的长度
      mid = int((len(array)-1)/2)
      print ('列表中间位数下标为:',mid)
      min = 0
      max = len(array)-1
      print ('即将开始判断,初始化最小数下标为0,最大数下标为:%s'%max)
      print ('-'*10)
      count = 0
      while True:
          center = int((min + max) / 2)
          print ('本次查找的位置:', center)
          if array[center] > key:
            #这种说明查找到的数字大于我们要找的数字
            max = center - 1
          elif  array[center] < key:
            #这种说明查找到的数字小于我们要找的数字
            min = center + 1
            print(min)
          elif  array[center] == key:
            return ('找到了,在数组的第%s个位置'%center)
if __name__ == '__main__':
  print (ErFenFa([1,2,3,34,56,57,78,87],87))

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!