【问题标题】:Java - Trying to print all of the coincidences of a binary searchJava - 试图打印二进制搜索的所有巧合
【发布时间】:2017-06-30 00:43:52
【问题描述】:

这是我目前的搜索方法:

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 搜索到 Main 方法中找到的先前冒泡排序数组。

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

【问题讨论】:

  • 您的列表方法可以工作,您只需要记住在添加时还更改 startend 的值 - 但是您必须检查两侧的 1 个索引center 可能位于重复值的中间。

标签: java arrays sorting search


【解决方案1】:

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

  1. 使用二分法搜索。

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

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

如果你不需要关心出现的顺序,你可以结合第2步和第3步,向上扫描添加到列表,向下扫描添加到列表,因为由于排序,你点击的所有内容都有保证匹配,直到不匹配为止。

如果您确实关心出现顺序,则可以通过跳转并检查并编写修改后的二进制搜索来搜索匹配/不匹配而不是匹配的转换来优化第 2 步。

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

【讨论】:

    【解决方案2】:

    其实很简单,因为列表已经排序了,你希望找到的数字是相邻的。

    就像 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);
        }
    }
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 2013-04-17
      • 1970-01-01
      • 2015-10-12
      相关资源
      最近更新 更多