アルゴリズム
bit全探索

bit 全探索

キーワード

概要

bit を用いた全探索の手法。

{0,1,,N1}\{0,1, \dots, N-1\} の全ての部分列を列挙できる。

計算量

O(N2N)\mathrm{O}(N2^N)

実装

for b := 0; b < (1 << n); b++ {
    for i := 0; i < n; i++ {
        if (b & (1 << i)) == 0 {
				continue
		}
 
        // ...
    }
}

1 << n100n(2)=2n(10)1\underbrace{0 \dots 0}_{n}{}_{(2)} = 2^n{}_{(10)} となるので、b00 から 2n12^n - 1 まで動く。

その後、各i =1,,n1=1,\dots,n-1 について、1 << i100i(2)1\underbrace{0\dots0}_{i}{}_{(2)} となるので、(b & (1 << i))ii 桁目が 11 かどうか判定する。

go の場合は、if 文の条件をbool型しかいれることができないので、00 の場合は早期 return する形にしている。

例題

引用