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

本文共 2677 字,大约阅读时间需要 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/

    你可能感兴趣的文章
    Objective-C实现lowest common ancestor最低共同祖先算法(附完整源码)
    查看>>
    Objective-C实现LRU 缓存算法(附完整源码)
    查看>>
    Objective-C实现LRU缓存(附完整源码)
    查看>>
    Objective-C实现lstm prediction预测算法(附完整源码)
    查看>>
    Objective-C实现lucas数列算法(附完整源码)
    查看>>
    Objective-C实现Luhn (Mod 10)Algorithm算法(附完整源码)
    查看>>
    Objective-C实现LZW编码(附完整源码)
    查看>>
    Objective-C实现MAC桌面暗水印(附完整源码)
    查看>>
    Objective-C实现mandelbrot曼德勃罗特集算法(附完整源码)
    查看>>
    Objective-C实现markov chain马尔可夫链算法(附完整源码)
    查看>>
    Objective-C实现MATLAB中Filter函数功能(附完整源码)
    查看>>
    Objective-C实现matrix exponentiation矩阵求幂算法(附完整源码)
    查看>>
    Objective-C实现MatrixMultiplication矩阵乘法算法 (附完整源码)
    查看>>
    Objective-C实现max non adjacent sum最大非相邻和算法(附完整源码)
    查看>>
    Objective-C实现max subarray sum最大子数组和算法(附完整源码)
    查看>>
    Objective-C实现max sum sliding window最大和滑动窗口算法(附完整源码)
    查看>>
    Objective-C实现MaxHeap最大堆算法(附完整源码)
    查看>>
    Objective-C实现MaximumSubarray最大子阵列(Brute Force蛮力解决方案)算法(附完整源码)
    查看>>
    Objective-C实现MaximumSubarray最大子阵列(动态规划解决方案)算法(附完整源码)
    查看>>
    Objective-C实现maxpooling计算(附完整源码)
    查看>>