您的当前位置:首页>全部文章>文章详情

【C#】C#二分查找(迭代与递归)

CrazyPanda发表于:2024-03-11 21:06:45浏览:307次TAG:

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

20210129140851680.png

二分查找算法示例 

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

20210129140851680.png

在二分查找算法中查找中间索引“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)。搜索空间向右移动。

20210129140851680.png

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

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

20210129140851680.png

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

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

20210129140851680.png

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

猜你喜欢

【C#】C# Winform 文本面板带滚动条
在PC软件开发中经常有这样的需求,需要在一个固定大小的面板中显示一些内容,并且面板能上下拖动,将所有的内容完整的展示,有点类似网页上看新闻,如果要在 winfrom 中要如何实现的呢,下面就演示如何实现的吧效果:1.新建一个winform 项目,在界面中拖入一个Panel&nbsp;将 panel1 的&nbsp;AutoScroll 设置为 True2.再次拖入一个&nbsp;Panel ,将高度拉长,这时就自动出现了滚动条,只是此时里面还没有任何内容,下面就在 panel2 中加入一点内容。
发表于:2024-02-03 浏览:323 TAG:
【C#】C# Winform 三层架构
一、介绍三层架构是 C# 桌面开发中比较常用的框架,是由&nbsp;表示层(UI)、业务逻辑层(BLL)和数据访问层(DAL)三层架构组成,目的是为了 “高内聚,低耦合”。开发人员分工更明确,将精力更专注于应用系统核心业务逻辑的分析、设计和开发,加快项目的进度,提高了开发效率,有利于项目的更新和维护工作。从三层架构可以看到,很类似于&nbsp;Web 前端开发的 MVC 框架(视图View,模型Model,控制Contorller),但本质上也有不同的地方,比如都有视图(三层中叫 UI),Mod
发表于:2024-02-03 浏览:287 TAG:
【C#】C# Winform SplitContainer组件创建侧边菜单
效果一,SplitContainer 基本操作新建一个 Winform 项目,在Form1中拖进一个 SplitContainer 组件默认的界面如下这时候,你会发现,左侧菜单栏的宽度也太宽了吧,按照以前的经验,你一定会用鼠标去拖拽,这时候你就会发现,鼠标根本拖不动,不信你可以试试这时候,我们按Esc键,鼠标再移动到边框的时候,鼠标图标就会变成一个 “+” 状的图标,这时候就可以拖拽了此时,左侧的Panel1内还没有任何组件,运行后的效果我们添加一个按钮到&nbsp;Panel1 试试运行后发现
发表于:2024-02-01 浏览:540 TAG:
【C#】Winform NanUI 0.88版本 JS和C#相互调用
目录一、需求版本二、实例JS调用C#注册的只读属性JS调用C#注册的字段JS调用C#注册的同步方法JS调用C#注册的异步方法C#注册一个方法,JS调用并传递参数C#注册一个方法,JS调用并接收C#返回值C#注册一个方法,接收JS的数组参数C#注册一个方法,接收JS的一个函数,执行这个JS函数,并将C#的值传递过去三、结束一、需求在软件的界面和软件逻辑分离后,最重要的就是要处理参数的传递,和函数的调用,因此存在JS中和C#相互调用的需求。版本NanUI 版本:0.8.80.191二、实例using
发表于:2024-02-06 浏览:370 TAG:
【C#】Winform NanUI 0.77版本 JS和C#相互调用
目录一、导入插件二、常用方法三、C#和JS相互调用1.C# 调用JS2.JS调用C#方法3.完整版C#代码4.完整版JS代码结束一、导入插件用的NanUI版本0.77参考官方地址:https://docs.formium.net/zh-hans/tutorial/first-app.html二、常用方法基础代码:using&nbsp;NetDimension.NanUI; using&nbsp;NetDimension.NanUI.Browser; &nbsp; class&nbsp;MainW
发表于:2024-02-06 浏览:384 TAG:
【C#】C#实现Excel合并单元格数据导入数据集
目录功能需求Excel与DataSet的映射关系范例运行环境Excel DCOM 配置设计实现组件库引入方法设计返回值&nbsp;参数设计打开数据源并计算Sheets拆分合并的单元格创建DataTable将单元格数据写入DataTable总结功能需求将Excel里的worksheet表格导入到DataSet里,是项目应用里常用的一种操作。一般情况下,worksheet是一个标准的二维数组,如下图:我们可以效仿 MS SQL SERVER 的一些基本导入选项,如首行是否包含数据,要导入哪个Shee
发表于:2024-01-29 浏览:346 TAG:
【C#】c#开发桌面应用程序用什么框架
style="text-wrap: wrap;">在C#开发桌面应用程序时,可以使用以下几种常见的框架:</p><ol class=" list-paddingleft-2" style="width: 1529.1px; text-wrap: wrap;"><li><p>Windows Forms:这是一种由.NET Framework提供的GUI框架,它提供了丰富的GUI控件和易于使用的编程模型。Windows Forms在C#开发领域中使用非常广泛,并且已经存在多年,获得了广泛的支持和优化。</p></li></ol
发表于:2024-01-27 浏览:443 TAG:
【C#】C# Winform 热更新 基于ECSharp框架
目录一、简介二、&nbsp;ECSharp热更新演示三、Winform 热更新实战结束一、简介ECSharp (原:EasySharpFrame)github 地址:https://github.com/suxf/ECSharp介绍:1.HTTP服务 2.Websocket服务 3.HyperSocket&lt;自定义Socket服务&gt; 4.TimeFlow&lt;时间流&gt; 5.Sqlserver数据库助手 6.Mysql数据助手 7.Redis数据库助手 8.Log功能 9.热更新
发表于:2024-02-05 浏览:298 TAG:
【C#】C# Winfrom 右键菜单
目录一、概述二、新建&nbsp;winform 项目三、给图片控件添加右键菜单四、给菜单添加点击事件五、测试结束一、概述ContextMenuStrip 是 Windows 窗体应用程序中的一个控件,它提供了一个弹出菜单,用于在用户右键单击控件或其他界面元素时显示上下文相关的选项。它通常用于在图形用户界面中提供快捷操作和功能。ContextMenuStrip 控件可以通过在 Visual Studio 的设计器中拖放方式添加到窗体上,或者通过编程方式创建和配置。它可以与其他控件(如按钮、文本框等
发表于:2024-02-02 浏览:354 TAG:
【C#】C# Winform ListView用法
目录添加标题显示网格添加数据到表格中自定义其他属性结束添加标题在 Winfrom 界面中添加一个 ListView 组件,然后点击右上角的箭头,点击编辑列添加下面标题,然后点击确定此时 ListView 中还是一片空白,不能显示这些标题,在视图这里选择 Details就会如下图所示,虽然标题出来了,内容确实一块白版,此时还是觉得 DataGridView 组件好用啊显示网格此时,表格只是一片空白,可以在属性面板中设置,显示网格,如下图&nbsp;&nbsp;这时,就如下图所示,效果就出来了,但是
发表于:2024-01-31 浏览:367 TAG: