所以我很好奇..為什么我需要這樣做 1以及-1截斷陣列的一側。我知道一個陣列是基于索引的,從 0 開始,但這真的是我需要這樣做的原因嗎?其背后的實際邏輯是什么?我注意到,如果我不這樣做,它就永遠不會存在回圈,因為它會不斷地將值一次又一次地劃分為相同的值。
private static int[] values = { 1, 3, 5, 7, 10, 13, 15, 17 };
public static int FindValue(int valueToFind)
{
int l = 0;
int r = values.Length - 1;
while (l <= r)
{
var mid = (l r) / 2;
if (values[mid] == valueToFind)
return mid;
if (values[mid] < valueToFind)
l = mid 1;
else
r = mid - 1;
}
return -1;
}
uj5u.com熱心網友回復:
如果不是l = mid 1;我們,那么當和最多相差 1l = mid;時就會出現問題(因此運行中最多有兩個陣列值)。在那種情況下,so that將等于。現在假設我們要查找的值大于,那么該塊將執行并被賦值。但它已經有了那個值,所以什么都沒有改變!下一次迭代將以與前一次完全相同的狀態開始,我們將無限回圈。lr(l r) / 2 == lmidlvalues[mid]iflmid
如果您將替換r = mid - 1;為 just r = mid,那么當陣列中只剩下一個值時會出現類似的問題,即l和r相等。如果我們尋找的值小于那個唯一的值values[mid],那么r就會被賦值mid,但同樣,它已經有了那個值。什么都沒有改變,回圈永遠持續下去。
在這些作業中使用 1 和 -1 的原因是:
- 它確保每次迭代中間隔會變小,因此不可能有無限回圈
- 它排除
mid了縮小范圍,這是有道理的,因為if我們已經與該索引處的值進行了比較,因此它不再是候選物件。
uj5u.com熱心網友回復:
考慮到您的最后評論,我認為這是一個四舍五入的問題。它正在四舍五入,下一個計算的數字仍然高于目標值。我會添加一些控制臺日志記錄以在搜索時列印輸出值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/529176.html
標籤:C#。网算法搜索二分搜索
