ソートされたリスト内の最も近い値を見つける [重複] 質問する

ソートされたリスト内の最も近い値を見つける [重複] 質問する

List要素をソートして最も近い要素を見つけることができるかどうか疑問に思っていましたそれはそうではないリスト内にあります。

たとえば、値 [1,3,6,7] があり、4 に最も近い要素を探している場合、3 が返されるはずです。これは、3 が配列内で 4 より小さい最大の数字だからです。

英語は私の母国語ではないので、意味が通じることを願います。

ベストアンサー1

コレクションはソートされているため、次のように修正バイナリ検索を実行できますO( log n )

    public static int search(int value, int[] a) {

        if(value < a[0]) {
            return a[0];
        }
        if(value > a[a.length-1]) {
            return a[a.length-1];
        }

        int lo = 0;
        int hi = a.length - 1;

        while (lo <= hi) {
            int mid = (hi + lo) / 2;

            if (value < a[mid]) {
                hi = mid - 1;
            } else if (value > a[mid]) {
                lo = mid + 1;
            } else {
                return a[mid];
            }
        }
        // lo == hi + 1
        return (a[lo] - value) < (value - a[hi]) ? a[lo] : a[hi];
    }

上記のコードのほとんどはバイナリ検索なので、binarySearch(...)std ライブラリで提供されている の値を調べますinsertion point

    public static int usingBinarySearch(int value, int[] a) {
        if (value <= a[0]) { return a[0]; }
        if (value >= a[a.length - 1]) { return a[a.length - 1]; }

        int result = Arrays.binarySearch(a, value);
        if (result >= 0) { return a[result]; }

        int insertionPoint = -result - 1;
        return (a[insertionPoint] - value) < (value - a[insertionPoint - 1]) ?
                a[insertionPoint] : a[insertionPoint - 1];
    }

おすすめ記事