【问题标题】:binary search to return more than one index JAVA二进制搜索返回多个索引 JAVA
【发布时间】:2017-04-04 21:30:55
【问题描述】:

我有数组 {1,2,3,4,4,4,5} 我希望我的函数返回索引为 4。 例如:在位置 4,5,6 找到 4

public void binarySearch(int value){ 
sort();  // sorting the array
int index=-1;
int lower=0;
int upper=count-1;
while(lower<=upper){
    int middle=(lower+upper)/2;

    if(value==array[middle]){
        index=middle;
        System.out.println(value+ " found at location "+(index+1));
        break;
        }
    else if(value<array[middle]){
        upper=middle-1;

    }
    else lower=middle+1;

}

}

【问题讨论】:

  • 为什么不考虑创建一个本地 List 来保存返回值然后返回列表? if(value==array[middle]){ mreturnlist.add(middle); ...重新运行mreturnlist;
  • 您的代码在做什么,它与您的预期结果有何不同?
  • @MichaelL。我的代码只返回第一个索引,在这种情况下“在位置 4 找到 4”
  • @OnurEmrecanÖzcan 你能把代码发到这里吗??

标签: java binary-search


【解决方案1】:

这并不难。我们知道,因为列表是排序的,所以我们所有的索引都是连续的(彼此相邻)。所以一旦我们找到了一个,我们只需要在两个方向上遍历这个列表来找出其他索引也匹配。

public static void binarySearch(int value){
    sort();
    int index = -1;
    int lower = 0;
    int upper = array.length - 1;
    while(lower <= upper){
        // The same as your code
    }

    // Create a list of indexes
    final List<Integer> indexes = new LinkedList<>();
    // Add the one we already found
    indexes.add(index);

    // Iterate upwards until we hit the end or a different value
    int current = index + 1;
    while (current < array.length && array[current] == value)
    {
        indexes.add(current);
        current++;
    }

    // Iterate downwards until we hit the start or a different value
    current = index - 1;
    while (current >= 0 && array[current] == value)
    {
        indexes.add(current);
        current--;
    }

    // Sort the indexes (do we care?)
    Collections.sort(indexes);

    for (int idx : indexes)
    {
        System.out.println(value + " found at " + (idx + 1));
    }
}

请记住,您实现的已经是二分搜索。查找额外匹配索引的额外代码不属于二进制搜索的通常定义。

【讨论】:

  • 对不起,我忘了说我不应该导入 java.util.ArrayList;
  • 在这种情况下,这听起来像是功课。我已经给了你大致的想法,所以你可以自己做剩下的事情。只需使用int[] 而不是List&lt;Integer&gt;
  • 是的,这是一个家庭作业,我使用顺序搜索完成了它并且它有效,但我无法使用二进制搜索完成它,我按照你说的做了,我得到了很多错误,还有什么我可以在不从 java.util 导入的情况下使用 Collection 吗?可以发完整的代码吗?
  • 您可以使用Collections 做很多事情。最好的地方就是read the documentation。抱歉,没有。我们不鼓励人们在这里提出家庭作业问题,因为这无助于您的学习。我已经给了你一个很大的线索。剩下的就看你了:)
猜你喜欢
  • 2015-02-10
  • 1970-01-01
  • 2020-08-23
  • 2021-02-20
  • 1970-01-01
  • 1970-01-01
  • 2020-04-02
  • 1970-01-01
相关资源
最近更新 更多