LOUDSの基本事項
LOUDSとは木を表現する簡潔データ構造の一つである。
以下のリンクの練習問題を全て解いたらLOUDSについての理解が進んだので、それについて簡単にメモしておく。
情報系修士にもわかるLOUDS
※ノード番号とは、木を根から(左の子優先の)BFSで辿った順番であり、indexとはビット列を配列に例えた際の添字番号の事である。
※また、rankとselectは簡潔データ構造の基本操作であるが、それらは言葉で軽く説明している
※以下特に言及しない限り1と0はビットを意味する
LOUDSの基本事項
1. LOUDS bit string (LBS、要するにただのビット列)「10」から成るスーパールートであるノード番号0を入れる
2. 0が親ノードの区切りである。
3. 子ノードの数だけ1を列挙した後、0を入れる。
子ノード番号intから親ノード番号を取得する方法:
子ノード番号intからindexは「左から数えてint番目の1が立っているindex」すなわち、子ノードindex = select(1, 子ノード番号int)
子ノードindexから親ノード番号は「左に何個0があるか」すなわち、親ノード番号 = rank(0, 子ノードindex)
親ノード番号xから子ノード番号を取得する方法:
1. 左からx番目の0のindexを取得する、すなわち index = select(0, x)
2. その次のindexから1が続く限り列挙する
それぞれの子ノードindexからそのノードの番号は「左から数えて自分自身を含めて何個1が立っているか」すなわち、子ノード番号= rank(1, 子ノードindex) + 1
LOUDSは木を表現するので、一つの子に対しては一つの親しか存在しない。そのため、エッジに関する情報は、子ノードにそのまま格納して良い。
Trie木は各エッジが文字に対応している。そのため、補助配列を用いればLOUDSでTrie木を実現することができる。
例:
(汚い手書きは気にしないでください。。。Keynoteを覚えるべきですね。。。)
LOUDSによる木の表現:
親ノード番号 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
LBS | 10 | 1110 | 10 | 0 | 1110 | 0 | 0 | 10 | 110 | 0 | 0 | 0 |
補助配列:
ノード番号 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
文字 | なし | なし | i | a | l | n | a | i | b | e | l | s |