赞
踩
也叫折半查找,是一种在有序数组中查找特定元素的搜索算法
查找的序列必须有序
最差 O( nlogn ),最优 O( 1 )
1. 找到数组的中间元素
2. 如果中间元素正好是要查找的元素,则搜索过程结束
3. 如果要查找的元素大于中间元素,则在数组的右半部分进行搜索
4. 如果要查找的元素小于中间元素,则在数组的左半部分进行搜索
5. 重复以上步骤,直到找到要查找的元素,或者搜索区间为空
递归方法:
- # 1. 定义 二分查找 函数
- def binary_search(my_list, item):
- """
- 实现 二分查找
- :param my_list: 要查找的 列表,!必须:有序
- :param item: 要查找的 元素
- :return: 查找结果,找到 True,未找到 False
- """
- # 1.1 获取 列表长度
- n = len(my_list)
- # 1.2 若长度 <= 0,直接返回 False
- if n <= 0:
- return False
- # 1.3 获取 中间值 的索引
- mid = n // 2
- # 1.4 开始比较, 如果一样就返回True
- if item == my_list[mid]:
- return True
- # 1.5 如果要查找的值 < 中间值, 就去: 中间值的左边找
- elif item < my_list[mid]:
- return binary_search(my_list[:mid], item)
- # 1.6 如果要查找的值 > 中间值, 就去: 中间值的右边找
- else:
- return binary_search(my_list[mid+1:], item)
-
-
- # 2. 定义main函数, 测试
- if __name__ == '__main__':
- # 2.1 定义列表, 记录: 要查找的元素
- my_list = [11, 35, 44, 63, 77, 92]
- # 2.2 调用函数, 二分查找. 获取结果
- result = binary_search(my_list, 66)
- # 2.3 打印结果.
- print(f'查找结果为: {result}')
'运行
非递归方法:
- # 1. 定义 二分查找 函数
- def binary_search(my_list, item):
- """
- 实现 二分查找
- :param my_list: 要查找的 列表,!必须:有序
- :param item: 要查找的 元素
- :return: 查找结果,找到 True,未找到 False
- """
-
- # 1.1 查找区间, 开始索引 和 结束索引
- start = 0
- end = len(my_list) - 1
-
- # 1.2 开始循环查找
- while start <= end:
- # 1.3 计算中间索引, 要写到循环中, 每次循环都需要重新计算中间索引
- mid = (start + end) // 2
-
- # 1.4 具体的比较逻辑
- if item == my_list[mid]:
- return True
- elif item < my_list[mid]:
- end = mid - 1 # 如果目标值小于中间值, 就去左侧查找
- else:
- start = mid + 1 # 如果目标值大于中间值, 就去右侧查找
-
- # 1.5 走这里, 说明没找到, 返回结果即可
- return False
-
- # 2. 定义main函数, 测试
- if __name__ == '__main__':
- # 2.1 定义列表, 记录: 要查找的元素
- my_list = [11, 35, 44, 63, 77, 92]
- # 2.2 调用函数, 二分查找. 获取结果
- result = binary_search(my_list, 55)
- # 2.3 打印结果
- print(f'查找结果为:{result}')
'运行
1. 电话号码查找
在日常生活中,我们经常需要查找电话号码。如果电话号码是按照一定顺序排列的,比如按照姓氏的首字母顺序排列,那么我们就可以使用二分查找来快速定位该电话号码。
2. 字典单词查找
在阅读英文书籍时,如果遇到了一个陌生的单词,想要知道它的意思,就可以使用二分查找来在字典中查找这个单词。
3. 在有序数组中查找元素
二分查找还可以用于在有序数组中查找特定的元素。例如,在一个已经排序的列表中查找一个特定的数字,或者在一个已经排序的字符串中查找一个特定的子串。
4. 处理 “ 近似查找 ” 的问题
除了查找精确匹配的元素,二分查找还可以用于处理 “ 近似查找 ” 的问题。例如,可以查找第一个大于等于某个值的元素的位置,或者查找最后一个大于等于某个值的元素的位置。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。