二分查找(递归和迭代)– Python

打印 上一主题 下一主题

主题 1506|帖子 1506|积分 4518

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1. 利用递归进行二分查找的 Python 程序

   创建一个递归函数,并将搜索空间的 mid 与 key 进行比力。根据效果,要么返回找到键的索引,要么调用下一个搜索空间的递归函数。
  1. # 用于递归二进制搜索的 Python 3 程序。
  2. # 在注释中可以找到对旧版 Python 2 所需的修改。
  3. # 如果存在,则返回 arr 中 x 的索引,否则返回 -1
  4. def binary_search(arr, low, high, x):
  5.     # Check base case
  6.     if high >= low:
  7.         mid = (high + low) // 2
  8.        # 如果元素本身存在于中间
  9.         if arr[mid] == x:
  10.             return mid
  11.                 # 如果元素小于中间值,则它只能出现在左子数组中
  12.         elif arr[mid] > x:
  13.             return binary_search(arr, low, mid - 1, x)
  14.                 # 否则该元素只能出现在右子数组中
  15.         else:
  16.             return binary_search(arr, mid + 1, high, x)
  17.     else:
  18.         # 元素不在数组中
  19.         return -1
  20. # Test array
  21. arr = [ 2, 3, 4, 10, 40 ]
  22. x = 10
  23. # Function call
  24. result = binary_search(arr, 0, len(arr)-1, x)
  25. if result != -1:
  26.     print("元素存在于索引", str(result))
  27. else:
  28.     print("数组中不存在元素")
复制代码

输出
  1. 元素位于索引 3
复制代码
时间复杂度:O(log n)
辅助空格:O(logn) [注意:递归创建调用堆栈]
2. 利用迭代进行二分查找的 Python 程序

   这里我们利用 while 循环来继续比力键并将搜索空间分成两半的过程。
  1. # 迭代二分搜索函数
  2. # 如果存在,则返回给定数组 arr 中 x 的索引,
  3. # 否则返回 -1
  4. def binary_search(arr, x):
  5.     low = 0
  6.     high = len(arr) - 1
  7.     mid = 0
  8.     while low <= high:
  9.         mid = (high + low) // 2
  10.         # 如果 x 更大,则忽略左半部分
  11.         if arr[mid] < x:
  12.             low = mid + 1
  13.         # 如果 x 较小,则忽略右半部分
  14.         elif arr[mid] > x:
  15.             high = mid - 1
  16.         # 表示 x 出现在中间
  17.         else:
  18.             return mid
  19.     # 如果我们到达这里,则该元素不存在
  20.     return -1
  21. # 测试数组
  22. arr = [ 2, 3, 4, 10, 40 ]
  23. x = 10
  24. # 函数调用
  25. result = binary_search(arr, x)
  26. if result != -1:
  27.     print("元素存在于索引", str(result))
  28. else:
  29.     print("数组中不存在元素")
复制代码

输出
  1. 元素位于索引 3
复制代码
时间复杂度:O(log n)
辅助空间:O(1)
3. 利用内置的 bisect 模块进行二分查找的 Python 程序

分步方法:


  • 代码导入 bisect 模块,该模块提供对二分查找的支持。
  • 界说binary_search_bisect() 函数的界说是将数组 arr 和要搜索的元素 x 作为输入。
  • 该函数调用 bisect 模块的 bisect_left() 函数,该函数查找元素在排序数组 arr 中的位置,其中应插入 x 以保持排序顺序。如果元素已存在于数组中,则此函数将返回其位置。
  • 然后,该函数检查返回的索引 i 是否在数组范围内,以及该索引处的元素是否等于 x。
  • 如果条件为 true,则函数返回索引 i 作为元素在数组中的位置。
  • 如果条件为 false,则函数返回 -1,指示数组中不存在该元素。
  • 然后,该代码界说一个数组 arr 和一个要搜索的元素 x。
  • 调用 binary_search_bisect() 函数时,将 arr 和 x 作为输入,返回的效果存储在 result 变量中。
  • 然后,代码检查效果是否不等于 -1,这表示该元素存在于数组中。如果为 true,则打印元素在数组中的位置。
  • 如果效果等于 -1,则代码将打印一条消息,指出该元素不存在于数组中。
  1. import bisect
  2. def binary_search_bisect(arr, x):
  3.     i = bisect.bisect_left(arr, x)
  4.     if i != len(arr) and arr[i] == x:
  5.         return i
  6.     else:
  7.         return -1
  8. # Test array
  9. arr = [2, 3, 4, 10, 40]
  10. x = 10
  11. # 测试数组
  12. result = binary_search_bisect(arr, x)
  13. if result != -1:
  14.     print("元素存在于索引", str(result))
  15. else:
  16.     print("数组中不存在元素")
复制代码

输出
  1. 元素位于索引 3
复制代码
时间复杂度:O(log n)
辅助空间:O(1)

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

圆咕噜咕噜

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表