当前位置: 首页 > 知识库问答 >
问题:

我的二分搜索算法有问题吗?

丁昌翰
2023-03-14

我在写一个程序,你可以输入一个单词,它将被存储在一个数组列表中。然后,您可以通过在文本字段中输入这些词并按下按钮来搜索这些词。(如果按下另一个按钮,也可以对它们进行排序)。如果找到了这个词,就应该打印出这个词在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;static private int i;static private int n;

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,它会说找不到。

共有1个答案

劳高爽
2023-03-14
    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;
        }
    }

别忘了按前一篇文章中提到的对列表进行排序

 类似资料:
  • 本文向大家介绍算法题,trim二叉搜索树相关面试题,主要包含被问及算法题,trim二叉搜索树时的应答技巧和注意事项,需要的朋友参考一下 参考回答: C++版本  

  • 我在看麻省理工学院的开放课件的第一次讲座,关于算法的介绍,有一些东西对我来说并不是很明显。你不能在这里观看24:30的讲座和课堂讲稿,这里有一维峰值问题的定义和解决方案的所有细节 问题是: 对于由“n”个整数元素组成的数组,找到一个峰值 我的问题/担心 既然在中有上述条件,为什么要往左走?而不是右边? 既然在中有上述条件,为什么要往右边走?而不是左边? 二进制搜索算法假设我们从排序的数组开始,那么

  • 这是理解分而治之算法的练习题。 给你一个N个排序整数的数组。所有元素都是不同的,除了一个元素重复两次。设计一个O(log N)算法来找到那个元素。 我得到这个数组需要被划分,看看下一个索引中是否找到了一个相等的对应项,我相信这是二进制搜索的一种变体。但我找不到任何解决方案或指导。

  • 你将如何解决这个问题? 你从一个盒子开始,盒子里有x个红色大理石,y个绿色大理石和z个蓝色大理石,盒子外还有无限量的红色、绿色和蓝色大理石。一个步骤是选择两种不同的颜色,从盒子中取出两个大理石(两种颜色各一个),然后从你的供应中向盒子中添加第三种颜色的大理石。例如,如果你选择红色和绿色,那么你移除一个红色和一个绿色的大理石,然后放回一个蓝色的。对于什么样的起始条件(表示为x、y、z上的约束),通过

  • 我在看麻省理工学院的开放课件《算法入门第一讲》,有一些东西对我来说并不是很明显。你不能在这里开始看24:30的讲课,也不能在这里看课堂讲稿,里面有关于一维峰值问题定义和解法的所有细节 问题在于: 对于由“n”个整数元素组成的数组,找到一个峰值 从这个例子中,我们可以理解阵列可能是未排序的,它可能包含重复的,并且它可能包含一个以上的峰,并且根据我的解释,它甚至可能不包含任何单个峰。 到目前为止还不错