[英]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;
計算indexMax
和indexMin
之間的距離,將其減半,並使用它相對於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.