博客
关于我
C#基础搜索算法
阅读量:609 次
发布时间:2019-03-12

本文共 2592 字,大约阅读时间需要 8 分钟。

C#基础搜索算法

大家好,我是苏州程序大白。本文将介绍C#中基础的搜索算法,包括顺序搜索和二叉搜索。顺序搜索适用于数据项随机排列的情况,而二叉搜索则用于数据项有序排列的情况。


顺序搜索算法

顺序搜索(线性搜索)是最直接的搜索方法。它从数组的开始处依次遍历每个元素,直到找到目标数据项或遍历完整个数组。具体实现如下:

bool SeqSearch(int[] arr, int sValue){    for (int index = 0; index < arr.Length; index++)    {        if (arr[index] == sValue)            return true;    }    return false;}

如果在遍历过程中找到匹配项,函数会立即返回true;如果遍历完整个数组仍未找到目标项,函数则返回false


搜索最小值和最大值

在无序数组中,搜索最小值或最大值需要遍历所有元素并进行比较。以下是搜索最小值的实现:

static int FindMin(int[] arr){    int min = arr[0];    for (int i = 0; i < arr.Length - 1; i++)    {        if (arr[i] < min)            min = arr[i];    }    return min;}

同理,搜索最大值的实现如下:

static int FindMax(int[] arr){    int max = arr[0];    for (int i = 0; i < arr.Length - 1; i++)    {        if (arr[i] > max)            max = arr[i];    }    return max;}

通过自组织数据加快顺序搜索速度

为了提高顺序搜索效率,可以采用自组织数据的方法。每次搜索到目标数据项时,将其移动到数组的前面。例如,以下代码实现了自组织优化:

public int SeqSearch(int sValue){    for (int index = 0; index < arr.Length; index++)    {        if (arr[index] == sValue)        {            if (index > arr.Length * 0.2)            {                swap(index);            }            return index;        }    }    return -1;}void swap(int index){    int temp = arr[index];    for (int i = index; i > 0; i--)    {        arr[i] = arr[i - 1];    }    arr[0] = temp;}

这种优化方法将频繁访问的数据项移动到数组前面,减少了后续搜索的次数。


二叉搜索算法

当数据项按顺序排列时,二叉搜索是更高效的选择。其工作原理如下:

  • 设置初始上下限。
  • 计算中间索引,比较目标值与中间项。
  • 如果目标值等于中间项,搜索结束。
  • 如果目标值小于中间项,调整上限为中间索引减一。
  • 如果目标值大于中间项,调整下限为中间索引加一。
  • 以下是二叉搜索的实现:

    public int binSearch(int value){    int upperBound = arr.Length - 1;    int lowerBound = 0;    while (lowerBound <= upperBound)    {        int mid = (upperBound + lowerBound) / 2;        if (arr[mid] == value)        {            return mid;        }        else if (value < arr[mid])        {            upperBound = mid - 1;        }        else        {            lowerBound = mid + 1;        }    }    return -1;}

    递归二叉搜索算法

    二叉搜索也可以使用递归实现。以下是递归版本的代码:

    public int RbinSearch(int value, int lower, int upper){    if (lower > upper)        return -1;    int mid = (upper + lower) / 2;    if (value < arr[mid])        return RbinSearch(value, lower, mid - 1);    else if (value == arr[mid])        return mid;    else        return RbinSearch(value, mid + 1, upper);}

    递归实现的优点是代码简洁,缺点是性能较差。对于大型数组,迭代二叉搜索更为高效。


    C#内置方法

    C#提供了内置的二叉搜索方法Array.BinarySearch,可以直接调用:

    public int Bsearh(int value){    return Array.BinarySearch(arr, value);}

    内置方法通常性能更优,但依赖于语言运行时环境。


    性能对比

    递归二叉搜索的效率较低,通常比迭代版本慢10倍。以下是性能对比结果:

    递归:1000次搜索用时:42.8秒迭代:1000次搜索用时:4.3秒

    在实际应用中,应根据性能需求选择合适的实现方式。


    通过以上内容,希望读者能够全面了解C#中的基础搜索算法,包括顺序搜索、二叉搜索以及自组织数据的优化方法。感谢您的阅读!

    转载地址:http://oyrtz.baihongyu.com/

    你可能感兴趣的文章
    Pytest Fixture的妙用:深度解析范围和实际运用!
    查看>>
    Pytest monkeypatch不适用于导入的函数
    查看>>
    Pytest 命令行报错: Hint: make sure your test modules/packages have valid Python names.
    查看>>
    pytest 的 request fixture:实现个性化测试需求
    查看>>
    Pytest+Allure 接口自动化测试平台开发实战
    查看>>
    pytest+allure使用动态级别,参数化severity
    查看>>
    Pytest+Unittest+Git+Jenkins企业级CICD自动化测试平台建设方案
    查看>>
    Pytest+Yaml 数据驱动测试用例
    查看>>
    pytest-base-url插件之配置可选的项目系统URL
    查看>>
    pytest-xdist 进行多进程并发测试!
    查看>>
    pytest-xdist:远程多主机 - 分布式运行自动化测试
    查看>>
    Pytest中doctests的测试方法应用!
    查看>>
    Pytest中进行测试环境切换:pytest_addoption!
    查看>>
    pytest利用request fixture实现个性化测试需求详解
    查看>>
    pytest单元测试实战
    查看>>
    pytest单元测试框架
    查看>>
    Pytest参数详解 — 基于命令行模式
    查看>>
    pytorch cv2 plt transforms pause waitforbuttonpress一个完整的图片处理程序
    查看>>
    pytest学习和使用 - Pytest用例执行结果有哪几种状态?
    查看>>
    pytest实战技巧之参数化应用!
    查看>>