博客
关于我
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/

    你可能感兴趣的文章
    OSPRay 开源项目教程
    查看>>
    VC++实现应用程序对插件的支持
    查看>>
    OSS 访问图片资源报“No ‘Access-Control-Allow-Origin‘”的错误
    查看>>
    Ossim4系统故障处理
    查看>>
    Spring赌上未来:响应式的 WebFlux 框架更优雅,性能更强!
    查看>>
    oss报UnknownHost,k8s设置hostAliases参数
    查看>>
    OSS直传与UXCore-Uploader实践
    查看>>
    OS模块
    查看>>
    OS第1章
    查看>>
    OS第2章 —— 进程
    查看>>
    OS第3章 —— 进程调度和死锁
    查看>>
    OS第5章
    查看>>
    OS第6章 —— 设备管理
    查看>>
    OTA测试
    查看>>
    Oulipo
    查看>>
    Outlook 2010 Inside Out
    查看>>
    overlay(VLAN,VxLAN)、underlay网络、大二层概述
    查看>>
    OWASP漏洞原理<最基础的数据库 第二课>
    查看>>
    OWL本体语言
    查看>>
    P with Spacy:自定义文本分类管道
    查看>>