1

配列は N 個の 1 と 0 で構成され、すべての 1 はすべての 0 の前にあります。配列内の 1 を見つけます。二分探索では O(log N) であることは明らかです。O(log(1の数))時間でこれを行うアルゴリズムはありますか?

4

3 に答える 3

7

実際にはO(lg m)時間内に実行できmます。 は 1 の数です。これは宿題のように見えるので、アルゴリズム全体を説明することはしませんが、ここにヒントがあります。バイナリ検索を「逆」にして、検索領域を縮小するのではなく拡大するようにしてください。

于 2013-03-12T21:09:57.650 に答える
1

この配列を反復処理すると、すべての 1 がカウントされ、最終的に N+1 ステップを作成した 0 が見つかるため、私の意見では O(n+1) アルゴリズムです。

于 2013-03-12T21:06:22.133 に答える
0
class OneZero
{

    public static int binary_search (byte[] array, int start, int end, int value)
    {

        if (end <= start) return -1;

        if (Math.floor((start+end)/2) == value) return Math.floor((start+end)/2);

        return binary_search (array, start, Math.floor((start+end)/2)-1, value);

    }

    public static int nbOfOnes (byte[] array, int value)
    {

        return (binary_search(array, 0, array.length,value)+1);

    }

    public static void main ()
    {

        byte[] arr = { 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0 };

        System.out.println(" number of 1s is: "+nbOfOnes(arr,1));

    }

}
于 2013-03-13T04:46:18.273 に答える