2012-01-02 3 views
4

にソートされていることが必要です。バイナリ 検索アルゴリズムを使用して、指定したオブジェクトのためのんArrays.BinarySearchは、ドキュメントによると、配列が昇順

public static <T> int binarySearch(T[] a, T key, Comparator<? super T> c)   

検索指定された配列を。

を呼び出す前に、 指定されたコンパレータ(sort(T []、Comparator)メソッドのように)で配列を昇順にソートする必要があります。

ソートされていない場合、結果は未定義です。配列に、指定されたオブジェクトに等しい複数の要素が含まれている場合は、どれが見つかるかを保証するための はありません。

は、上記アレイは昇順順にソートされている場合Arrays.binarySearch法にのみ使用することができることを意味するのでしょうか?

出力

class Unturned { 
    public static void main(String[] args) { 
     String[] chars = {"a", "b", "c", "e","f","h","i"}; 
     MySort ms = new MySort(); 

     Arrays.sort(chars, ms); 
     for(String c : chars) System.out.print(c + " "); 

     System.out.println("\n" + Arrays.binarySearch(chars, "d", ms)); 
    } 
    static class MySort implements Comparator<String> { 
     public int compare(String a, String b) { 
      return b.compareTo(a); 
} } } 

次のように私はそれをテストした:

i h f e c b a 
-5 

-5正しい値cを持つ要素にカーソルを置きます。 (すなわち、-4-1)。
ドキュメントが、配列を昇順でソートする必要があると言っているのはなぜですか?

答えて

3

各コンパレータは、指定された型の要素の順序を定義します。その必要条件は、有効な定義が<の場合[0] < ... < a [n-1]となるように配列要素をソートする必要があるだけです。その定義は、例えば、特許文献1の従来の概念である<に対応する必要はない。数字 - 実際、それは従来のものと定義することさえできます。

+0

私はこれが私を混乱させると思います。この記述を、比較器が値を昇順、すなわちa [0] <... ziggy

5

「指定されたコンパレータに従って、昇順に並べ替える必要があります。」と記載されています。太字の部分は重要な部分です。あなたの配列は実際に指定されたコンパレータに従ってソートされます(あなたがソートしたので!)。

4

Comparatorの実装方法に基づいて、すべての要素を増加させる必要があります。例えば逆コンパレータを使用すると、すべての要素が逆の順序でなければなりません。

なぜドキュメントで、配列を昇順でソートする必要があると言われていますか?

バイナリ検索は、この前提に基づいて動作します。 http://en.wikipedia.org/wiki/Binary_search_algorithm中間要素を比較すると、その要素よりも大きい場合は中間より前のすべての要素よりも大きいと仮定できます。配列が特定の順番でない場合は、配列全体を検索する必要があります(ブルートフォース検索とも呼ばれます)。

関連する問題