全プロセスの詳細解説
-
全七つの巡回シフトをソートした "banana$" のバロウズ=ウィーラー変換 5 ステップ
「banana$」のバーローズ–ホイラー変換を求め、何か圧縮されたかどうかを判定せよ。これはBWT出力ステップであり、番兵が付加され、7つの回転がすべてソートされ、最後の列が読み出された状態である。
-
他の処理が行われる前に、まず番兵が付加される。$ はすべてのアルファベットより前にソートされ、かつ正確に1回しか現れないため、2つの回転が等しく比較されることはなく、ソート結果は一義的に定まる。
-
回転を辞書順にソートすることが、この変換の行う唯一の処理である。7つの行を順に下に読み進めると、ソートによって各位置の直後に来る文字ごとに文字列がグループ化されていることがわかる。
-
ある回転の最後の文字は、元の文字列においてその先頭文字の直前に位置していた文字である。ソートによってランが生じるのはそのためである。1行目と2行目はともに 'a' で始まり、ともに 'n' で終わる。これは banana において、どちらの a の前にも n が存在するからである。キーは元の文字列の行番号であり、これがなければ変換を元に戻す(逆変換する)ことはできない。
-
まだ何も圧縮されておらず、圧縮され得るはずもない。出力は入力の順列であり、同じ7文字が異なる順序で並んでいるだけである。変化したのはラン構造であり、変化したのはそれだけである。
-
RLEは1ランあたり2バイトを要するため、7バイトの入力に対して5つのランは10バイトのコストがかかる。その損益分岐点は決して変わらない。ランの数は全体の長さの半分未満である必要があり、ここでは3以下を意味する。
解答
パネルには annb$aa、key = 4、平均ラン長 1.4 文字、RLEの 10 bytes、スコア 0.70× と表示される。変換は約束通りのことを正確に行い、1文字も変更することなく平均ラン長を40%引き上げた。しかし、7文字では1ランあたり2バイトのコストをその伸びで相殺するにはテキストが短すぎるため、パイプラインとしては依然として損となる。単語を2倍にすると計算は逆転する。「bananabanana$」は13文字であり、その変換結果は annnnbba$aaaa となる。長さがほぼ2倍になったのに対し、ランは5つではなく6つになり、13バイトに対して12バイト、スコアは 1.08× となる。これこそがBWTの利点のすべてである。ランの数はテキストの長さではなく、テキストに含まれる異なるコンテキストの数によって決まるため、ブロックが長いほど効果を発揮する。bzip2 が単語ではなく最大 900 kB のブロックを変換するのはそのためである。
-
学習の道すじ
手作業によるデータ圧縮
参考文献 (3)
- Insight blocks 1 and 2 — the transform itself: M. Burrows and D. J. Wheeler, "A Block-sorting Lossless Data Compression Algorithm." Digital Systems Research Center, Research Report 124, 1994.
- Insight block 3 — the aligners it turned into: B. Langmead, C. Trapnell, M. Pop and S. L. Salzberg, "Ultrafast and memory-efficient alignment of short DNA sequences to the human genome." Genome Biology 10, R25, 2009.
- And the one the block names outright: H. Li and R. Durbin, "Fast and accurate short read alignment with Burrows–Wheeler transform." Bioinformatics 25(14), 1754–1760, 2009.