2017-08-10 4 views
3

私はビットの配列を持っています。ビットは、次の基準に従ってオン/オフを切り替えます。 1.ビットの左右のビットがオンの場合、そのビットを1にします。 2.境界条件(左端と右端のビットが1ビットだけに依存します。つまり、それを左またはその右のいずれか。配列のビットを変更する

この配列は、以下の基準でm回処理されます。

私が書きました次のコードでは、Aは元の配列、subsiquentは処理の配列ですが、これはO(nm)となります.nは長さ、mは何も処理しません。私の複雑さを減らすことができます。

for(int k = 0;k < m;k++){ 
    for(int l = 0;l < n;k++){ 
    if(l == 0){ 
     if(A[l+1]==1) 
     subsiquent[l]=1; 
     else 
     subsiquent[l]=0; 
     //** is there a } missing here? 
     else if(l==n){ 
     if(A[l-1]==1) 
      subsiquent[l]=1; 
     else 
      subsiquent[l]=0;       
     } else { 
     if(A[l+1]==1 && A[l-1]==1){ 
      subsiquent[l]=1; 
     }else{ 
      subsiquent[l]=0; 
     } 
     } 
    //** or is there a } missing here?  
    } 

    A = subsiquent; 
} 
+0

あなたは 'N'ビット 'M'回をスキャンしたいですか?私は、複雑さがO(n * m)より大幅に減少することは疑いの余地があります。 – Thomas

+0

これは、トグルするための代替ソリューションがないことを示唆しています。それをm回スキャンする以外にトグルすることはできませんか?ありがとう –

+0

@ketananandなぜあなたはそれをm回スキャンしたいですか? –

答えて

1

いくつかのことを参照してください:

  • 最後のpの最初または最後のビットが0の場合、それらは常に0のままなので、ビットp + 1(つまり、 p-1)。したがって、あなたはこれをチェックし、ループの開始/終了を減らすことができます(そしてp + 1桁を0に変更します)
  • 同様に、pの最初の(resp last)桁が1ならばp-1桁1にとどまり、ビットpは0になります
  • 私はすべて0またはすべて1であり、それ以上の変更は必要ありません
  • 同じことがあなたの配列の途中で実行できますか?次回は7回目?3回目のミドルは1)続きますが、統合が容易であるかどうかは分かりません(1000ビットと言っていると思います)
  • 終了しないとすべて0または1にすると、0と1の交互の値が得られます。したがって、ouが0と1を交互に入れているか、 maining mを、あなたは結果を予測することができ

編集:pで>もちろん、四肢のための私の例では= 2

編集:あなたはint型の配列に類似したビット数とあなたの配列を表すことができます+最初のビットを記憶する 000111101100110101は、[0] 3412221111(ゼロで始まり、次に3ゼロ、次に4 1、次に1ゼロ、次に2 1など)で表されます。

すべてチェックしませんでした。最小のステップで簡単に他のステップに移動するようにルールを推論することができます。 (多くの場合がありますが、それらを見つけることができます。左から右に移動するだけで、0と1から切り替えることを覚えていますが、反復または番号を挿入するときは右の数字を変更/減らさなければならない場合があります。リンクリストは、ここにも適しています)

例えば、手順は次のようになります。

000111101100110101 [0]3-4-1-2-2-2-1-1-1-1  
000011010000001010 [0]4-2-1-1-6-1-1-1-1 
000000100000000101 [0]6-1-8-1-1-1 
000000000000000010 [0]16-1-1 
000000000000000001 [0]17-1 
000000000000000000 [0]18 
+0

助けてくれてありがとう –

関連する問題