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

数据结构之折半查找

折半查找(Binary Search),也称为二分查找,是一种在有序数组中查找特定元素的搜索算法。其工作原理是,通过不断将待查找的区间分成两半,并判断待查找的元素可能存在于哪一半,然后继续在存在可能性的那一半区间中查找,直到找到该元素或者区间被缩小为0为止。

折半查找的基本步骤

1、初始化:

确定查找范围的上下界,即查找区间的起始位置low和结束位置high,通常初始时low = 0,high = 数组长度 - 1。

2、循环查找:

当low <= high时,执行以下步骤:

计算中间位置mid = (low + high) // 2(注意使用整除以避免浮点数)。
判断中间位置的元素是否是要查找的元素,即arr[mid] == target:
如果是,则查找成功,返回中间位置mid(或该位置的索引mid,取决于具体实现)。
如果不是,则判断target与arr[mid]的大小关系,并据此调整查找范围:
如果target < arr[mid],则说明target在左半部分,更新high = mid - 1。
如果target > arr[mid],则说明target在右半部分,更新low = mid + 1。

3、查找失败:

如果循环结束时仍未找到target,则说明数组中不存在该元素,返回查找失败的信息(通常是-1或特定值)。

折半查找的Python示例

def binary_search(arr, target):
    """
    折半查找(二分查找)
    :param arr: 有序数组
    :param target: 要查找的目标值
    :return: 目标值在数组中的索引,如果未找到则返回-1
    """
    low, high = 0, len(arr) - 1
    
    while low <= high:
        mid = (low + high) // 2
        if arr[mid] == target:
            return mid  # 找到目标值,返回索引
        elif arr[mid] < target:
            low = mid + 1  # 调整查找范围到右半部分
        else:
            high = mid - 1  # 调整查找范围到左半部分
    
    return -1  # 未找到目标值,返回-1

# 示例
arr = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
target = 7

result = binary_search(arr, target)
print(f"元素{target}在数组中的索引为:{result}")  # 输出:元素7在数组中的索引为:3

折半查找的优缺点

优点:
查找速度快,时间复杂度为O(log n),其中n是数组的长度。
对于大数据集,查找效率远高于顺序查找。

缺点:
要求待查找的数组必须是有序的。
数组必须有随机访问的能力,即可以使用索引直接访问元素,这限制了它在链表等数据结构上的应用。
当数据集非常大时,需要较大的内存空间来存储整个数组。


http://www.kler.cn/a/297342.html

相关文章:

  • 浅谈C#之ConcurrentDictionary
  • 投放Facebook广告开户全流程解析:从开户到广告投放的实用指南
  • Python入门3
  • 嵌入式学习——数据结构
  • 数据结构——初识数据结构
  • 《卷积神经网络 CNN 原理探秘》
  • 无人机之穿越机的类型
  • 线段树 + 懒标记 学习记录
  • Biopython从pdb文件中提取蛋白质链的信息
  • 兔英语语法体系——观后笔记
  • IP地址安全与隐私保护
  • 三生随记——黑神话之悟空的恐怖传奇
  • SOMEIP_ETS_098: SD_ClientService_subscribe_without_method_call
  • Vue组件:使用$emit()方法监听子组件事件
  • 【亲测有效】超高速扫描ip端口,可控制进程数,线程数,异步io链接并发数,超时时间,扫描到的端口服务信息说明
  • 传输层协议TCP
  • Java内存分配与回收:深入理解Java内存管理
  • 【最新综述】基于机器学习的超声焊接缺陷无损检测
  • Linux系统下配置MySQL
  • H5接入Steam 获取用户数据案例