アルゴリズムの理解(4)

1114 ワード

バイナリサーチ繰返し処理


以前に確認したバイナリ検索アルゴリズムでは、検索した値が配列内の複数の要素と同じ値である場合、その要素のすべてのインデックスを取得できません.したがって、重複値を検索するには別のアルゴリズムが必要です.
まず、データ内の最初の値が値以上の場所を検索します.
値より大きい場所が初めて見つかった場合は、重複する値のすべてのインデックスを出力できます.
もしそうであれば、JAVAを使用して最初の値より大きい場所を検索できます.
LowerBoundメソッドの実装
 static int lowerBound(int[] arr, int value){
        int l = 0;
        int r = arr.length;   // value 가 배열에 있는 어떠한 값보다 클 경우, 배열의 마지막 인덱스를 넘기지 않기 위함.
        int mid;
        while (l < r){
            mid = (l + r)/2;
            if(value <= arr[mid])
                r = mid;
            else
                l = mid+1;
        }
        return l;
    }
次に、JAVAの特定の値より大きい最初の場所を検索します.
upperBoundメソッドを実装しましょう
static int upperBound(int arr[], int value) {
        int l = 0;
        int r = arr.length;
        int mid;
        while (l < r) {
            mid = (l + r) / 2;
            if (value >= arr[mid]) {
                l = mid + 1;
            } else {
                r = mid;
            }
        }
        return l;
    }