例: A = [1, 5, 7, 9, 8, 6]
i = 1 → 2進数: 0001
1を2で割ることができる最大回数 k = 0
2^k = 2^0 = 1
i = 2 → 2進数: 0010
2を2で割ることができる最大回数 k = 1
2^k = 2^1 = 2
i = 3 → 2進数: 0011
3を2で割ることができる最大回数 k = 0
2^k = 2^0 = 1
i = 4 → 2進数: 0100
4を2で割ることができる最大回数 k = 2
2^k = 2^2 = 4
この演算により、2^kの値を直接取得できます!
| k値 | 該当するi の個数 | 各iの計算コスト | 総コスト |
|---|---|---|---|
| 0 | n/2 | 1 | n/2 |
| 1 | n/4 | 2 | n/2 |
| 2 | n/8 | 4 | n/2 |
| ... | ... | ... | ... |
| 合計 | - | - | O(n log n) |
各ノードは対応するBITのインデックスを表します
配列の値を変更してBITの変化を確認できます:
i & -i で2^kを直接計算