【问题标题】:What is the best way to binary search an array via another array?通过另一个数组对数组进行二进制搜索的最佳方法是什么?
【发布时间】:2012-07-02 15:08:05
【问题描述】:

在数组中进行二进制搜索的最佳方法是什么?通过间接访问
意思是我有一个Integer[] 存储String[] 的索引,代表String[] 的排序版本
例如。 Integer[] idxes= {5, 4, 0, 3 , 1, 2} 这意味着 String[5]String[idxes[0]] 在字典上是最低的字符串。
我希望描述清楚。
如果 StringString[] words 的一部分,那么通过 idexesString 进行二进制搜索的最佳方法是什么?

我所做的如下:

int pos = Arrays.binarySearch(idexes, -1, new Comparator<Integer>(){

    @Override
    public int compare(Integer o1, Integer o2) {

    if(o1 == -1){
        return k.compareTo(words[o2]);
    }
    else{
        return words[o1].compareTo(k);
      }         
    }
});

其中k 是搜索词,words[] 是我之前提到的String[]
这可行,但我不喜欢 -1 我传入 binarySearch api。
有没有更好的方法来解决这个问题?

【问题讨论】:

  • 从技术上讲不是一个答案,但将字符串数组和索引数组封装到它自己的类中至少可以帮助将这个实现细节隐藏在应用程序的其余部分。我也不认为这很糟糕,它看起来不太好,但它相对简单,尤其是添加了一些解释原理的 cmets。
  • 话虽如此,如果你经常搜索同一个数组,你最好创建一个排序的副本。

标签: java arrays string algorithm binary-search


【解决方案1】:
class SortedListView extends AbstractList<String> implements RandomAccess {
  // stringArray, idxes should be fields, initialized in a constructor
  public int size() {
    return stringArray.length;
  }
  public String get(int index) {
    return stringArray[idxes[index]];
  }
};

然后你可以在那个List上使用Collections.binarySearch

【讨论】:

  • +1!一个问题。为什么是extends AbstractList 而不是implements List&lt;String&gt;
  • 如果您只是implement List&lt;String&gt;,那么您需要单独实现每个List 方法——至少有十几种不同的方法。 AbstractList 为你填写了那个骨架。最初我认为匿名类就足够了,但对于Collections.binarySearch,您确实需要实现RandomAccess 以获得最佳结果,因此您需要一个实际的命名类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-29
  • 1970-01-01
相关资源
最近更新 更多