7

1,000 以上の値 (最大 5000 以上) を持つソートされた int の配列があります。int を受け取り、配列内の要素に基づいて bool を返す関数を作成する必要があります。ブレーク付きの for ループを記述できることはわかっています。jquery .InArray を使用できることもわかっています。

配列がソートされていることを知って、これを実装する最良の方法は何でしょうか。

ありがとう。

4

5 に答える 5

10

二分探索ルーチンを使用したいと思います。二分探索ルーチンはここに画像の説明を入力してください、線形探索は平均してここに画像の説明を入力してくださいです。

フォームを選択するための多くのバリエーションがあります。これが私がこの記事で見つけたものです:

function binarySearch(items, value){

    var startIndex  = 0,
        stopIndex   = items.length - 1,
        middle      = Math.floor((stopIndex + startIndex)/2);

    while(items[middle] != value && startIndex < stopIndex){

        //adjust search area
        if (value < items[middle]){
            stopIndex = middle - 1;
        } else if (value > items[middle]){
            startIndex = middle + 1;
        }

        //recalculate middle
        middle = Math.floor((stopIndex + startIndex)/2);
    }

    //make sure it's the right value
    return (items[middle] != value) ? -1 : middle;
}

または、無数の異なる言語でのバイナリ検索機能を備えた、この記事のこのよりシンプルなバージョン。

function binary_search_iterative(a, value) {
    var lo = 0, hi = a.length - 1, mid;
    while (lo <= hi) {
        mid = Math.floor((lo+hi)/2);
        if (a[mid] > value)
            hi = mid - 1;
        else if (a[mid] < value)
            lo = mid + 1;
        else
            return mid;
    }
    return null;
}

ここにコードを使用したGoogleクロージャーのバイナリ検索もあります。

そして、ウィキペディアで二分探索アルゴリズムがどのように機能するかについての良い説明。

于 2012-04-22T00:49:30.640 に答える
10

配列がソートされていることを知っていれば、二分探索が最善の方法です。

于 2012-04-22T00:33:58.120 に答える
3

配列がソートされている場合、答えはソートされています - バイナリチョップを使用してください。

于 2012-04-22T00:34:58.087 に答える
-2

多くの言語ですでにこれが実装されています。たとえば、Javaでは、CollectionsCollections.binarySearch(List> list、T key)メソッドを使用できます。また、C#にも何らかのBinarySearchメソッドがあると確信しています。

于 2012-05-07T17:15:25.930 に答える