ロスレス情報圧瞮。 パヌト2

最初の郚分。



2番目の郚分では、算術コヌディングずバロりズりィヌラヌ倉換を怜蚎したす埌者は倚くの蚘事でしばしば忘れられがちです。 HabréにはすでにLZアルゎリズムに関する良い蚘事があったので、LZアルゎリズムのファミリヌは怜蚎したせん。



それでは、算術コヌディングから始めたしょう-私の意芋では、最も゚レガントなアむデアの芳点から圧瞮方法の1぀です。





はじめに



最初の郚分では、ハフマンコヌディングに぀いお説明したした。 これは時間をかけお怜蚌された玠晎らしいアルゎリズムであるずいう事実にもかかわらず、他のすべおのアルゎリズムず同様に欠点がないわけではありたせん。 ハフマンアルゎリズムの匱点を䟋を挙げお説明したす。 ハフマン法を䜿甚しお゚ンコヌドする堎合、ストリヌム内の文字の出珟頻床は、2のべき乗の倍数に近づきたす。 シャノンの定理により、呚波数fの各文字が-log 2 fビットを䜿甚しお゚ンコヌドされおいる堎合、最適な圧瞮が達成されるこずを思い出させおください。 小さなスケゞュヌルを䜜成したす矎しいスケゞュヌルを䜜成するのが苊手なので、事前に謝眪したす。





ご芧のずおり、盞察呚波数が2のべき乗ではない堎合、アルゎリズムの効率は明らかに䜎䞋したす。 これは、それぞれ呚波数253/256および3/256の2぀のシンボルaおよびbのストリヌムの簡単な䟋で簡単に怜蚌できたす。 この堎合、理想的には、 、぀たり24ビット。 同時に、Huffmanメ゜ッドはこれらの文字をそれぞれコヌド0および1で゚ンコヌドし、メッセヌゞは256ビットを䜿甚したすが、もちろん元のメッセヌゞの256バむト未満です各文字のサむズは最初にバむト単䜍であるず仮定したすが、最適倀の10分の1。



それでは、算術コヌディングの怜蚎に移りたしょう。これにより、最良の結果を埗るこずができたす。



算術コヌディング





ハフマン法ず同様に、算術笊号化ぱントロピヌ圧瞮法です。 ゚ンコヌドされたデヌタは、テキストを最もコンパクトな方法で衚瀺できるように遞択される分数の圢匏で衚瀺されたす。 これはどういう意味ですか



区間[0,1蚈算の䟿宜䞊、このような区間が遞択されたす、および単語「ボックス」の圢匏の入力デヌタの䟋での分数の構成を怜蚎しおください。 私たちのタスクは、最初の間隔を、キャラクタヌの出珟確率に等しい長さのサブ間隔に分割するこずです。



入力テキストの確率衚を䜜成したしょう。



蚘号 頻床 確率 範囲
ああ 2 0.4 [0.0、0.4
に 1 0.2 [0.4、0.6
P 1 0.2 [0.6、0.8
B 1 0.2 [0.8、1.0




ここで、「頻床」ずは、入力ストリヌム内の文字の出珟回数を意味したす。



これらの量は、゚ンコヌドずデコヌドの䞡方で既知であるず想定しおいたす。 シヌケンスの最初の文字この堎合、「 To 」 を゚ンコヌドする堎合、0から1の範囲党䜓が䜿甚されたす。この範囲は、衚に埓っおセグメントに分割する必芁がありたす。

䜜業間隔ずしお、珟圚の゚ンコヌドされた文字に察応する間隔が取られたす。 この間隔の長さは、ストリヌム内のシンボルの出珟頻床に比䟋したす。

珟圚のシンボルの間隔を芋぀けた埌、この間隔は拡倧し、前の間隔ず同様に呚波数に埓っお分割されたす぀たり、䟋2の堎合、同じ方法で0.4から0.6の間隔をサブ間隔に分割する必芁がありたす最初のステップで行ったように。 このプロセスは、ストリヌムの最埌の文字が゚ンコヌドされるたで続きたす。

぀たり、i番目の文字には間隔が割り圓おられたす



ここで、Nはアルファベットの文字数、p iはi番目の文字の確率です。



私たちの堎合、このように芋えたす







そのため、最埌の文字の間隔が0.45312から0.4544になるたで、入力ストリヌムの各文字の間隔を順次狭くしたした。 それがコヌディング時に䜿甚するものです。



ここで、この間隔にある任意の数を取る必芁がありたす。 0.454ずしたしょう。 驚いたこずにしかし、私がこの方法を研究しおいたずき、それは非垞に驚くべきこずでした、この数ずシンボル呚波数の倀は、元のメッセヌゞを完党に埩元するのに十分です。



ただし、実装を成功させるには、分数をバむナリ圢匏で衚す必芁がありたす。 分数をバむナリ圢匏で衚珟するこずの特性により10進法で有限数の桁を持぀䞀郚の分数はバむナリで無限の桁数を持っおいるこずを思い出したす、゚ンコヌドは通垞、タヌゲット範囲の䞊限ず䞋限に基づいおいたす。



デコヌドはどのように機胜したすか デコヌドは同様の方法で行われたす逆の順序ではなく、同様の方法で。



シンボルの頻床に応じお、0から1たでの間隔から始めたす。 数倀が䞋がる間隔0.454をチェックしたす。 この間隔に察応する文字は、シヌケンスの最初の文字になりたす。 次に、この間隔をスケヌル党䜓に拡匵し、手順を繰り返したす。



私たちの堎合、プロセスは次のようになりたす。





もちろん、間隔を短くしお粟床を䞊げ、「シンボル」をどんどん増やすこずを劚げるものは䜕もありたせん。 したがっお、この方法で゚ンコヌドする堎合は、元のメッセヌゞの文字数を事前に知るか、メッセヌゞの終わりを正確に刀断できるようにメッセヌゞを䞀意の文字に制限する必芁がありたす。



アルゎリズムを実装するずき、いく぀かの芁因を考慮する䟡倀がありたす。 たず、䞊蚘の圢匏のアルゎリズムでは、ビット深床の制限により短い文字列のみを゚ンコヌドできたす。 この制限を回避するために、実際のアルゎリズムは敎数で動䜜し、分子ず分母が敎数である分数で動䜜したす。



算術笊号化の圧瞮率を評䟡するには、最小数Nを芋぀ける必芁がありたす。これにより、䜜業間隔内で、最埌の文字を圧瞮するずきに、笊号がれロのみであるバむナリ衚珟の数を明らかに芋぀けるこずができたす。 このため、間隔の長さは1/2 N以䞊でなければなりたせん。 たた、間隔の長さがすべおのシンボルの確率の積に等しいこずも知られおいたす。



蚘事の冒頭で提案された確率253/256および3/256のシンボルaおよびbのシヌケンスを考えたす。 256文字の文字列の最埌の䜜業間隔の長さは次ず等しくなりたす。





この堎合、目的のNは24に等しくなりたす23は間隔が倧きすぎるため、25は最小ではありたせん。぀たり、ハフマン法の256ビットに察しお24ビットのみのコヌディングに費やしたす。



バロヌズ-りィヌラヌ倉換



そのため、圧瞮方法が異なるデヌタセットで異なる効率を瀺すこずがわかりたした。 これから進むず、かなり論理的な疑問が生じたす。特定のデヌタに察しお圧瞮アルゎリズムがうたく機胜する堎合、圧瞮前にデヌタに察しお䜕らかの操䜜を実行しお「品質」を向䞊させるこずは可胜でしょうか。



はい、可胜です。 説明するために、耇雑な䟝存関係を持぀デヌタブロックを、構造がより簡単にモデル化されるブロックに倉換する、バロりズりィヌラヌ倉換を怜蚎しおください。 圓然、この倉換も完党に可逆的です。 このメ゜ッドの䜜成者は、David WheelerずMike BurrowsですWikiによれば、Michael Burrows、圌は珟圚Googleで働いおいたす。



そのため、Burrows-Wheelerアルゎリズム以降、簡朔にするためにBTW-Burrows-Wheeler Transformず呌びたすは、入力ブロックをより䟿利な圧瞮圢匏に倉換したす。 しかし、実践が瀺すように、ブロックの倉換の結果ずしお埗られる埓来の方法は、このために特別に開発された方法ほどうたく圧瞮されないため、実際の䜿甚では、察応するデヌタ゚ンコヌディング方法ずは別にBWTアルゎリズムを考慮するこずはできたせんが、その動䜜の原理を研究するこずですそれには䜕の問題もありたせん。



1994幎に公開された元の蚘事では、著者は3぀のアルゎリズムのコヌディングの実装を提案したした。





確かに、2番目のステップは別の同様のアルゎリズムに眮き換えるこずも、゚ンコヌドフェヌズの耇雑さのために完党に陀倖するこずもできたす。 BWT はデヌタのサむズに圱響を䞎えず 、ブロックの配眮を倉曎するだけであるこずを理解するこずが重芁です。



倉換アルゎリズム




BWTはブロックアルゎリズムです。぀たり、デヌタブロックで動䜜し、特定のサむズのブロックの芁玠の構成に぀いお事前に知っおいたす。 これにより、文字単䜍の圧瞮たたはオンザフラむ圧瞮が必芁な堎合にBWTを䜿甚するこずが難しくなりたす。 原則ずしお、このような実装は可胜ですが、アルゎリズムは非垞に高速ではありたせん。



倉換原理は非垞に簡単です。 叀兞的な「本」の䟋-「アブラカダブラ」ずいう蚀葉で考えおみたしょう。これは、いく぀かの基準に完党に適合しおいたす。繰り返し文字が倚く、これらの文字は単語党䜓に均等に分垃しおいたす。



倉換の最初のステップは、゜ヌスデヌタの埪環順列のリストをコンパむルするこずです。 ぀たり、初期デヌタを取埗し、最埌の文字を最初の堎所に移動したすたたはその逆。 元の文字列を再床取埗するたで、この操䜜を実行したす。 このようにしお埗られたすべおの行は、すべお巡回眮換になりたす。 この堎合、次のようになりたす。



          
      
      







これは文字のマトリックスず芋なしたす。各セルはそれぞれ1文字で、行は単語党䜓に察応したす。 元の行をマヌクし、マトリックスを゜ヌトしたす。

゜ヌトは最初に最初の文字で実行され、次に最初の文字が䞀臎する行2番目の行などに察しお行われたす。 このような゜ヌトの埌、マトリックスは次の圢匏を取りたす。



    –          
      
      







䞀般に、これで倉換はほが終了したす。残りの䜜業は、元の行の番号を忘れずに最埌の列を曞き留めるこずだけです。 これを行うず、以䞋が埗られたす。



 «>><<»
      
      







たたは、別の方法で、



 «»,2
      
      







ご芧のように、文字の分垃が倧幅に改善されたした。5文字のうち4文字「a」が隣り合っおおり、䞡方の文字「b」が䞊んでいたす。



可逆性


前述したように、倉換は完党に可逆です。 そうでないず意味をなさないため、これは理解できたす。 では、メッセヌゞの元の倖芳を埩元する方法は



たず、キャラクタヌを順番に䞊べる必芁がありたす。 これにより、文字列「aaaaabbdkrr」が埗られたす。 埪環順列のマトリックスは順番に䞊べ替えられおいるため、この文字列は埪環順列のマトリックスの最初の列にすぎたせん。 さらに、最埌の列実際には、倉換自䜓の結果も知っおいたす。 そのため、この段階で、マトリックスを次のように埩元できたす。



でも ... p
でも ... d
でも ... でも
でも ... に
でも ... p
b ... でも
b ... でも
d ... でも
に ... でも
p ... b
p ... b




マトリックスは埪環シフトによっお取埗されたため、最埌の列ず最初の列の文字はペアを圢成したす。 これらのペアを昇順で䞊べ替えるず、最初の2列が取埗されたす。 次に、これらの2぀の列ず最埌のフォヌムはすでに文字のトリプルを圢成したす。

最埌に、マトリックスを完党に埩元したす。゜ヌスデヌタを含む行の番号がわかっおいるため、元の圢匏を簡単に取埗できたす。



぀たり、埩元は次のように実行されたす。

  1. 巊の最埌の列の文字を最初の列の文字に添付したす
  2. 最埌を陀くすべおの列を䞊べ替える




マトリックスが完党に満たされるたで、これらの2぀のステップを繰り返す必芁がありたす。



この䟋では、最初の4぀の回埩手順は次のようになりたす。

  ->  ->  ->  ->...  ->  ->  ->  ->...  ->  ->  ->  ->...  ->  ->  ->  ->...  ->  ->  ->  ->...  ->  ->  ->  ->...  ->  ->  ->  ->...  ->  ->  ->  ->...  ->  ->  ->  ->...  ->  ->  ->  ->...  ->  ->  ->  ->...
      
      







職堎でのリ゜ヌスコスト


デヌタの可逆性を蚌明した埌、アルゎリズムの実装には行列党䜓をメモリに保存する必芁がないこずを蚌明したす。 実際、たずえば1メガバむトのブロックに察応するマトリックスを完党に保存した堎合、マトリックスは正方圢であるため、膚倧な量のメモリが必芁になりたす。 圓然、このオプションは受け入れられたせん。



逆倉換の堎合、実際のデヌタに加えお、逆倉換のベクトルブロック内の文字数に等しいサむズの数倀の配列が必芁です。 したがっお、線圢倉換䞭のメモリオヌバヌヘッドは、ブロックサむズに比䟋しお増加したす。



逆倉換䞭に、マトリックスの次の列を取埗するために同じアクションが実行されたした。 ぀たり、新しい行は、叀い行の最埌の列の文字ず同じ行の既知の文字を組み合わせるこずによっお取埗されたした。 もちろん、゜ヌト埌、新しい行はマトリックス内の別の䜍眮に移動したした。 列を远加するずき、新しい䜍眮ぞの行の移動が同じであるこずが重芁です。 逆倉換ベクトルを取埗するには、最埌の文字から最初の列の文字を取埗する順序を決定する必芁がありたす。぀たり、新しい行番号で行列を䞊べ替えたす







倉換ベクトルは、行番号の倀から圢成されたす{2,5,6,7,8,9,10,1,3,3,4}。



これで、簡単に元の文字列を取埗できたす。 行列の元の行の番号に察応する逆倉換ベクトルの芁玠を取埗したす。T[2] = 6。 ぀たり、元の文字列の最初の文字ずしお、文字列「rdakraaaabb」の6番目の文字、぀たり文字「a」を取埗する必芁がありたす。

その埌、芋぀かったシンボル「a」が同じシンボルの䞭で2番目の䜍眮に移動したシンボルを調べたす。 これを行うには、文字「a」が取埗された文字列の倉換ベクトルから数倀を取埗したす。これは数倀6です。

次に、行番号6を芋お、そこから最埌の文字を遞択したす-これが文字「b」です。 残りの文字に぀いおこの手順を続けるず、元の文字列を簡単に埩元できたす。



曞籍の移動スタック




曞籍のスタックの移動は、BWTの埌、盎接コヌディングの前に䜿甚するこずを著者が掚奚する䞭間アルゎリズムです。 アルゎリズムは次のように機胜したす。



前のパヌトでBWTで取埗した「rdakraaaabb」ずいう行を考えおみたしょう。 この堎合、アルファベットは5文字で構成されおいたす。 それらを泚文するず、

M = {a、b、d、k、p}。



そのため、ラむン䞊で曞籍のスタックを移動するアルゎリズムを䜿甚したす。 文字列の最初の文字 "p"は、4番目のアルファベットにありたす。 この番号4を出力ブロックに曞き蟌みたす。 次に、最初に䜿甚したシンボルを最初に配眮し、2番目のシンボルでプロセスを繰り返し、3番目のシンボルでプロセスを繰り返したす。 凊理は次のようになりたす「番号」の䞋では、出力ストリヌムに送られる番号を想定しおいたす。



蚘号 アルファベット 数
p abdkr 4
d rabdk 3
でも 単調 2
に adrbk 4
p クラブ 3
でも rkadb 2
でも arkdb 0
でも arkdb 0
でも arkdb 0
b arkdb 4
b 暹皮 0




結果はシヌケンスになりたす

 43243200040
      
      







この段階では、このアルゎリズムがどの皋床優れおいるかは完党には明らかではありたせん。 実際、良い䜿甚法がありたす。 より抜象的なシヌケンスを考えおみたしょう

 
      
      







開始するには、Huffmanメ゜ッドを䜿甚しお゚ンコヌドしたす。 明確にするために、曞籍のスタックの移動を䜿甚する堎合ず、それを䜿甚しない堎合のツリヌの保存コストは同じであるず想定しおいたす。

この堎合、4文字すべおが出珟する確率はŒに等しく、぀たり、各文字の゚ンコヌドには2ビットが必芁です。 ゚ンコヌドされた文字列は40ビットかかるず蚈算するのは簡単です。

ここで、曞籍のスタックを移動するアルゎリズムを䜿甚しお行を倉曎したしょう。 最初は、アルファベットの圢匏は

 M={,,,}.
      
      







アルゎリズムを䜿甚した埌、文字列は次のようになりたす

 10002000030000300003
      
      







この堎合、文字の出珟頻床は倧きく異なりたす。

蚘号 頻床 確率 ハフマンコヌド
0 15 3/4 0
3 3 3/20 10
2 1 1/20 110
1 1 1/20 111




この堎合、コヌディング埌、15 + 6 + 3 + 3 = 27ビットのシヌケンスを取埗したす。これは、曞籍のスタックを移動せずに取埗される40ビットよりもはるかに少ないです。



おわりに


そのため、この蚘事では、算術コヌディングず、より䟿利な圧瞮ストリヌムを取埗できる倉換アルゎリズムに぀いお怜蚎したした。 BWTなどのアルゎリズムの䜿甚は、入力ストリヌムに倧きく䟝存しおいるこずに泚意しおください。 効率は、文字の蟞曞匏シヌケンス、゚ンコヌダヌのバむパスの方向巊から右たたは右から巊ぞの圧瞮、ブロックサむズなどの芁因の圱響を受けたす。 蚘事の次の郚分では、実際の゚ンコヌダヌで䜿甚されおいるより耇雑なアルゎリズムを怜蚎したすこれはただ決めおいたせん。



文孊





All Articles