当前位置:   article > 正文

二分查找——递归以及非递归方法【Python】超简单详细_二分查找法不使用递归

二分查找法不使用递归
 1、概述

        也叫折半查找,是一种在有序数组中查找特定元素的搜索算法

2、前提

        查找的序列必须有序

3、时间复杂度

        最差 O( nlogn ),最优 O( 1 )

4、查找步骤

        1. 找到数组的中间元素

        2. 如果中间元素正好是要查找的元素,则搜索过程结束

        3. 如果要查找的元素大于中间元素,则在数组的右半部分进行搜索

        4. 如果要查找的元素小于中间元素,则在数组的左半部分进行搜索

        5. 重复以上步骤,直到找到要查找的元素,或者搜索区间为空

5、代码实现

递归方法:

  1. # 1. 定义 二分查找 函数
  2. def binary_search(my_list, item):
  3. """
  4. 实现 二分查找
  5. :param my_list: 要查找的 列表,!必须:有序
  6. :param item: 要查找的 元素
  7. :return: 查找结果,找到 True,未找到 False
  8. """
  9. # 1.1 获取 列表长度
  10. n = len(my_list)
  11. # 1.2 若长度 <= 0,直接返回 False
  12. if n <= 0:
  13. return False
  14. # 1.3 获取 中间值 的索引
  15. mid = n // 2
  16. # 1.4 开始比较, 如果一样就返回True
  17. if item == my_list[mid]:
  18. return True
  19. # 1.5 如果要查找的值 < 中间值, 就去: 中间值的左边找
  20. elif item < my_list[mid]:
  21. return binary_search(my_list[:mid], item)
  22. # 1.6 如果要查找的值 > 中间值, 就去: 中间值的右边找
  23. else:
  24. return binary_search(my_list[mid+1:], item)
  25. # 2. 定义main函数, 测试
  26. if __name__ == '__main__':
  27. # 2.1 定义列表, 记录: 要查找的元素
  28. my_list = [11, 35, 44, 63, 77, 92]
  29. # 2.2 调用函数, 二分查找. 获取结果
  30. result = binary_search(my_list, 66)
  31. # 2.3 打印结果.
  32. print(f'查找结果为: {result}')
'
运行

非递归方法: 

  1. # 1. 定义 二分查找 函数
  2. def binary_search(my_list, item):
  3. """
  4. 实现 二分查找
  5. :param my_list: 要查找的 列表,!必须:有序
  6. :param item: 要查找的 元素
  7. :return: 查找结果,找到 True,未找到 False
  8. """
  9. # 1.1 查找区间, 开始索引 和 结束索引
  10. start = 0
  11. end = len(my_list) - 1
  12. # 1.2 开始循环查找
  13. while start <= end:
  14. # 1.3 计算中间索引, 要写到循环中, 每次循环都需要重新计算中间索引
  15. mid = (start + end) // 2
  16. # 1.4 具体的比较逻辑
  17. if item == my_list[mid]:
  18. return True
  19. elif item < my_list[mid]:
  20. end = mid - 1 # 如果目标值小于中间值, 就去左侧查找
  21. else:
  22. start = mid + 1 # 如果目标值大于中间值, 就去右侧查找
  23. # 1.5 走这里, 说明没找到, 返回结果即可
  24. return False
  25. # 2. 定义main函数, 测试
  26. if __name__ == '__main__':
  27. # 2.1 定义列表, 记录: 要查找的元素
  28. my_list = [11, 35, 44, 63, 77, 92]
  29. # 2.2 调用函数, 二分查找. 获取结果
  30. result = binary_search(my_list, 55)
  31. # 2.3 打印结果
  32. print(f'查找结果为:{result}')
'
运行
6、应用场景

        1. 电话号码查找

        在日常生活中,我们经常需要查找电话号码。如果电话号码是按照一定顺序排列的,比如按照姓氏的首字母顺序排列,那么我们就可以使用二分查找来快速定位该电话号码。

        2. 字典单词查找

        在阅读英文书籍时,如果遇到了一个陌生的单词,想要知道它的意思,就可以使用二分查找来在字典中查找这个单词。

        3. 在有序数组中查找元素

        二分查找还可以用于在有序数组中查找特定的元素。例如,在一个已经排序的列表中查找一个特定的数字,或者在一个已经排序的字符串中查找一个特定的子串。

        4. 处理 “ 近似查找 ” 的问题

        除了查找精确匹配的元素,二分查找还可以用于处理 “ 近似查找 ” 的问题。例如,可以查找第一个大于等于某个值的元素的位置,或者查找最后一个大于等于某个值的元素的位置。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/896610
推荐阅读
相关标签
  

闽ICP备14008679号