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

数据结构之折半查找

折半查找(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) - 1while low <= high:mid = (low + high) // 2if 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 = 7result = binary_search(arr, target)
print(f"元素{target}在数组中的索引为:{result}")  # 输出:元素7在数组中的索引为:3

折半查找的优缺点

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

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

http://www.lryc.cn/news/433935.html

相关文章:

  • linux高级学习12
  • leetcode:3174 清除数字 使用栈,时间复杂度O(n)
  • 神经网络卷积操作
  • 专题二_滑动窗口_算法专题详细总结
  • 【机器学习-三-无监督学习】
  • JAVA基础:Lambda表达式(上)
  • Vue使用fetch获取本地数据
  • 《酒饮真经》秘籍4,让你的酒场技巧更上一层楼!
  • 回车符与快捷键记录
  • 计算机网络-VRRP工作原理
  • 6.5椒盐噪声
  • CSS样式的引用方式以及选择器使用
  • Python Flask_APScheduler定时任务的正确(最佳)使用
  • Linux命名管道
  • Xinstall助力App全渠道统计,参数传递下载提升用户体验!
  • 【时时三省】(C语言基础)指针进阶 例题4
  • k8s的配置管理
  • JAVA- 多线程
  • 【Qt】解决设置QPlainTextEdit控件的Tab为4个空格
  • elementUI根据列表id进行列合并@莫成尘
  • 基于人工智能的智能安防监控系统
  • 分享从零开始学习网络设备配置--任务6.3 使用基本ACL限制网络访问
  • 数据结构——线性表(静态链表、循环链表以及双向链表)
  • vue3_对接腾讯_实时音视频
  • 一台电脑对应一个IP地址吗?‌探讨两台电脑共用IP的可能性
  • XInput手柄输入封装
  • NodeMCU-ESP8266+flash_download_tool_3.9.7 烧录
  • 首例开源的自动驾驶混合运动规划框架,手握“规划可解释”和“决策准确”两张王牌!
  • 数据结构之红黑树的 “奥秘“
  • 【鸿蒙 HarmonyOS NEXT】使用EventHub进行数据通信