news 2026/4/16 14:18:35

二分搜索算方

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
二分搜索算方

二分搜索是一种在排序或单调搜索空间上运行的搜索算法,通过反复将其分割成两半,以在对数时间O(log N)内找到目标值或最优答案。

在数据结构中应用二分搜索算法的条件
应用二分搜索算法:

数据结构必须被排序。
访问数据结构的任何元素应耗时为常数。
二叉搜索算法
以下是二分搜索的逐步算法:

通过找到中间的索引“mid”,将搜索空间分成两半。
比较搜索空间的中间元素与键。
如果 密钥位于中间元素,则进程终止。
如果中间元素找不到关键,选择下一个搜索空间的一半。
-> 如果键比中间元素小,则下一次搜索使用左侧。
-> 如果键大于中间元素,则下一次搜索使用右侧。
该过程持续进行,直到找到关键密钥或整个搜索空间耗尽。
二分搜索算法是如何工作的?
为了理解二分搜索的工作原理,请考虑以下示例:

考虑数组 arr[] = {2, 5, 8, 12, 16, 23, 38, 56, 72, 91},目标 = 23。


如何实现二分搜索?
二叉搜索算法可以通过以下两种方式实现

迭代二分搜索算法
递归二分搜索算法
迭代算法:时间 O(log n) 和空间 O(1)
这里我们使用while循环继续比较密钥并将搜索空间分成两半的过程。

重定向图标

class GFG { static int binarySearch(int arr[], int x) { int low = 0, high = arr.length - 1; while (low <= high) { int mid = low + (high - low) / 2; // Check if x is present at mid if (arr[mid] == x) return mid; // If x greater, ignore left half if (arr[mid] < x) low = mid + 1; // If x is smaller, ignore right half else high = mid - 1; } // If we reach here, then element was // not present return -1; } public static void main(String args[]) { int arr[] = { 2, 3, 4, 10, 40 }; int x = 10; int result = binarySearch(arr, x); if (result == -1) System.out.println( "Element is not present in array"); else System.out.println("Element is present at " + "index " + result); } }

输出
Element is present at index 3
递归算法:时间 O(log n) 和空间 O(log n)
创建一个递归函数,并将搜索空间的中间值与键进行比较。根据结果,要么返回找到密钥的索引,要么调用下一个搜索空间的递归函数。

class GFG { // A recursive binary search function. It returns // location of x in given array arr[low..high] is present, // otherwise -1 static int binarySearch(int arr[], int low, int high, int x) { if (high >= low) { int mid = low + (high - low) / 2; // If the element is present at the // middle itself if (arr[mid] == x) return mid; // If element is smaller than mid, then // it can only be present in left subarray if (arr[mid] > x) return binarySearch(arr, low, mid - 1, x); // Else the element can only be present // in right subarray return binarySearch(arr, mid + 1, high, x); } // We reach here when element is not present // in array return -1; } public static void main(String args[]) { int arr[] = { 2, 3, 4, 10, 40 }; int n = arr.length; int x = 10; int result = binarySearch(arr, 0, n - 1, x); if (result == -1) System.out.println( "Element is not present in array"); else System.out.println( "Element is present at index " + result); } }

输出
Element is present at index 3
复杂性分析
时间复杂度:
-> 最佳情况:O(1)
-> 平均情况:O(对数n)
->最坏情况:O(log n)
辅助空间:O(1),如果考虑递归调用栈,则辅助空间为 O(log N)。

编程资源 https://pan.quark.cn/s/7f7c83756948 更多资源 https://pan.quark.cn/s/bda57957c548
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 11:11:45

OFA-VE开源模型实战:低成本GPU算力方案实现高精度图文逻辑判断

OFA-VE开源模型实战&#xff1a;低成本GPU算力方案实现高精度图文逻辑判断 1. 什么是OFA-VE&#xff1a;不只是模型&#xff0c;而是一套可落地的视觉理解工作流 你有没有遇到过这样的问题&#xff1a;一张商品图配了一段文案&#xff0c;但你不确定文案是否真实反映了图片内…

作者头像 李华
网站建设 2026/4/16 11:13:42

C语言对话-16.Al-Go-Rithms

徐波 翻译 各类报道纷至沓来。地表附近及邻近空间正发生什么事&#xff0c;我根本摸不着头脑。从各种迹象看&#xff0c;亚洲人似乎已经占领了这个地方&#xff0c;但到目前为止&#xff0c;我还没有看到他们。 我和珍妮正与世隔绝般地在地下古城工作。这是一个奇妙的&#x…

作者头像 李华
网站建设 2026/4/15 10:50:32

PHP每次请求重复初始化的庖丁解牛

“PHP 每次请求重复初始化” 是传统 PHP-FPM 模型的核心瓶颈&#xff0c;它导致 框架加载、类解析、配置读取等开销在每次请求中重复发生&#xff0c;严重限制高并发性能。 一、核心机制&#xff1a;请求生命周期 ▶ 1. PHP-FPM 请求流程 #mermaid-svg-zFxmSH64zS6kXbuz{font-…

作者头像 李华
网站建设 2026/4/16 10:04:20

主页加载手动检查流程:软件测试从业者实用指南

在Web应用测试中&#xff0c;主页加载性能直接影响用户体验和业务转化率。手动检查作为自动化测试的补充&#xff0c;能捕捉细微问题&#xff0c;如视觉错位或资源阻塞。本文针对软件测试从业者&#xff0c;系统梳理主页加载的手动检查流程&#xff0c;涵盖准备、执行和问题诊断…

作者头像 李华
网站建设 2026/4/15 22:34:10

Android开发工程师面试指南:基于成都高新菁蓉汇智人才服务有限公司职位需求

成都高新菁蓉汇智人才服务有限公司 Android开发工程师 (MJ000373) 职位信息 岗位职责 1、负责客户端和手机端APP程序的方案和架构设计,开发和维护等工作 2、根据需求完成Android系统应用的需求开发、测试和功能维护,高质量完成产品功能迭代; 3、快速准确理解需求,并通过简洁…

作者头像 李华