c# 二分查找(迭代与递归)

        二分搜索被定义为一种在排序数组中使用的搜索算法,通过重复将搜索间隔一分为二。二分查找的思想是利用数组已排序的信息,将时间复杂度降低到O(log N)。

二分查找算法示例 

何时在数据结构中应用二分查找的条件:
应用二分查找算法:
        1、数据结构必须是有序的。
        2、访问数据结构的任何元素都需要恒定的时间。
二分查找算法:
        在这个算法中, 通过查找中间索引“mid”将搜索空间分为两半。 

在二分查找算法中查找中间索引“mid” 

1、将搜索空间的中间元素与键进行比较。 
2、如果在中间元素找到密钥,则过程终止。
3、如果在中间元素没有找到键,则选择哪一半将用作下一个搜索空间。
        3.1、如果键小于中间元素,则使用左侧进行下一步搜索。
        3.2、如果键大于中间元素,则使用右侧进行下一步搜索。
4、这个过程一直持续到找到密钥或者总搜索空间耗尽为止。

二分查找如何工作?
要了解二分搜索的工作原理,请考虑下图:
考虑一个数组arr[] = {2, 5, 8, 12, 16, 23, 38, 56, 72, 91},目标 = 23。
第一步:计算mid并将mid元素与key进行比较。如果键小于 mid 元素,则向左移动,如果大于 mid 则将搜索空间向右移动。
        键(即 23)大于当前中间元素(即 16)。搜索空间向右移动。

二分查找算法:将键与 16 进行比较 

密钥小于当前的中间 56。搜索空间向左移动。 

二分查找算法:将键与 56 进行比较 

第二步:如果key与mid元素的值匹配,则找到该元素并停止搜索。 

二分搜索算法:与 mid 的关键匹配 

如何实现二分查找?
二分查找算法可以通过以下两种方式实现
    1、迭代二分搜索算法
    2、递归二分查找算法
下面给出了这些方法的伪代码。
1.迭代二分查找算法:
这里我们使用 while 循环来继续比较键并将搜索空间分成两半的过程。
迭代二分搜索算法的实现:   

// C# implementation of iterative Binary Search
using System;
 
class GFG {
     
    // Returns index of x if it is present in arr[]
    static int binarySearch(int[] arr, int x)
    {
        int l = 0, r = arr.Length - 1;
        while (l <= r) {
            int m = l + (r - l) / 2;
 
            // Check if x is present at mid
            if (arr[m] == x)
                return m;
 
            // If x greater, ignore left half
            if (arr[m] < x)
                l = m + 1;
 
            // If x is smaller, ignore right half
            else
                r = m - 1;
        }
 
        // If we reach here, then element was
        // not present
        return -1;
    }
 
    // Driver code
    public static void Main()
    {
        int[] arr = { 2, 3, 4, 10, 40 };
        int n = arr.Length;
        int x = 10;
        int result = binarySearch(arr, x);
        if (result == -1)
            Console.WriteLine(
                "Element is not present in array");
        else
            Console.WriteLine("Element is present at "
                              + "index " + result);
    }
}

输出
元素出现在索引 3 处


时间复杂度: O(log N)
辅助空间: O(1)

2.递归二分查找算法:
        创建一个递归函数并将搜索空间的中间部分与键进行比较。并根据结果返回找到键的索引或调用下一个搜索空间的递归函数。
递归二分查找算法的实现:

// C# implementation of recursive Binary Search
using System;
 
class GFG {
 
    // Returns index of x if it is present in
    // arr[l..r], else return -1
    static int binarySearch(int[] arr, int l, int r, int x)
    {
        if (r >= l) {
            int mid = l + (r - l) / 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, l, mid - 1, x);
 
            // Else the element can only be present
            // in right subarray
            return binarySearch(arr, mid + 1, r, x);
        }
 
        // We reach here when element is not present
        // in array
        return -1;
    }
 
    // Driver code
    public static void Main()
    {
 
        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)
            Console.WriteLine(
                "Element is not present in arrau");
        else
            Console.WriteLine("Element is present at index "
                              + result);
    }
}
 
// This code is contributed by Sam007.

输出
元素出现在索引 3 处

二分查找的复杂度分析:
时间复杂度: 
        最佳情况:O(1)
        平均情况:O(log N)
        最坏情况:O(log N)
辅助空间:

        O(1),如果考虑递归调用栈则辅助空间为O(logN)。
二分查找的优点:
        二分查找比线性查找更快,特别是对于大型数组。
        比具有类似时间复杂度的其他搜索算法(例如插值搜索或指数搜索)更有效。
        二分搜索非常适合搜索存储在外部存储器(例如硬盘驱动器或云中)中的大型数据集。
二分查找的缺点:
        数组应该是排序的。
        二分查找要求将要查找的数据结构存储在连续的内存位置中。 
        二分查找要求数组的元素是可比较的,这意味着它们必须能够排序。
二分查找的应用:
        二分搜索可以用作机器学习中使用的更复杂算法的构建块,例如训练神经网络或查找模型的最佳超参数的算法。
        它可用于计算机图形学中的搜索,例如光线追踪或纹理映射的算法。
        它可用于搜索数据库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/734671.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

stable diffusion faceswaplab换脸插件报错解决

错误提示&#xff1a; ERROR - Failed to swap face in postprocess method : apply_overlay() takes 3 positional arguments but 4 were given 打开插件对应目录&#xff1a; \sd-webui-aki-v4.6.1\extensions\sd-webui-faceswaplab\scripts\faceswaplab_utils中 imgutil…

架构:Apache Kafka Connect实现sqlserver数据实时同步

实现Apache Kafka Connect与SQL Server之间的实时数据同步&#xff0c;您可以使用Kafka Connect的JDBC Source Connector。以下是一个基本的步骤&#xff1a; 1. 安装Kafka Connect&#xff1a;确保您已经安装了Apache Kafka 和 Kafka Connect。您可以从Apache Kafka的官方网站…

Servlet API 详细讲解

Servlet API 详细讲解 API就是一组类和方法的集合&#xff0c;servlet 中的 类是非常多的&#xff0c;咱们只需要学习 3个类即可。 HttpServletHttpServletRequest&#xff08;服务器如何读取客户端响应&#xff09;HttpServletResponse&#xff08;服务器如何把响应返回给客…

【ros2 control 机器人驱动开发】双关节多控制器机器人学习-example 4

【ros2 control 机器人驱动开发】双关节多控制器机器人学习-example 4 文章目录 前言一、创建controller相关二、测试运行测试forward_position_controller总结前言 本篇文章在上篇文章的基础上主要讲解双轴机器人驱动怎么编写机器人外部/内部(扭矩、压力)传感器数据反馈1,…

delphi7中出现“无法更改以命令对象为源的记录集对象..“的错误解决

我在delphi7环境下写一个数据库应用程序&#xff0c;每次关闭界面时总出现“无法更改以命令对象为源的记录集对象.."的错误。如图所示。 经查阅资料&#xff0c;我得到一些思路&#xff1a;最 这个错误信息通常表示在关闭窗体时&#xff0c;有一个或多个数据库组件&…

大数据开发(Hadoop面试真题-卷四)

大数据开发&#xff08;Hadoop面试真题&#xff09; 1、Hadoop小文件处理问题&#xff1f;2、介绍下HDFS&#xff0c;说下HDFS优缺点&#xff0c;以及使用场景&#xff1f;3、HDFS作用4、HDFS的容错机制5、HDFS的副本机制6、HDFS的常见数据格式&#xff0c;列式存储格式和行存储…

Uniapp开发模板unibest

&#x1f3e0;简介 unibest 是一个集成了多种工具和技术的 uniapp 开发模板&#xff0c;由 uniapp Vue3 Ts Vite4 UnoCss uv-ui VSCode 构建&#xff0c;模板具有代码提示、自动格式化、统一配置、代码片段等功能&#xff0c;并内置了许多常用的基本组件和基本功能&#…

软件安全——堆栈基础知识点总结

一、堆栈基础——内存区域 1、内存区域相关概念 内存区域&#xff1a;一个进程可能被分配到不同的内存区域去执行&#xff1a; 代码区&#xff1a;这个区域存储着被装入执行的二进制机器代码&#xff0c;处理器会到这个区域取指并执行。 数据区&#xff1a;用于存储全局变量…

重拾C++之菜鸟刷算法第10篇---二叉树(下)

十五、合并二叉树 题目 给你两棵二叉树&#xff1a; root1 和 root2 。 想象一下&#xff0c;当你将其中一棵覆盖到另一棵之上时&#xff0c;两棵树上的一些节点将会重叠&#xff08;而另一些不会&#xff09;。你需要将这两棵树合并成一棵新二叉树。合并的规则是&#xff1…

【NR 定位】3GPP NR Positioning 5G定位标准解读(八)- OTDOA定位

前言 3GPP NR Positioning 5G定位标准&#xff1a;3GPP TS 38.305 V18 3GPP 标准网址&#xff1a;Directory Listing /ftp/ 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;一&#xff09;-CSDN博客 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;…

车规芯片为什么需要信息安全(1)

目录 1.汽车出现过被黑客攻击事件吗&#xff1f; 2.汽车信息安全标准汇总 2.1 国际标准 2.2 国内标准 3.车规芯片的信息安全应该从什么地方考虑 3.1 芯片硬件安全防护能力 3.2 车规芯片的信息安全服务 3.3 芯片厂如何证明芯片的信息安全能力 4.小结 这个来自家里人的灵…

WebGL之创建 3D 对象

现在让我们给之前的正方形添加五个面从而可以创建一个三维的立方体。最简单的方式就是通过调用方法 gl.drawElements() 使用顶点数组列表来替换之前的通过方法gl.drawArrays() 直接使用顶点数组。而顶点数组列表里保存着将会被引用到一个个独立的顶点。 其实现在会存在这样一个…

设计模式学习系列 -- 随记

文章目录 前言 一、设计模式是什么&#xff1f; 二、设计模式的历史 三、为什么以及如何学习设计模式&#xff1f; 四、关于模式的争议 一种针对不完善编程语言的蹩脚解决方案 低效的解决方案 不当使用 五、设计模式分类 总结 前言 最近可能工作生活上的稳定慢慢感觉自己丢失…

【轮式平衡机器人】——TMS320F28069片内外设之ePWM

声明&#xff1a;本系列博客参考有关专业书籍&#xff0c;截图均为自己实操&#xff0c;仅供交流学习&#xff01; 引入 脉冲宽度调制&#xff08;PWM&#xff09;是一种对模拟信号进行数字编码的方法&#xff0c;硬件原理是根据相应载荷的变化来调制晶体管栅极或基极的偏置&…

【c++】string模拟实现

string类的接口 namespace zjw {class string{public:typedef char* iterator;typedef const char* const_iterator;private:char* _str;int _size;int _capacity;};这里的迭代器直接使用原生指针来封装。 _str为指向string数组的首地址的指针。 _size为string数组的大小。 …

测试工具使用技巧01-->jmeter链接mysql

前言 在做接口或者性能测试的时候&#xff0c;有时需要jmeter连接数据库做操作&#xff0c;可以看看如下实例。操作实例 在mysql数据库中有如下数据表 在jmeter导入jdbc驱动插件&#xff08;需要的留言找我拿&#xff09; 在jmeter测试计划元件最下面&#xff0c;导入jdbc.…

Android平台实现无纸化同屏并推送RTMP或轻量级RTSP服务(毫秒级延迟)

技术背景 在写这篇文章之前&#xff0c;实际上几年之前&#xff0c;我们就有非常稳定的无纸化同屏的模块&#xff0c;本文借demo更新&#xff0c;算是做个新的总结&#xff0c;废话不多说&#xff0c;先看图&#xff0c;本文以Android平台屏幕实时采集推送&#xff0c;Windows…

ActiveRAG—主动学习

原文地址&#xff1a;ActiveRAG — Active Learning 2024 年 2 月 26 日 大型语言模型&#xff08;LLM&#xff09;的出现开创了对话式人工智能的新时代。这些模型可以生成非常类似人类的文本&#xff0c;并且比以往更好地进行对话。然而&#xff0c;他们仍然面临着仅仅依靠预先…

面试宝典-【redis】

目录 1.什么是缓存穿透 ? 怎么解决 ? 2.什么是布隆过滤器 3.什么是缓存击穿 ? 怎么解决 ? 4.什么是缓存雪崩 ? 怎么解决 ? 5.redis做为缓存&#xff0c;mysql数据如何与redis进行同步?(双写) 6.排他锁是如何保证读写、读读互斥的呢&#xff1f; 7.你听说过延…

【万题详解】洛谷P1616 疯狂的采药

题目背景 此题为纪念 LiYuxiang 而生。 题目描述 LiYuxiang 是个天资聪颖的孩子&#xff0c;他的梦想是成为世界上最伟大的医师。为此&#xff0c;他想拜附近最有威望的医师为师。医师为了判断他的资质&#xff0c;给他出了一个难题。医师把他带到一个到处都是草药的山洞里对…