Java - 试图打印二进制搜索的所有巧合

时间:2017-06-30 00:43:52

标签: java arrays sorting search

这是我目前的搜索方法:

public static int search(int[] array, int numero) {
    int start = 0;
    int end = array.length - 1;
    int center;

    while (start <= end) {
        center = (start + end) / 2;
        if (array[center] == numero) {
            return center;
        } else if (array[center] < numero) {
            start = center + 1;
        } else {
            end = center - 1;
        }
    }
    return -1;
}

它会从用户输入numero搜索到以前在

方法中找到的冒泡分类数组。

我想弄清楚的是如何打印阵列中发现的所有巧合,而不仅仅是找到的第一个巧合。 我正在考虑将结果添加到List然后将其返回到Main,但是当我尝试在找到的第一个结果时发生了无限循环,导致它反复添加到List中,直到程序崩溃。

2 个答案:

答案 0 :(得分:1)

假设您了解二进制搜索背后的基本理论,请将其分为3个步骤。

  1. 使用二进制搜索方法搜索。

  2. 找到匹配后,从该点向上扫描,直至找到不匹配的元素。

  3. 向下扫描,添加到结果列表,直到找到非结果列表 匹配元素。

  4. 如果您不需要关心事件发生顺序,可以将步骤2和3结合起来,然后向上扫描添加到列表中,然后向下扫描添加到列表中,因为由于排序,您点击的所有内容都得到保证匹配,直到它没有。

    如果 关心事件发生顺序,可以通过跳转和检查来编写步骤2,并编写修改后的二进制搜索,以搜索匹配/不匹配而不是匹配的转换。

    这可以通过保持统计或分析,找到完美的跳跃距离,或基于最后一次检查来进一步优化。

答案 1 :(得分:0)

实际上这很容易,因为列表已经排序,您希望找到的数字是相邻的。

就像Ryan的回答一样,我会提供一些代码

public static List<Integer> searchAll (int[] array, int numero){
int firstMatchIndex = search( array,  numero);
List<Integer> results = new ArrayList<Integer>():
results.add(firstMatchIndex);

boolean left = true;
while( left){
    int i = firstMatchIndex - 1;
    if(i<0 || array[i] != numero){
        left = false;
    }else{
        results.add(i);
    }
}

boolean right = true;
while( right){
    int i = firstMatchIndex + 1;
    if(i>array.length || array[i] != numero){
        right = false;
    }else{
        results.add(i);
    }
}

}