2022年 11月 4日

python 二分法详解

目录

一、二分法基本思想

二、二分法适用情况

三、代码示例


一、二分法基本思想

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

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

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

 


二、二分法适用情况

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

三、代码示例

  1. #判断301在不在l列表中(l列表是有序列表)
  2. l = [1,2,3,4,7,8, 11, 34,65,76,301,887,888,55454,777777]
  3. #运用递归来进行二分法查找
  4. def dichotomy(l,num):
  5. print(l)
  6. max_index = len(l)//2
  7. if num >l[max_index] :
  8. dichotomy(l[max_index+1:], num)
  9. elif num < l[max_index]:
  10. dichotomy(l[0:max_index], num)
  11. else:
  12. print('In the list')
  13. dichotomy(l,301)
  14. #案例二,更直观。
  15. def ErFenFa(array,key):
  16. print ('列表长度为:',len(array)) #先计算列表的长度
  17. mid = int((len(array)-1)/2)
  18. print ('列表中间位数下标为:',mid)
  19. min = 0
  20. max = len(array)-1
  21. print ('即将开始判断,初始化最小数下标为0,最大数下标为:%s'%max)
  22. print ('-'*10)
  23. count = 0
  24. while True:
  25. center = int((min + max) / 2)
  26. print ('本次查找的位置:', center)
  27. if array[center] > key:
  28. #这种说明查找到的数字大于我们要找的数字
  29. max = center - 1
  30. elif array[center] < key:
  31. #这种说明查找到的数字小于我们要找的数字
  32. min = center + 1
  33. print(min)
  34. elif array[center] == key:
  35. return ('找到了,在数组的第%s个位置'%center)
  36. if __name__ == '__main__':
  37. print (ErFenFa([1,2,3,34,56,57,78,87],87))