簡體   English   中英

我的二進制搜索算法有問題嗎?

[英]Is there something wrong with my binary search algorithm?

我正在編寫一個程序,您可以在其中輸入要存儲在ArrayList中的單詞。 然后,您可以通過在textField中輸入這些單詞並按下按鈕來搜索這些單詞。 (如果按下另一個按鈕,您也可以對它們進行排序)。 如果找到該單詞,則應打印出該單詞在ArrayList中的位置,如果找不到,則應打印出該位置。 我認為這一直有效,直到最近我對其進行了測試(之前已經起作用):我輸入了一個我知道在ArrayList中的單詞,這使其打印出了該單詞在ArrayList中的位置(這是我想要的操作) )。 然后,我輸入了一個我知道在ArrayList中不存在的單詞,這使它打印出該單詞不存在(這也是我希望它執行的操作)。 但是當我在那之后搜索一個我知道存在於ArrayList中的單詞時,它打印出找不到該單詞。 然后,我嘗試使用另一個我知道在ArrayList中存在的單詞進行嘗試,但是我也找不到。 在此之后,我已經多次重新啟動了程序,有時它可以工作,有時卻不能,而且我不知道為什么或為什么不...

在運行算法之前先對數組進行排序,所以我知道這不是問題所在...

下面是帶有我的搜索算法的類:

public class SearchAlg {

  public static String binary (ArrayList<String> list, String user) {
    int first = 0;
    int found = 0;
    int middle = 0;
    int last = list.size();
    String strFound = "";

    while (first < last && found == 0) {
        middle = ((first + last) / 2);
        if (user.compareTo(list.get(middle)) > 0) {
            first = middle + 1;
        } else if (user.compareTo(list.get(middle)) == 0) {
            found = 1;
        } else if (user.compareTo(list.get(middle)) < 0) {
            last = middle - 1;
        }
    }
    if (found == 1) {
        strFound = "The word " + user + " exists on the place " + middle + " in the Arraylist";
    } else {
        strFound = "The word " + user + " does not exist in the Arraylist";
    }
    return strFound;
  }
}

這是我的排序算法:public class Sort {static private String strTemp; 靜態私有詮釋 靜態私有整數

public static ArrayList bubbelSort (ArrayList<String> list) {
    for (i = 0; i < list.size(); i++) {
        for (n = 0; n < list.size() - i - 1; n++) {
        if (list.get(n).compareTo(list.get(n + 1)) > 0) {
            strTemp = list.get(n);
            list.set(n, list.get(n + 1));
            list.set(n + 1, strTemp);
        }
    }
    }
    return list;
}

這是我的Main班:

ArrayList<String> list = new ArrayList();

private void btnEnterActionPerformed(java.awt.event.ActionEvent evt) {                                          
    txtaOutput.setText("");
    String wrd = txtfEnter.getText();
    list.add(wrd);
    for (int i = 0; i < list.size(); i++) {
        txtaOutput.append(list.get(i) + "\n");
    }
}

private void btnSortActionPerformed(java.awt.event.ActionEvent evt) {                                            
    txtaOutput.setText("");
    Sort.bubbelSort(list);
}

private void btnSearchActionPerformed(java.awt.event.ActionEvent evt) {                                        
    // TODO add your handling code here:
    String user = txtfSearch.getText();
    txtaOutput.setText("");
    String bin = SearchAlg.binary(list, user);
    txtaOutput.append(bin);
}

我不知道是什么原因造成的,因此不勝感激!

編輯:我現在知道問題是ArrayList中的第一項無法搜索。 因此,例如,如果ArrayList由a, b, c組成,則只能搜索bc 如果我試圖尋找a ,它說,它無法找到。

    int first= 0;
    int last= a.length - 1;
    while (first<= last) {
        int middle = first+ (last- first) / 2;
        if      (user.compareTo(list.get(middle)) < 0) last = middle - 1;
        else if (user.compareTo(list.get(middle)) > 0) first= middle + 1;
        else {
        found =1 ;
        break;
        }
    }

並且不要忘記按照上一篇文章中的順序對列表進行排序

問題出在搜索的最后一步。 您可能會更新“ first”和“ last”,並且在下一次迭代中會找到該值,但會中斷循環。

解決方案:刪除全部found的變量,以及這兩行:

} else if (user.compareTo(list.get(middle)) == 0) {
        found = 1;

還有你現在寫的地方

if (found == 1) {    

而不是

if (user.compareTo(list.get(first)) == 0) {

你一個人走。

您可以使用last = list.size()初始化方法,這意味着您正在搜索半開間隔[first, last> (從且包括first ,到但不包括last )。

但是,在循環中,您設置了last = middle - 1 ,如果您的搜索范圍是封閉的時間間隔[first, last] (從firstfirst ,包括last ),則該設置將起作用。

你應該讓你的心是否last應該指出的最后一個元素 ,或在最后一個元素之后 如果您使用后者,則為您的循環:

while (first < last && found == 0) {
    middle = ((first + last) / 2);
    if (user.compareTo(list.get(middle)) > 0) {
        first = middle + 1;
    } else if (user.compareTo(list.get(middle)) == 0) {
        found = 1;
    } else if (user.compareTo(list.get(middle)) < 0) {
        last = middle;                                   // <-- Remove -1
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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