簡體   English   中英

我的基本二進制搜索方法不適用於Java中int數組中的一個特定值

[英]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.我試圖通過調試找到它,但沒有得到任何東西。

誰能告訴我這里的問題是什么?

問題是即使你正在改變lowhigh ,循環依賴於變量i ,變量i只在循環的每次迭代結束時遞增而變化。 但是,二進制搜索的終止條件應該是low >= high 你現在擁有的循環條件, i < highlowhigh之間的關系無關,這可能導致循環過早結束或者在二進制搜索已經結束時繼續運行。

我建議做的是在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;
}

編輯:經過一些測試,我意識到另一個錯誤是你在方法中更新lowhigh的方式。 在更新這些變量之前,你只是做high = midlow = mid但這是有風險的,因為通過這樣做,你基本上仍然將numbers[mid]保持在將在下一次迭代中評估的范圍內。環。 這個數字, numbers[mid]應該從范圍中省略,因為鍵要么小於,大於或等於numbers[mid] 如果密鑰小於或大於numbers[mid] ,則沒有必要保持它前進到二進制搜索要查看的下一個數字范圍。 所以解決方案是通過low = mid + 1high = 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM