当前位置: 首页 > news >正文

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

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

创建一个递归函数,并将搜索空间的 mid 与 key 进行比较。根据结果,要么返回找到键的索引,要么调用下一个搜索空间的递归函数。

# 用于递归二进制搜索的 Python 3 程序。
# 在注释中可以找到对旧版 Python 2 所需的修改。

# 如果存在,则返回 arr 中 x 的索引,否则返回 -1
def binary_search(arr, low, high, x):

    # Check base case
    if high >= low:

        mid = (high + low) // 2

       # 如果元素本身存在于中间
        if arr[mid] == x:
            return mid

		# 如果元素小于中间值,则它只能出现在左子数组中
        elif arr[mid] > x:
            return binary_search(arr, low, mid - 1, x)

		# 否则该元素只能出现在右子数组中
        else:
            return binary_search(arr, mid + 1, high, x)

    else:
        # 元素不在数组中
        return -1

# Test array
arr = [ 2, 3, 4, 10, 40 ]
x = 10

# Function call
result = binary_search(arr, 0, len(arr)-1, x)

if result != -1:
    print("元素存在于索引", str(result))
else:
    print("数组中不存在元素")


输出

元素位于索引 3

时间复杂度:O(log n)

辅助空格:O(logn) [注意:递归创建调用堆栈]

2. 使用迭代进行二分查找的 Python 程序

这里我们使用 while 循环来继续比较键并将搜索空间分成两半的过程。

# 迭代二分搜索函数
# 如果存在,则返回给定数组 arr 中 x 的索引,
# 否则返回 -1
def binary_search(arr, x):
    low = 0
    high = len(arr) - 1
    mid = 0

    while low <= high:

        mid = (high + low) // 2

        # 如果 x 更大,则忽略左半部分
        if arr[mid] < x:
            low = mid + 1

        # 如果 x 较小,则忽略右半部分
        elif arr[mid] > x:
            high = mid - 1

        # 表示 x 出现在中间
        else:
            return mid

    # 如果我们到达这里,则该元素不存在
    return -1

# 测试数组
arr = [ 2, 3, 4, 10, 40 ]
x = 10

# 函数调用
result = binary_search(arr, x)

if result != -1:
    print("元素存在于索引", str(result))
else:
    print("数组中不存在元素")


输出

元素位于索引 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,则代码将打印一条消息,指出该元素不存在于数组中。
import bisect
 
def binary_search_bisect(arr, x):
    i = bisect.bisect_left(arr, x)
    if i != len(arr) and arr[i] == x:
        return i
    else:
        return -1
 
 
# Test array
arr = [2, 3, 4, 10, 40]
x = 10
 
# 测试数组
result = binary_search_bisect(arr, x)
 
if result != -1:
    print("元素存在于索引", str(result))
else:
    print("数组中不存在元素")


输出

元素位于索引 3

时间复杂度:O(log n)

辅助空间:O(1)

相关文章:

  • 我想写日记了
  • 新能源汽车充电综合解决方案:安科瑞电气助力绿色出行
  • 第二章:C++标准库
  • C++11新特性 11.基于范围的for循环
  • deepseek在pycharm中的配置和简单应用
  • ThinkPhp 5 安装阿里云内容安全(绿化)
  • DeepLabv3+改进6:在主干网络中添加SegNext_Attention|助力涨点
  • Pycharm 取消拼写错误检查(Typo:in word xxx)
  • 【后端开发面试题】每日 3 题(九)
  • SQL 别名
  • 计算机网络笔记(二)——1.2互联网概述
  • 祛魅 Manus ,从 0 到 1 开源实现
  • 本地fake server,
  • 【IPFS应用开发】IPFS播放器-上传助手
  • 目标检测热力图的生成代码(基于GridCam)生成的
  • Vue3——Fragment
  • Java的基础:对象
  • 单细胞多数据集整合和去除批次效应教程,代做各领域生信分析
  • 【C语言】自定义类型:结构体,联合,枚举(上)
  • Deeplabv3+改进5:在主干网络中添加EMAattention|助力涨点!
  • 昆明市委:今年起连续三年,每年在全市集中开展警示教育
  • 习近平:坚定信心推动高质量发展高效能治理,奋力谱写中原大地推进中国式现代化新篇章
  • 香港油麻地旧警署将向游客开放
  • 河南通报部分未检疫生猪流入:立案查处,涉案猪肉被封存
  • 上海发文加强直播经济技能人才培养:三年新培养持证直播技能人才5万名
  • 九江银行落地首单畜牧业转型金融业务,助推传统农业绿色智能