2017-04-23 12 views
0

"0001100001"のようなビットストリングが与えられた場合、最長ゼロシーケンスの長さ(この例では4)を見つける必要があります。ビットストリング内の最長ゼロシーケンスの検索

アルゴリズムはO(log(b))時間で実行する必要があります.bは文字列の長さです。私だけで線形時間でそれを行う方法を知って

...

は私が必要な複雑さを達成するために、何らかの形で左にビットをシフトする必要があること、聞いたことがあるが、私は、なぜ見当もつかない文字列を反復する。

ログ時間を取得するにはどうすればよいですか?

+1

入力を読み込むだけですでにO(b)時間がかかります。 – Henry

+0

@Henry:それについてはどうしたらいいですか?まだログ時間を達成する方法はありますか?割り当てからのヒントは、ビットを左にシフトする必要があることを示しています。最初の1ビット、次に2ビット、次に4ビット、8ビット、16ビットなど...各シフトの後にAND関数を使用する必要がありますそれは私にシフトする次のシーケンスを与えるだろう...しかし、私はそれを使用する方法がわからない –

+0

私はそれを証明することはできませんが、私の腸の感覚は私にはないと言います。 – Henry

答えて

-2

数を文字列として与えられるので、我々はバイナリで1000000と最長の長さ0が6である64を言う渡す場合

Integer.parseInt(String,Base) 

を使用して数を解析することができ、whileループを実行する必要log2(64)は6ですが、この解決策はあなたが探しているものでなければなりません。私は16,32および64のためにこのプログラムを実行しているし、それがログ(N)で動作時間をこの場合に関与した文字によって全く解析文字が存在しないとしてものためのビット演算子を使用

public class CountZeroes { 
private static long getZeroes(String s) { 
    int x = Integer.parseInt(s,2); 
    long count = 0, maxSoFar = 0; 
    while (x > 0) { 
     System.out.println("Running"); 
     if ((x & 1) == 1) { 
      if (count > maxSoFar) { 
       maxSoFar = count; 
      } 
      count = 0; 
     } else { 
      count += 1; 
     } 
     x = x >> 1; 
    } 
    return maxSoFar; 
} 

public static void main(String[] args) { 
    System.out.println(getZeroes("10000")); 
    System.out.println(getZeroes("100000")); 
    System.out.println(getZeroes("1000000")); 
} 
} 

以下のソリューションをご確認ください同じ。これがいいのか一度確認してください。

ありがとう

+0

1. 'Integer.parseInt'は文字列ごとに文字列を解析します2.右シフトは文字単位で解析します(1ビットだけシフトします)ので効率的に2回実行します –

+0

文字列ではなく整数本質的に整数を2で割り、これはlog(n)時間の場合であるはずです。 –

+1

シフトは整数を2で除算しますが、ビット長を2減らしません。すべてのビットが1で、何回シフトを実行するか計算してください。 –

関連する問題