詳解 LOUDS (7) ノード番号からインデックスを得る
今回から、「ノード番号」と、それに対応するビットの「インデックス」との関係について解説します。
まずは、ノード番号からインデックスへの変換方法について解説します。
これまで例として使ってきた木を再掲します。
ここで色をつけて示した、8番のノードに対応するビットのインデックスを知りたいとします。
ノード番号を LOUDS ビット列上でのインデックスで置き換えた木は次のようなものなので、同じ位置のノードに書いている数字を見ます。"11" と書いてあるので、答えは インデックス 11 です。
LOUDS のデータで見てみます。
この中で、「子」の行で 8番となっているところで「index」の行を見ると 11 となっているということが、その対応を表しています。
しかし、実際にデータとして持っているのは、「LBS」と書かれた行の「ビット列」だけです。ビット列だけを頼りに、8番ノードに対応するビットのインデックスが 11 だということを知るにはどうすればいいのでしょうか。
ここで、表の中で、LBS が "1" の列だけに注目します。
LBS が "1" のところには、必ず「子」のところにノード番号が順番に入り、また LBS が "0" のところにはノード番号がありません。あるノード番号に対応するビットを知りたければ、左から(ノード番号)個目の "1" を探せばいいということです。例えば、8番ノードに対応するビットは、左から 8個目の "1" ということです。
実際にやってみましょう。次の表は、「親」と「子」の行を取り除き、LOUDS のビット列とそのインデックスだけを示したものです。
左から "1" のビットだけを数えて、どこが 8個目になるかを見てみましょう。
8個目の "1" は、インデックス 11 の位置にあります。
このことは、8番ノードに対応するビットのインデックスが 11 であるということを表しています。
今回のまとめです。
- ビット列の中で、ノード番号に対応するビットのインデックスを知るには、左から(ノード番号)個目の "1" を探して、そのインデックスを見ればよい。
今回の問題です。
1. LOUDS のビット列から、6番ノードに対応する "1" のビットのインデックスを調べてください(左から 6番目の "1" ビットを探します)。
2. 同じビット列から、10番ノードに対応する "1" のビットのインデックスを調べてください。
前回の答えです。
この木に対応する LOUDS の表は次のようになります。
この中で、「子」の行に書かれたノード番号ごとに、「index」の行の対応する数字を探して、元の木の数字を入れ替えると次のようになります。