概要
問題:n-bitのGray code列(長さ2n)を生成。隣接する整数のバイナリ表現が1 bitだけ異なり、先頭(0)と末尾も1 bit差(巡回性)を満たす。
要件
- すべての整数は [0, 2n - 1] の範囲
- 先頭は 0
- 重複なし
- 隣接する整数が1 bitだけ異なる(巡回含む)
解法:標準Gray code公式
G(i) = i ^ (i >> 1)
を i=0..2n-1
に適用。Pythonのリスト内包表記で一括構築し、O(2n)時間・O(1)追加メモリを実現。
ステップバイステップ解説
入力 n から列長 M = 2n を計算
range(0, M) の各 i に対してループ開始
i を1ビット右シフト(i >> 1)
i と (i >> 1) のXORを計算:G(i) = i ^ (i >> 1)
G(i) を結果リストに追加
全インデックス処理後、Gray code列を返却
Python実装(LeetCode形式)
視覚的図解
アルゴリズムフロー
説明:入力 n から M=2n
を計算し、0からM-1まで各インデックス i に対して Gray code 公式
i ^ (i >> 1) を適用。結果をリストに追加して返却。
例:n=3 のGray Code生成過程
| i (dec) | i (bin) | i >> 1 (bin) | G(i) = i ^ (i >> 1) | G(i) (dec) |
|---|---|---|---|---|
| 0 | 000 | 000 | 000 | 0 |
| 1 | 001 | 000 | 001 | 1 |
| 2 | 010 | 001 | 011 | 3 |
| 3 | 011 | 001 | 010 | 2 |
| 4 | 100 | 010 | 110 | 6 |
| 5 | 101 | 010 | 111 | 7 |
| 6 | 110 | 011 | 101 | 5 |
| 7 | 111 | 011 | 100 | 4 |
結果:[0, 1, 3, 2, 6, 7, 5, 4]
各隣接ペア(0→1, 1→3, ..., 4→0)は1 bitだけ異なる。
計算量
時間計算量
M = 2n 個の要素を1回走査。各インデックスで定数時間のビット演算(右シフト+XOR)のみ。
空間計算量
出力リスト(長さ2n)が必要。追加メモリはO(1)(インデックス変数のみ)。
アルゴリズム比較
| アプローチ | 時間 | 空間(追加) | 実装難易度 | 備考 |
|---|---|---|---|---|
| 公式法(本実装) | O(2n) | O(1) | 低 | 最速・最小メモリ |
| 反射法(鏡映) | O(2n) | O(2n) | 中 | 段階的構築、教育的 |
| DFSバックトラック | O(2n·n) | O(2n) | 高 | 実用性低(遅い) |
最適化ポイント:Pythonのリスト内包表記は CPython の C 実装を直接利用するため、明示的 for ループより高速。ビット演算(左シフト、右シフト、XOR)は CPU 命令に直接マップされる最速演算。