繁体   English   中英

二进制搜索C#实现

[英]Binary Search C# implementation

这是我为二分搜索所做的一种实现

public int FindIndexRecursive(int numberToFind, int[] array, int indexMin, int indexMax)
{
    if (indexMin > indexMax)
    {
        return -1;
    }

    int mid = ((indexMax - indexMin) / 2 ) + indexMin;

    if (array[mid] < numberToFind)
    {                
        return FindIndexRecursive(numberToFind, array, mid, indexMax); 
    }
    else if (numberToFind < array[mid])
    {
        return FindIndexRecursive(numberToFind, array, indexMin, mid);
    }
    else 
    {
        return mid;
    }
}

它工作正常。 我问了一个问题https://codereview.stackexchange.com/questions/71815/binary-search-using-recursion-iteration-shifted-array

我的回答是我可以更改中间计算

from: int mid = ((indexMax - indexMin) / 2 ) + indexMin;
to: int mid = ((indexMax - indexMin) / 2 );

public int FindIndexRecursive2(int numberToFind, int[] array, int indexMin, int indexMax)
{
    if (indexMin > indexMax)
    {
        return -1;
    }

    int mid = ((indexMax - indexMin) / 2);
    //since the array is sorted
    if (numberToFind < array[mid])
    {
        return FindIndexRecursive2(numberToFind, array, indexMin, mid-1);
    }
    else if (numberToFind > array[mid])
    {
        return FindIndexRecursive2(numberToFind, array, mid+1, indexMax);
    }
    else
    {
        return mid;
    }
}

但是现在我出现了堆栈溢出,新实现中缺少什么?

您采用中间的方式是(low+high)/2 否则,您将获得堆栈溢出异常。

原始int mid = ((indexMax - indexMin) / 2 ) + indexMin; 计算indexMaxindexMin之间的距离,将其减半,并使用它相对于indexMin索引原始数组。

新的int mid = ((indexMax - indexMin) / 2 ); 是错误的,应包含+而不是-int mid = ((indexMax + indexMin) / 2 ); 这利用了以下事实:两个值的均值正好在两个值的中间。

如果您用一支笔并将此表达式和原始表达式写成带有分数的表达式,您将得出结论,它们是相等的:

indexMax - indexMin              indexMax - indexMin   2 · indexMin   indexMax + indexMin
------------------- + indexMin = ------------------- + ------------ = -------------------
         2                                2                  2                 2

可能已建议您减少计算中间值的操作数。

(indexMax - indexMin)/2 + indexMin 等于 (indexMax + indexMin)/2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM