簡體   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