[英]My basic binary search method does not work for one specific value in an int array in Java
我是初學者java學習者,這是一個小程序,它輸出int數組中搜索到的int值的索引。 這是代碼
public static void main(String[] args) {
int rank =findNumber(7, new int[]{2, 4, 7, 10, 11, 45, 50, 59, 60, 66, 69, 70, 79});
System.out.println("Your number's index is " + rank);
}
public static int findNumber(int key, int... numbers) {
int low = 0;
int high = numbers.length - 1;
int mid = (low + high) / 2;
int rank = 0;
for (int i = low; i < high; i++) {
if (key < numbers[mid]) {
high = mid;
mid = (low + high) / 2;
} else if (key > numbers[mid]) {
low = mid;
mid = (low + high) / 2;
} else {
rank = mid;
return rank;
}
}
return rank;
}
問題是它適用於數組中的所有數字,除了7.我試圖通過調試找到它,但沒有得到任何東西。
誰能告訴我這里的問題是什么?
問題是即使你正在改變low
和high
,循環依賴於變量i
,變量i
只在循環的每次迭代結束時遞增而變化。 但是,二進制搜索的終止條件應該是low >= high
。 你現在擁有的循環條件, i < high
與low
和high
之間的關系無關,這可能導致循環過早結束或者在二進制搜索已經結束時繼續運行。
我建議做的是在for循環中初始化low
,將終止條件更改為low <= high
,並使更新序列mid = (low + high)/2
因為你在for循環的每次迭代后都這樣做除非你找到這個號碼。 然而,在那時,循環將終止返回找到的數字的索引。 這是它的樣子,
public static int findNumber(int key, int... numbers) {
int high = numbers.length - 1;
int mid = (0 + high) / 2; //replaced low with 0 here
int rank = 0;
for (int low = 0; low <= high; mid = (low + high) / 2) {
if (key < numbers[mid]) {
high = mid - 1;
} else if (key > numbers[mid]) {
low = mid + 1;
} else {
rank = mid;
return rank;
}
}
return rank;
}
編輯:經過一些測試,我意識到另一個錯誤是你在方法中更新low
和high
的方式。 在更新這些變量之前,你只是做high = mid
和low = mid
但這是有風險的,因為通過這樣做,你基本上仍然將numbers[mid]
保持在將在下一次迭代中評估的范圍內。環。 這個數字, numbers[mid]
應該從范圍中省略,因為鍵要么小於,大於或等於numbers[mid]
。 如果密鑰小於或大於numbers[mid]
,則沒有必要保持它前進到二進制搜索要查看的下一個數字范圍。 所以解決方案是通過low = mid + 1
和high = mid - 1
來更新低和高。
正如其他人所說,停止條件已經過去。 可能更容易以不同的方式考慮停止條件。 更改上限和下限,以便搜索數組的“一半”。 你什么時候知道你想要找到的項目在數組中不存在? 那是指數交叉的時候。 低於大於高。 (while low <= high) { ... }
在這種情況下,您可以返回一個您知道在數組中不應該存在的虛擬值。 例如,如果只存儲正值,則返回-1。 否則,您可以返回一個Integer(非基本類型)來表示索引,如果找不到某個項,則特別為null
。
我認為你的for
循環有點錯誤。 代替
for (int i = low; i < high; i++)
它應該是:
for (int i = low; i <= high; i++)
問題在於for
循環。 您將循環傳遞的數量限制為high
,但是從循環內變為high
。 你的意思是什么for (int i = low; i < numbers.length - 1; i++) { ... }
?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.