本発明は、データ圧縮装置、方法およびプログラムに関するものである。
データ圧縮アルゴリズムとして、1977年にAbraham Lempel氏とJacob Ziv氏が発表したLZ77方式が知られている。LZ77方式は辞書式圧縮法の一つで、スライド辞書法とも呼ばれ、データを先頭から順番に符号化していく。スライド辞書法は、現在注目している位置から始まるシンボル列が、それ以前に出現していたかを探す。もし出現していたならば、シンボル列をその出現位置と長さのポインタに置き換える。スライド辞書法の名前は、シンボル列を探す範囲をスライド窓と呼び、これを辞書として使用することに由来する。
LZ77方式では、繰返し出現するデータ列を過去に出現したシンボル列の長さと出現位置に置き換えることでデータ量を削減する。復元の際には、過去の位置から一致長分のシンボル列をコピーすることで元のデータに復元できる。また、繰返しが見つからなかったときに、見つからなかった長さと見つからなかったシンボル列を符号化する方法が示されている。
また、中央処理装置(Central Processing Unit、CPU)のオペレーティングシステム(OS)によっては、1命令で複数データを扱うSingle Instruction Multiple Data(SIMD)命令が用意されており、16バイト、32バイト単位でのメモリ間のデータコピーを高速に行うことができる。SIMD命令を復元時のコピー処理において用いると復元処理の高速化を実現することができる。
LZ77方式では、コピー元の文字列の最後尾のアドレスがコピー先の文字列の先頭のアドレスより後方になることがある。このことを以下では、単に「コピー元とコピー先が重なる」という。たとえば、同じ文字が「aaaa…」と続くケースだと、コピー元の文字列はアドレス「1,2,3,4…」で、コピー先の文字列はアドレス「2,3,4,…」となり、アドレス「2,3,4,…」において重なりを持つ。このようなケースでは、復元処理において、ステップ1で、第1バイトを第2バイトにコピーし、ステップ2で第2バイトを第3バイトにコピーする、という手順でそれ以前に出現した文字列をコピーする。この場合、ステップ1の処理が終わっていないとステップ2の処理を行うことができない。つまり、LZ77方式は、繰返し出現するデータ列を過去に出現したデータ列の長さと出現位置に置き換えているため、単純なコピー処理で復元できるにも関わらず、コピー元とコピー先が重なっているときは、1バイトずつのコピー処理が必要となることがある。このため、復元時に高速な多バイトコピーを使用するには、まずコピー元とコピー先が重なるか否か確認する必要があり、また、重なっている場合は、1バイトずつのコピーを行う煩雑な処理が必要であるという問題がある。
よって、本発明は、多バイトコピーを用いて復元を行う上で不都合な重なりを制限した一致列を選択して圧縮することで、高速に復元できる圧縮データを生成するデータ圧縮装置、方法およびプログラムを提供することを目的とする。
データ圧縮装置が提供される。データ圧縮装置は、圧縮前のデータの文字列中の第1の文字列の後に、前記第1の文字列と同一である第2の文字列を一致列として抽出し、前記一致列の長さと、前記第1の文字列が前記第2の文字列の幾つ前のアドレスの位置から開始されるかを示す相対位置を決定する一致列検索部と、前記一致列検索部で抽出された前記第2の文字列から、長さが前記相対位置より小さい第3の文字列を抽出する一致列分割部と、前記第2または第3の文字列の長さを符号化する一致長符号化部と、前記相対位置を符号化する一致位置符号化部と、を含むことを特徴とする。
多バイト単位で圧縮データの復元を実現するために、元データ中で繰り返し出現する一致列を再分割してから圧縮することで、高速に復元できる圧縮データを生成することができる。
LZ77方式の概略を説明する図である。
比較例におけるデータ圧縮装置の機能ブロック図の例を示す図である。
比較例におけるデータ圧縮装置での圧縮処理の流れの例を示す図である。
比較例における元データと圧縮データの例を示す図である。
比較例における復元処理の流れの例を示す図である。
比較例におけるデータ圧縮装置での圧縮処理の例を示す図である。
比較例における復元処理の例を示す図である。
実施形態におけるデータ圧縮装置の機能ブロック図の例を示す図である。
実施形態におけるデータ圧縮装置での圧縮処理の流れの例を示す図である。
実施形態における復元処理の流れの例を示す図である。
実施例におけるデータ圧縮装置での圧縮処理の流れの例を示す図である。
実施例における先頭位置調整処理の流れの例を示す図である。
実施例における一致列分割処理の流れの例を示す図である。
実施例における一致列分割処理の流れの別の例を示す図である。
実施例における一致長調整処理の流れの例を示す図である。
P(1)、P(3)、…、P(2m−1)で分割する例を示す図である。
P(n÷2)、P(n÷4)、…、P(n÷2m)で分割する例を示す図である。
P(1)、P(3)、…、P(2m−1)で分割する別の例を示す図である。
P(1)、P(3)、…、P(2m−1)で分割するさらに別の例を示す図である。
コンピュータの構成の例を示す図である。
以下、図面を参照して、まず、比較例について説明し、その後、実施形態について説明する。
また、以下ではLZ77方式を用いたデータ圧縮装置、方法およびプログラムについて説明するが、もちろん、データ圧縮方法はLZ77方式には限定されず、繰返し出現するデータ列を過去に出現したデータ列の長さと出現位置に置き換えることでデータ量を削減するような圧縮方法であれば適用可能である。
LZ77方式では、繰り返し現われる文字列を検索し、2回目以降にその文字列が現われるとき、その文字列を、出現位置と長さに関するデータに置き換えることにより、圧縮する。ここで、出現位置とは、ある文字列が複数回目に現われるとき、複数回目に現れたときの先頭位置と、以前に現れたときの先頭位置のアドレスの差であり得る。
以下では、次のような表記規則を用いる。
(規則1)一致列は、(一致長、一致列の開始位置)で表す、
(規則2)非一致列は、{非一致長、非一致文字列}で表す。
ここで、一致列の開始位置は、幾つ前のアドレスに同一の文字列があるか、を示す。一致列の開始位置は、一致位置、相対位置とも呼ぶ。一致列の開始位置(相対位置)は、ある文字列が複数回目に現われるとき、複数回目に現れたときの先頭位置と、以前に現れたときの先頭位置のアドレスの差で、すなわち、相対距離の大きさであり得る。たとえば、一致列の開始位置が、“14”である場合、複数回目に現れたときの先頭位置は、以前に現れたときの先頭位置より14アドレス分だけ後方に位置することを意味しても良い。元データの文字列中の一致列を(一致長、一致列の開始位置)のような形式の圧縮データに符号化するとも言う。同様に、元データの文字列中の非一致列を{非一致長、非一致文字列}のような形式の圧縮データに符号化するとも言う。
<比較例>
図1〜6Bを参照して、比較例について説明する。以下の比較例の説明は、LZ77方式の概略の説明でもある。
図1は、LZ77方式の概略を説明する図である。
例えば、図1に示されている第1〜34番目のアドレスの位置に格納されている圧縮前のデータ(以下、単に元データと呼ぶことがある)では、第1〜14番目のアドレスの位置に“compression_de”という文字列が格納されており、第15〜22番目のアドレスの位置に“compress”という文字列が格納されており、第23番目のアドレスの位置には“_”(アンダーバー)が、第24〜34番目のアドレスの位置には“compression”という文字列が格納されている。よって、圧縮データは、まず、第1〜14番目のアドレスの位置に“compression_de”は非一致列であり、非一致長は14であるので、圧縮データでは、“{14、compression_de}”と表される。元データの第15〜22番目のアドレスの位置に“compress”とあるが、これは第1〜8番目のアドレスの位置の文字列と同一である。“compress”は8文字であり、一致文字列が開始されるアドレスの位置は14アドレス前であるので、一致列の開始位置は14である。よって、元データの第15〜22番目のアドレスのデータは、圧縮データでは “(8、14)”と符号化される。元データの第23番目のアドレスの位置に格納されている“_”(アンダーバー)は、それ以前には出現していないので、圧縮データでは“{1、_}”と符号化される。元データの第24〜34番目のアドレスの位置に“compression”とあるが、これは第1〜8番目のアドレスの位置の文字列と同一である。“compress”は8文字であり、一致文字列が開始されるアドレスの位置は23アドレス前であるので、一致列の開始位置は23である。よって、元データの第24〜34番目のアドレスのデータは、圧縮データでは “(11、23)”と符号化される。
このように、図1に示されている元データの文字列は、圧縮データでは、“{14、compression_de}(8、14){1、_}11、23)”のように表される。
図2は、LZ77方式を用いて元データを圧縮し、圧縮データを生成する圧縮装置の機能ブロック図の例である。
圧縮装置10は、入力バッファ部11、一致列検索部12、一致長符号化部13、一致位置符号化部14、非一致長符号化部15、非一致列符号化部16、および出力バッファ部17を含む。
入力バッファ部11は、例えば、図1に示されている第1〜34番目のアドレスの位置に格納されているような圧縮前のデータ(元データ)を外部から受信し、必要に応じて、一時的に格納する。図1に示されている例では、元データは、“compression_decompression_compression.”である。
一致列検索部12は、入力バッファ部11に格納された元データの文字列に、繰り返し出現する文字列(一致列)が存在するかどうかを検索、抽出する。また、一致列検索部12は、一致列が存在する場合は、その一致列を決定する。例えば、図1に示されている例では、“compress”なる文字列や、“compression” なる文字列は複数回出現するので、一致列である。
一致長符号化部13は、一致列検索部12で検索され、抽出された一致列の長さを抽出し、規則1に従って、一致列を(一致長、一致列の開始位置)と表すときの、第1要素を決定する。例えば、図1に示されている例では、元データの第15〜22番目のアドレスの位置にある“compress”なる文字列は、第1〜8番目のアドレスの位置の文字列と同一であり、8文字である。よって、一致長符号化部13によって、一致長は8と符号化される。
一致位置符号化部14は、一致列検索部12で検索され、抽出された一致列が幾つ前のアドレスの位置から開始されるかを検出し、規則1に従って、一致列を(一致長、一致列の開始位置)と表すときの、第2要素を決定する。例えば、図1に示されている例では、元データの第15〜22番目のアドレスの位置にある“compress”なる文字列は、第1〜8番目のアドレスの位置の文字列と同一であり、一致文字列が開始されるアドレスの位置は14アドレス前である。よって、一致長符号化部13によって、一致列の開始位置は14と符号化される。
非一致長符号化部15は、一致列検索部12では一致列として抽出されなかった非一致列の長さを抽出し、規則2に従って、非一致列を{非一致長、非一致文字列}と表すときの、第1要素を決定する。例えば、図1に示されている例では、第1〜14番目のアドレスの位置に“compression_de”は非一致列であり、14文字である。よって、非一致長符号化部15によって、非一致長は14と符号化される。
非一致列符号化部16は、一致列検索部12では一致列として抽出されなかった非一致列を抽出し、規則2に従って、非一致列を{非一致長、非一致文字列}と表すときの、第2要素を決定する。例えば、図1に示されている例では、第1〜14番目のアドレスの位置に“compression_de”は非一致列である。よって、非一致長符号化部15によって、非一致文字列は“compression_de”と符号化される。
出力バッファ部17は、一致長符号化部13、一致位置符号化部14、非一致長符号化部15、および非一致列符号化部16の結果を用いて、元データを符号化、圧縮した結果である圧縮データを生成し、必要に応じて、一時的に格納する。たとえば、図1に示されている例では、元データである文字列“compression_decompression_compression.”は、“{14、compression_de}(8、14){1、_}(11、23)”と符号化される。
図3は、比較例におけるデータ圧縮装置での圧縮処理の流れの例を示す図である。
処理が開始されるとS100で一致列検索部12は、元データの文字列に、繰り返し出現する文字列である一致列が存在するかどうかを検索する。本ステップの処理が終了すると、処理はS102に進む。元データの文字列は、入力バッファ部11に格納されているものであっても良い。
S102で一致列検索部12は、一致列が見つかったかどうかを判定する。もしこの判定の結果が“YES”、すなわち、一致列が見つかった場合には、処理はS104に進む。また、もしこの判定の結果が“NO”、すなわち、一致列が見つからなかった場合には、処理はS112に進む。
S104で一致列検索部12は、S102で見つかった一致列の最初の文字のアドレスの位置の直前の文字列が非一致列かどうかを判定する。もしこの判定の結果が“YES”、すなわち、直前の文字列が非一致列である場合には、処理はS106に進む。また、もしこの判定の結果が“NO”、すなわち、直前の文字列が非一致列ではない場合には、処理はS108に進む。
S106で非一致長符号化部15と非一致列符号化部16は、S102で見つかった一致列の直前の非一致列を符号化する。符号化の例は、図1に示されている。本ステップの処理が終了すると、処理はS108に進む。
S108で一致長符号化部13と一致位置符号化部14は、S102で見つかった一致列を符号化する。符号化の例は、図1に示されている。本ステップの処理が終了すると、処理はS110に進む。
S110では出力バッファ部17は、圧縮すべき全ての元データを処理したかどうかを判定する。もしこの判定の結果が“YES”、すなわち、全ての元データを処理した場合には、圧縮処理を終了する。また、もしこの判定の結果が“NO”、すなわち、全ての元データを処理していない場合には、処理はS100に戻る。
S102で一致列が見つからなかった場合は、S112に進む。
S112で非一致長符号化部15と非一致列符号化部16はそれぞれ、一致が見つからなかった非一致列の長さと文字列を抽出する。そして、非一致列の長さおよび文字列に関する情報をそれぞれ、非一致長符号化部15と非一致列符号化部16内に一時的に記憶する。この情報は、S106で用いられる。本ステップの処理が終了すると、処理はS100に戻る。
図4は、比較例における元データと圧縮データの例を示す図である。
図4では、元データが循環文字列である場合を取り上げている。循環文字列の長さをcarton(カートン)と呼ぶ。図6においても、上記規則1、2を用いる。
また、図4において、P(n)(nは整数)は、cartonの区切りを示す。
carton=1の場合の例として、図4には、元データが“aaaaaaaaaab”の場合が示されている。
この場合、第1番目のアドレスの位置の“a”が非一致列であり、第2〜10番目のアドレスの位置の“aaaaaaaaa”が一致列である。
元データが“aaaaaaaaaab”の場合、圧縮データは “{1、a}、(9、1)、{1、b}”となる。ここで、圧縮データ中の一致列を示す部分“(9、1)”の第2要素の1は、carton(カートン)に一致する。
carton=2の場合の例として、図4には、元データが“abababababc”の場合が示されている。この場合、第1〜2番目のアドレスの位置の“ab”が非一致列であり、第3〜10番目のアドレスの位置の“abababab”が一致列である。第11番目のアドレスの位置の文字“c”は非一致列である。循環文字列の長さが2であるので、第2〜10番目のアドレスは2文字ずつ分割され、第4番目のアドレスの位置がP(1)、第6番目のアドレスの位置がP(2)のように分割される。
元データが“abababababc”の場合、圧縮データは “{2、ab}、(10、2)、{1、c}”となる。
carton=3の場合の例として、図4には、元データが“abcabcabcabcd”の場合が示されている。この場合、第1〜3番目のアドレスの位置の“abc”が非一致列であり、第4〜12番目のアドレスの位置の“abcabcabc”が一致列である。第13番目のアドレスの位置の文字“d”は非一致列である。
元データが“abcabcabcabcd”の場合、圧縮データは “{3、abc}、(9、3)、{1、d}”となる。
carton=4の場合の例として、図4には、元データが“abcdabcdabcdabcde”の場合が示されている。この場合、第1〜4番目のアドレスの位置の“abcd”が非一致列であり、第5〜16番目のアドレスの位置の“abcdabcdabcd”が一致列である。第17番目のアドレスの位置の文字“e”は非一致列である。
元データが“abcdabcdabcdabcde”の場合、圧縮データは “{4、abcd}、(12、4)、{1、e}”となる。
carton=7の場合の例として、図4には、元データが“abcdefgabcdefgabcdefgh”の場合が示されている。この場合、第1〜7番目のアドレスの位置の“abcdefg”が非一致列であり、第8〜21番目のアドレスの位置の“abcdefgabcdefg”が一致列である。第22番目のアドレスの位置の文字“h”は非一致列である。
元データが“abcdefgabcdefgabcdefgh”の場合、圧縮データは“{7、abcdefg}、(14、7)、{1、h}”となる。
carton=8の場合の例として、図4には、元データが“abcdefghabcdefghabcdefghi”の場合が示されている。この場合、第1〜8番目のアドレスの位置の“abcdefgh”が非一致列であり、第9〜24番目のアドレスの位置の“abcdefghabcdefgh”が一致列である。第25番目のアドレスの位置の文字“i”は非一致列である。
元データが“abcdefghabcdefghabcdefghi”の場合、圧縮データは “{8、abcdefgh}、(16、8)、{1、i}”となる。
ここで、図3のような処理によって圧縮されたデータの復元処理について図5を参照して説明する。
図5の処理は、たとえば、図15のような構成を有するコンピュータよって処理され得る。図15に示されているコンピュータ100は、中央処理装置(Central Processing Unit(CPU))102と、メモリ、Read Only Memory(ROM)104、及びRandom Access Memory(RAM)106を備えている。
処理が開始される前に、圧縮データがRAM106に格納されているものとする。処理は、圧縮データの列、たとえば図1の例では、圧縮データ“{14、compression_de}(8、14){1、_}(11、23)”を括弧単位で順次、復元処理を行う。
処理が開始されるとS200でCPU102は、現在処理しているデータが一致列であるかどうかを判定する。もしこの判定の結果が“YES”、すなわち、現在処理しているデータが一致列である場合には、処理はS202に進む。また、もしこの判定の結果が“NO”、すなわち、現在処理しているデータが一致列ではない場合には、処理はS210に進む。
S202でCPU102は、規則1に従って、一致列の圧縮データから一致長と一致列の開始位置を読み取る。本ステップの処理が終了すると、処理はS204に進む。
S204でCPU102は、コピー元とコピー先に重なりがあるかどうかを判定する。
ここで、図6A、6Bを参照して、コピー元とコピー先に重なりがある例について説明する。
図6Aに示されているように、元データの文字列は、文字“a”が10個並んだ文字列、“aaaaaaaaaa”で開始される文字列であるとする。この元データの文字列を、上記規則1、2に従って圧縮すると、次のようになる。
すなわち、第1番目のアドレスに位置する文字列“aaa”は、それ以前には文字がないので非一致列である。よって、仮の非一致列として”{1, a}が抽出される。
第2〜9番目のアドレスに位置する文字列“aaaaaaaaa”の処理では、この文字列は、第1番目のアドレスに位置する文字列“aaaaaaaaa”と一致するので、一致列であると判定される(図3のS102を参照)。さらに仮の非一致列を保有しているかどうかを判定し(図3のS104を参照)、保有しているので、非一致列{1,a}の符号化が行われる(S106)。また、第2〜9番目のアドレスに位置する文字列「aaaaaaaaa」の符号化が行われる。上記規則1に従うと、一致列は、(一致長、一致列の開始位置)で表され、今の場合、一致長は第2番目から第9番目のアドレスまでの9、一致列の開始位置は第1番目のアドレスであり、第2番目のアドレスの1つ前であるので、一致列の開始位置は1である。よって、元データは、図6Aに示されているように、“{1、a}(9、1)”と符号化される。よって、圧縮データは、“{1、a}(9、1)”となる。
図6Bは、圧縮データ“{1、a}(9、1)”の復元処理の概略を説明する図である。
圧縮データ“{1、a}(9、1)”の復元では、まず、“{1、a}”の部分を復元する。結果は、第1番目のアドレスの位置に文字“a”が格納される。
次に、“(9、1)”の部分の復元では、各アドレスにおいて、1つ前のアドレスに格納された文字を自身のアドレスにコピーする操作を行う。つまり、第3番目のアドレスの復元は、第2番目のアドレスに格納された文字を第3番目のアドレスの位置に格納する操作を含む。逆に言うと、第3番目のアドレスを復元するためには、第1番目のアドレスに格納された文字を第2番目のアドレスにコピーする操作の終了を待つ必要がある。
また、図1に示されている例では、圧縮データ中の“(8、14)”の部分の復元では、14アドレス前から8文字分コピーをして、第15〜22番目のアドレスの位置にコピーをするが、この場合は、コピー元とコピー先に重なりはない。
このようにS204でCPU102は、たとえば、図5Bに示されているように、復元処理において、コピー元とコピー先に重なりがあるかどうかを判定する。もしこの判定の結果が“YES”、すなわち、コピー元とコピー先に重なりがある場合には、処理はS206に進む。また、もしこの判定の結果が“NO”、すなわち、コピー元とコピー先に重なりがない場合には、処理はS208に進む。
S206でCPU102は、一致列の開始位置から一致長分をコピーする。本ステップの処理が終了すると、処理はS214に進む。
S208でCPU102は、重ならない範囲で、一致列の開始位置から順に一致長分をコピーする。図6Bに示されている例では、一致列の開始位置から1文字分の「a」をコピーする。
S200で現在処理しているデータが一致列ではないと判定された場合には、S210に進む。
S210でCPU102は、規則2に従って非一致列の圧縮データから非一致長を読み取り復元する。本ステップの処理が終了すると、処理はS212に進む。
S212でCPU102は、規則2に従って非一致列の圧縮データから非一致文字列を読み取り復元する。
たとえば、圧縮データ“{14、compression_de}(8、14){1、_}11、23)”中の“{14、compression_de}”の部分から、非一致長14、非一致文字列“compression_de”と読み取ることができる。そして、第1〜14番目のアドレスの位置に“compression_de”と格納する。本ステップの処理が終了すると、処理はS214に進む。
S214でCPU102は、復元すべき全ての元データを処理したかどうかを判定する。もしこの判定の結果が“YES”、すなわち、全ての圧縮データを処理した場合には、復元処理を終了する。また、もしこの判定の結果が“NO”、すなわち、全ての圧縮データを処理していない場合には、処理はS200に戻る。
このように、比較例では、たとえば図6Bに示すようにコピー元とコピー先が重なることがある。図6Bの例では、<ステップ1:第1バイトを第2バイトにコピー>、<ステップ2:第2バイトを第3バイトにコピー>の手順でコピーすることになり、ステップ1の処理が終わっていないとステップ2の処理が行えず、カートン以下の長さ単位での、たとえば1バイトずつのコピー処理が必要となる。このように、復元時に高速な多バイトコピーを使用するには、まずコピー元とコピー先が重なるか否か確認する必要があり、また、重なっている場合は、カートン以下の長さ単位での、たとえば1バイトずつでコピーを行う煩雑な処理が必要である。
<実施形態>
以下で説明する実施形態では、たとえばLZ77方式において、相対位置をoffset、一致長をlengthとしたときに、相対位置が一致長より大きくなる、すなわちoffset>lengthとなるように一致列を分割して符号化する。このように圧縮することによって、一致列の分割によりコピー元とコピー先が重ならなくなるため、復元処理の際に条件分岐がなく、高速な復元処理を実現することができる圧縮データを生成することができる。すなわち、多バイト単位で圧縮データの復元を実現するために、元データ中で繰り返し出現する一致列を、復元時にコピー元とコピー先が重ならないように再分割してから圧縮することで、高速に復元できる圧縮データを生成することができる。
ここで、「重なり」とは、コピー元の文字列の最後尾のアドレスがコピー先の文字列の先頭のアドレスより後方になることを意味し得る。
図7は、元データを圧縮し、圧縮データを生成する圧縮装置の機能ブロック図の例である。
圧縮装置20は、入力バッファ部21、一致列検索部22、一致長符号化部23、一致位置符号化部24、非一致長符号化部25、非一致列符号化部26、出力バッファ部27、および一致列分割部28を含む。比較例の圧縮装置10とは、一致列分割部28が含まれている点で異なっている。
入力バッファ部21は、例えば、圧縮前のデータ(元データ)を外部から受信し、必要に応じて、一時的に格納する。
一致列検索部22は、入力バッファ部11に格納された元データの文字列に、繰り返し出現する文字列(一致列)が存在するかどうかを検索、抽出する。また、一致列検索部22は、一致列が存在する場合は、その一致列を決定する。例えば、図1に示されている例では、“compress”なる文字列や、“compression” なる文字列は複数回出現するので、一致列である。
このように一致列検索部22は、圧縮前のデータの文字列中の第1の文字列の後に、第1の文字列と同一である第2の文字列を一致列として抽出し、一致列の長さと、第1の文字列が第2の文字列の幾つ前のアドレスの位置から開始されるかを示す相対位置を決定する。
そして一致列分割部28は、相対位置が一致長以上、すなわちoffset≧lengthとなるように一致列を分割する。
このように一致列分割部28は、一致列検索部で抽出された第2の文字列から、長さが相対位置より小さい第3の文字列を抽出する。
たとえば、元データが“aaaaaaaaaab”である例をあげる。この例では、第1〜10番目のアドレスの位置に文字“a”が格納され、第11番目のアドレスの位置に文字“b”が格納されている。
このとき、たとえば、図14のように、元データの文字列“aaaaaaaaaab”の第2〜10番目のアドレスの位置の文字列“aaaaaaaaa”(9個の“a”)を、“a”+“aa”+“aaaa”+“aa”と分割することができる。つまり、図4のP(1)、P(3)、P(7)の位置、つまりP(2m−1)の位置で分割する。すると、元データ“aaaaaaaaaab”の第2番目のアドレスの一致列“a”に対しては、一致長lengthが1、相対位置offsetが1なので、offset≧lengthとなる。第3〜4番目の一致列“aa”については、一致長lengthが2、相対位置offsetが2なのでoffset≧lengthとなる。第5〜8番目の一致列“aaaa”については、一致長lengthが4、相対位置offsetが4なのでoffset≧lengthとなる。
また、たとえば、図14に示されているように、元データの文字列“aaaaaaaaaab”の第2〜10番目のアドレスの位置の文字列“aaaaaaaaa”(9個の“a”)を“a”+“a”+“aa”+“aaaaaa”と分割することができる。つまり、図4のP(1)、P(2)、P(4)の位置、つまり、n=(一致長列+carton−1)÷cartonとし、P(n÷2)、 P(n÷4)、…、P(n÷2m)の位置で分割する。すると、元データ“aaaaaaaaaab”の第2番目のアドレスの一致列“a”に対しては、一致長lengthが1、相対位置offsetが1なので、offset≧lengthとなる。第3番目の一致列“a”については、一致長lengthが1、相対位置offsetが2なのでoffset≧lengthとなる。第3〜5番目の一致列“aa”については、一致長lengthが2、相対位置offsetが3なのでoffset≧lengthとなる。第6〜10番目の一致列“aaaaa”については、一致長lengthが5、相対位置offsetが5なのでoffset≧lengthとなる。
一致長符号化部23および一致位置符号化部24は、一致列分割部28で分割された一致列に対し、規則1に従って、一致列を(一致長、一致列の開始位置)と表すときの、第1要素および第2要素をそれぞれ符号化する。
たとえば、図14のように、元データの文字列“aaaaaaaaaab”の第2〜10番目のアドレスの位置の一致列“aaaaaaaaaa” (9個の“a”)を、“a”+“aa”+“aaaa”+“aa”と分割すると、一致列は、“(1、1)(2、2)(4、4)(2、8)”と符号化される。
また、たとえば、図15に示されているように、元データの文字列“aaaaaaaaaab”の第2〜10番目のアドレスの位置の一致列“aaaaaaaaa”(9個の“a”)を“a”+“a”+“aa”+“aaaaaa”と分割すると、一致列は、“(1、1)(1、2)(2、3)(5、5)” と符号化される。
非一致長符号化部25は、一致列検索部22では一致列として抽出されなかった非一致列の長さを抽出し、規則2に従って、非一致列を{非一致長、非一致文字列}と表すときの、第1要素を符号化する。
非一致列符号化部26は、一致列検索部22では一致列として抽出されなかった非一致列を抽出し、規則2に従って、非一致列を{非一致長、非一致文字列}と表すときの、第2要素を符号化する。
出力バッファ部27は、一致長符号化部23、一致位置符号化部24、非一致長符号化部25、および非一致列符号化部26の結果を用いて、元データを符号化、圧縮した結果である圧縮データを生成し、必要に応じて、一時的に格納する。
図15は実施形態のデータ圧縮装置200の構成の例を示す図である。
このコンピュータ100は、Central Processing Unit(CPU)102、Read Only Memory(ROM)104、及びRandom Access Memory(RAM)106を備えている。コンピュータ500は、さらに、ハードディスク装置108、入力装置110、表示装置112、インタフェース装置114、及び記録媒体駆動装置116を備えている。なお、これらの構成要素はバスライン120を介して接続されており、CPU102の管理の下で各種のデータを相互に授受することができる。
Central Processing Unit(CPU)102は、このコンピュータ100全体の動作を制御する演算処理装置であり、コンピュータ100の制御処理部として機能する。
Read Only Memory(ROM)104は、所定の基本制御プログラムが予め記録されている読み出し専用半導体メモリである。CPU102は、この基本制御プログラムをコンピュータ100の起動時に読み出して実行することにより、このコンピュータ100の各構成要素の動作制御が可能になる。
Random Access Memory(RAM)106は、CPU102が各種の制御プログラムを実行する際に、必要に応じて作業用記憶領域として使用する、随時書き込み読み出し可能な半導体メモリである。
ハードディスク装置108は、CPU102によって実行される各種の制御プログラムや各種のデータを記憶しておく記憶装置である。MPU502は、ハードディスク装置108に記憶されている所定の制御プログラムを読み出して実行することにより、後述する各種の制御処理を行えるようになる。
入力装置110は、例えばマウス装置やキーボード装置であり、情報処理装置のユーザにより操作されると、その操作内容に対応付けられている各種情報の入力を取得し、取得した入力情報をCPU102に送付する。
表示装置512は例えば液晶ディスプレイであり、MPU502から送付される表示データに応じて各種のテキストや画像を表示する。
インタフェース装置114は、このコンピュータ100に接続される各種機器との間での各種情報の授受の管理を行う。
記録媒体駆動装置116は、可搬型記録媒体118に記録されている各種の制御プログラムやデータの読み出しを行う装置である。CPU102は、可搬型記録媒体118に記録されている所定の制御プログラムを、記録媒体駆動装置116を介して読み出して実行することによって、後述する各種の制御処理を行うようにすることもできる。なお、可搬型記録媒体118としては、例えばUSB(Universal Serial Bus)規格のコネクタが備えられているフラッシュメモリ、CD−ROM(Compact Disc Read Only Memory)、DVD−ROM(Digital Versatile Disc Read Only Memory)などがある。
このようなコンピュータ100を用いて情報処理装置を構成するには、例えば、上述の各処理部における処理をCPU102に行わせるための制御プログラムを作成する。作成された制御プログラムはハードディスク装置108若しくは可搬型記録媒体118に予め格納しておく。そして、CPU102に所定の指示を与えてこの制御プログラムを読み出させて実行させる。こうすることで、情報処理装置が備えている機能がCPU102により提供される。
図8は、実施形態におけるデータ圧縮装置20での圧縮処理の流れの例を示す図である。
また、データ圧縮装置20が図15に示されているような汎用コンピュータ100である場合には、下記の説明は、そのような処理を行う制御プログラムを定義する。すなわち、以下では、下記に説明する処理を汎用コンピュータに行わせる制御プログラムの説明でもある。
処理が開始されるとS300で一致列検索部22は、元データの文字列に、繰り返し出現する文字列である一致列が存在するかどうかを検索する。本ステップの処理が終了すると、処理はS302に進む。元データの文字列は、入力バッファ部21に格納されているものであっても良い。
S302で一致列検索部22は、一致列が見つかったかどうかを判定する。もしこの判定の結果が“YES”、すなわち、一致列が見つかった場合には、処理はS304に進む。また、もしこの判定の結果が“NO”、すなわち、一致列が見つからなかった場合には、処理はS306に進む。
S304で非一致長符号化部25と非一致列符号化部26はそれぞれ、一致が見つからなかった非一致列の長さと文字列を抽出する。そして、非一致列の長さおよび文字列に関する情報をそれぞれ、非一致長符号化部25と非一致列符号化部26内に一時的に記憶する。この情報は、S106で用いられる。本ステップの処理が終了すると、処理はS100に戻る。
S302で一致列が見つからなかった場合には、処理はS306に進む。
S306で一致列分割部28は、一致列の長さ、つまり一致長と、その一致列が幾つ前のアドレスの位置から開始されるか、つまり相対位置を検出する。そしてS306で一致列分割部28は、相対位置が一致長以上、すなわち相対位置offset≧一致長lengthとなるように一致列を分割する。
相対位置が一致長以上である、すなわち相対位置offset≧一致長lengthを満たす場合には、このステップでの処理は行われない。
S308で一致列分割部28は、分割した一致列の最初の文字のアドレスの位置の直前の文字列が非一致列かどうかを判定する。もしこの判定の結果が“YES”、すなわち、直前の文字列が非一致列である場合には、処理はS310に進む。また、もしこの判定の結果が“NO”、すなわち、直前の文字列が非一致列ではない場合には、処理はS312に進む。
S310で非一致長符号化部25と非一致列符号化部26は、S306で必要に応じて分割された一致列の直前の非一致列を符号化する。本ステップの処理が終了すると、処理はS312に進む。
S312で一致長符号化部23と一致位置符号化部24は、S306で必要に応じて分割された一致列を符号化する。本ステップの処理が終了すると、処理はS314に進む。
S314で出力バッファ27は圧縮すべき全ての元データを処理したかどうかを判定する。もしこの判定の結果が“YES”、すなわち、全ての元データを処理した場合には、圧縮処理を終了する。また、もしこの判定の結果が“NO”、すなわち、全ての元データを処理していない場合には、処理はS300に戻る。
ここで、図8のような処理によって圧縮されたデータの復元処理について図9を参照して説明する。
図9の処理は、たとえば、図15のような構成を有するコンピュータよって処理され得る。
処理が開始される前に、圧縮データがRAM106に格納されているものとする。
処理が開始されるとS400でCPU102は、現在処理しているデータが一致列であるかどうかを判定する。もしこの判定の結果が“YES”、すなわち、現在処理しているデータが一致列である場合には、処理はS402に進む。また、もしこの判定の結果が“NO”、すなわち、現在処理しているデータが一致列ではない場合には、処理はS406に進む。
S402でCPU102は、規則1に従って、一致列の圧縮データから一致長と一致列の開始位置を読み取る。本ステップの処理が終了すると、処理はS404に進む。
S404でCPU102は、一致列の開始位置から一致長分をコピーする。本ステップの処理が終了すると、処理はS410に進む。
S400で現在処理しているデータが一致列ではないと判定された場合には、S406に進む。
S406でCPU102は、規則2に従って非一致列の圧縮データから非一致長を読み取り復元する。本ステップの処理が終了すると、処理はS408に進む。
S408でCPU102は、規則2に従って非一致列の圧縮データから非一致文字列を読み取り復元する。
本ステップの処理が終了すると、処理はS410に進む。
S410でCPU102は、復元すべき全ての元データを処理したかどうかを判定する。もしこの判定の結果が“YES”、すなわち、全ての圧縮データを処理した場合には、復元処理を終了する。また、もしこの判定の結果が“NO”、すなわち、全ての圧縮データを処理していない場合には、処理はS400に戻る。
このように、図8のような処理によって圧縮されたデータの復元処理は、図4に示されている復元処理に比べると単純化されており、よって、高速に処理することができる。
<実施例>
コピー元とコピー先の重なりは、同じ1文字、2文字列、3文字列、・・・のいずれかが続けて繰返す循環文字列において発生する。LZ77方式において、一致列を検索して相対位置offset、一致長lengthが得られたとする。offset<lengthのとき、コピー元とコピー先が重なるため一致列を分割して符号化する。また、offset<lengthであれば常に分割を行うのではなく、重なりの最小距離を予めXと定め、offset<Xのときのみ分割を行うようにしてもよい。
分割の仕方には、いくつか考えられる。以下では、次のような場合について説明する。
(Ex1)P(1)、P(3)、P(7)、・・・、P(2m−1)(ただし (2m−1)<n)で分割する、
(Ex2)n=(一致長+carton−1)÷cartonとし、P(n÷2)、P(n÷4) 、P(n÷8)、・・・、P(n÷2m))(ただしn÷2m>1)で分割する、
(Ex3)重なりの最小距離X, 一致長の最小値Nを定めた上で、P(1)、P(1+2)、P(1+2+4)、・・・、P(2m−1)(ただし (2m−1)<n)で分割する、
(Ex4)一致長の最小値をNとし、循環の1セットがN以上になるように調節した上で、上記(Ex1)〜(Ex3)の分割をする。
以下では上記(Ex1)〜(Ex4)について、説明する。
図10は、実施例におけるデータ圧縮装置での圧縮処理の流れの例を示す図である。
また、データ圧縮装置20が図15に示されているような汎用コンピュータ100である場合には、下記の説明は、そのような処理を行う制御プログラムを定義する。すなわち、以下では、下記に説明する処理を汎用コンピュータに行わせる制御プログラムの説明でもある。
処理が開始されるとS500で入力バッファ部21は、現在のアドレスの位置p_curと、非一致乗長n_lenをリセットする。たとえば、p_cur=0、n_len=0とする。本ステップの処理が終了すると、処理はS502に進む。
次のS502で一致列検索部22は、一致列を検索する。具体的には、一致長lenと相対位置offsetを求める。本ステップの処理が終了すると、処理はS504に進む。
S504で一致列検索部22は、一致列が見つかったかどうかを判定する。もしこの判定の結果が“YES”、すなわち、一致列が見つかった場合には、処理はS506に進む。また、もしこの判定の結果が“NO”、すなわち、一致列が見つからなかった場合には、処理はS532に進む。
S506で一致列検索部22は、現在のアドレスの位置p_curと、非一致乗長n_lenを更新する。たとえば、現在のアドレスの位置p_curと、非一致乗長n_lenをそれぞれ、1だけ増加させる。
S506では、先頭位置調整処理が行われる。
図11を参照して、先頭位置調整処理について説明する。この処理では、一致長の最小値Nが定められているとする。
処理が開始されるとS600で一致列検索部22は、相対位置offsetを変数iに代入する。本ステップの処理が終了すると、処理はS602に進む。
S602で一致列検索部22は、変数iが一致長の最小値N以上であるかを判定する。もしこの判定の結果が“YES”、すなわち、変数iが一致長の最小値N以上である場合には、処理はS606に進む。また、もしこの判定の結果が“NO”、すなわち、変数iが一致長の最小値N以上ではない場合には、処理はS604に進む。
S606で一致列検索部22は、非一致長n_lenに(i−offset)の値を加え、現在のアドレスの位置p_curに(i−offset)の値を加える。さらに、一致列の一致長lenから(i−offset)の値を引く。本ステップの処理が終了すると、先頭位置調整処理は終了する。
S604で一致列検索部22は、変数iにoffsetの値を加える。
図10に戻って、S506の次のS508で一致列分割部28は、一致列分割処理を行う。
図12A、12Bを参照して、一致列分割処理について説明する。
図12Aは、上記Ex1のように、P(1)、P(3)、P(7)、・・・、P(2m−1)(ただし (2m−1)<n)で分割する場合の処理を示す図である。
処理を開始すると、S700で一致列分割部28は、分割した一致列の後尾番号e_numの値をリセットし、一致列の一致長の変数len2に一致列の一致長lenの値を代入する。本ステップの処理が終了すると、処理はS702に進む。
S702で一致列分割部28は、offset>Xまたはoffset>len2であるかを判定する。もしこの判定の結果が“YES”、すなわち、offset>Xまたはoffset>len2である場合には、処理はS704に進む。また、もしこの判定の結果が“NO”、すなわち、offset≦Xかつoffset≦len2の場合には、処理はS706に進む。
S704で一致列分割部28は、分割した一致列の一致位置A_offset[e_num]にoffsetの値を代入し、分割した一致列の一致長A_len[e_num]にlen2の値を代入する。本ステップの処理が終了すると、処理はS706に進む。
S706で一致列分割部28は、分割した一致列の一致位置A_offset[e_num]にoffsetの値を代入し、分割した一致列の一致長A_len[e_num]にlen2の値を代入する。さらに、e_numの値を更新する。たとえば、e_numの値を1だけ増やす。len2の値からoffsetの値を引き、offsetの値を更新する。offsetの値の更新は、たとえば、値を2倍にする。本ステップの処理が終了すると、処理はS702に戻る。
図12Bは、上記Ex2のように、n=(一致長+carton−1)÷相対位置とし、P(n÷2)、P(n÷4) 、P(n÷8)、・・・、P(n÷2m))(ただしn÷2m>1)で分割する場合の処理を示す図である。
処理を開始すると、S800で一致列分割部28は、一致長をlen、相対位置をoffsetとして、n=(len+carton−1)÷offsetで算出する。さらに、ダミー変数iをリセットし、i=0とする。本ステップの処理が終了すると、処理はS802に進む。
S802で一致列分割部28は、S800で算出されたnの値が1以下であるかどうかを判定する。もしこの判定の結果が“YES”、すなわち、nの値が1以下である場合には、処理はS806に進む。また、もしこの判定の結果が“NO”、すなわち、nの値が1より大きいの場合には、処理はS804に進む。
S804で一致列分割部28は、nの値を更新する。たとえば、値を半分にする。さらに、分割位置P(i)にnの値を代入し、さらにダミー変数iの値を1増やす。本ステップの処理が終了すると、処理はS802に戻る。
S806で一致列分割部28は、一致列の一致長の変数len2と、分割した一致列の後尾番号e_numの値をリセットする。len2=0、e_num=0とする。本ステップの処理が終了すると、処理はS808に進む。
S808で一致列分割部28は、ダミー変数iの値が1より小さいかどうかを判定する。もしこの判定の結果が“YES”、すなわち、ダミー変数iの値が1より小さい場合には、処理はS810に進む。また、もしこの判定の結果が“NO”、すなわち、ダミー変数iの値が1以上の場合には、処理はS812に進む。
S810で一致列分割部28は、分割した一致列の一致長A_len[e_num]に(len−len2)の値を代入する。また分割した一致列の一致位置A_offset[e_num]に(P(0)+1)×offsetの値を代入する。本ステップの処理が終了すると、一致列分割処理を終了する。
S812で一致列分割部28は、ダミー変数iの値を1減らす。また、ダミー変数tmpに分割位置P(i)と相対位置offsetの積、P(i)×offsetを代入し、このダミー変数tmpを分割した一致列の一致長A_len[e_num]と、分割した一致列の一致位置A_offset[e_num]に代入する。len2の値にtmpの値を加え、e_numの値を1増やす。本ステップの処理が終了すると、処理はS808に戻る。
図10に戻り、S510で一致列分割部28は、分割した一致列の先導番号f_numと分割した一致列の非一致長n_len2をリセットする。f_num=0、n_len2=0とする。本ステップの処理が終了すると、S512に進む。
S512で一致列分割部28は、一致長調整処理を行う。
一致長調整処理について、図13を参照して説明する。
処理を開始するとS900で一致列分割部28は、分割した一致列の一致位置A_offset[f_num]が一致長の最小値N以上であるかどうかを判定する。もしこの判定の結果が“YES”、すなわち、分割した一致列の一致位置A_offset[f_num]が一致長の最小値N以上である場合には、処理はS904に進む。また、もしこの判定の結果が“NO”、すなわち、分割した一致列の一致位置A_offset[f_num]が一致長の最小値Nより小さい場合には、処理はS902に進む。
S902で一致列分割部28は、分割した一致列の非一致長n_lenの値にA_offset[f_num]の値を加える。また、f_numの値を1増やす。本ステップの処理が終了すると、処理はS900に戻る。
S900およびS902の処理で、先頭の分割列の調整を行う。
S904で一致列分割部28は、分割した一致列の一致長A_len[e_num−1]が一致長の最小値N以上であるか、またはe_numの値がf_numの値より小さいかどうかを判定する。もしこの判定の結果が“YES”、すなわち、分割した一致列の一致長A_len[e_num−1]が一致長の最小値N以上であるか、またはe_numの値がf_numの値より小さい場合には、一致長調整処理を終了する。また、もしこの判定の結果が“NO”、すなわち、分割した一致列の一致位置A_offset[e_num−1]が一致長の最小値Nより小さく、かつe_numの値がf_numの値以上である場合には、処理はS906に進む。
S906で一致列分割部28は、分割した一致列の非一致長n_len2の値に分割した一致列の一致長A_len[e_num−1]の値を加え、e_numの値を1減らす。
図10に戻って、S514で一致列分割部28は、非一致長n_lenが0かどうかを判定する。もしこの判定の結果が“YES”、すなわち、非一致長n_lenが0である場合には、処理はS518に進む。また、もしこの判定の結果が“NO”、すなわち、非一致長n_lenが0でない場合には、処理はS516に進む。
S516で非一致長符号化部25と非一致列符号化部26は、非一致列の符号化を行う。つまり、非一致長n_lenと、非圧縮データInBuf[(p_cur−n_len)、…、(p_cur−1)]の符号化を行う。本ステップの処理が終了すると、処理はS518に進む。
S518で一致列分割部28は、分割した一致列の先頭のアドレス番号f_numが分割した一致列の後尾のアドレス番号e_numの値より大きいかを判定する。もしこの判定の結果が“YES”、すなわち、f_num>e_numである場合には、処理はS520に進む。また、もしこの判定の結果が“NO”、すなわち、f_num≦e_numである場合には、処理はS524に進む。
S524で一致長符号化部23と一致位置符号化部24は、一致列の符号化を行う。つまり、一致列の一致長A_len[f_num]およびA_offset[f_num]の符号化を行う。本ステップの処理が終了すると、処理はS526に進む。
S526で一致長符号化部23と一致位置符号化部24は、分割した一致列の先頭のアドレス番号f_numの値を1増やす。本ステップの処理が終了すると、処理はS518に戻る。
S520で一致列分割部28は、非一致長n_lenに分割した一致列の非一致長n_len2の値を代入し、現在位置p_curに一致長lenの値を加える。本ステップの処理が終了すると、処理はS522に進む。
S522で出力バッファ27は圧縮すべき全ての元データを処理したかどうかを判定する。もしこの判定の結果が“YES”、すなわち、全ての元データを処理した場合には、S524に進む。また、もしこの判定の結果が“NO”、すなわち、全ての元データを処理していない場合には、処理はS502に戻る。
S524で一致列分割部28は、非一致長n_lenが0かどうかを判定する。もしこの判定の結果が“YES”、すなわち、非一致長n_lenが0である場合には、処理を終了すうr。また、もしこの判定の結果が“NO”、すなわち、非一致長n_lenが0でない場合には、処理はS526に進む。
S526で非一致長符号化部25と非一致列符号化部26は、非一致列の符号化を行う。つまり、非一致長n_lenと、非圧縮データInBuf[(p_cur−n_len)、…、(p_cur−1)]の符号化を行う。本ステップの処理が終了すると、処理は終了する。
圧縮装置20および上記の圧縮方法では、LZ77方式において、ある一致列の相対位置offsetと一致長lengthであるとき、offset<lengthのとき、コピー元とコピー先が重なるため一致列を分割して符号化する。
また、重なりの最小距離を予めXと定め、offset<Xのときのみ分割を行うようにしてもよい。
また、コピー元とコピー先の重なりは、同じ1文字、2文字列、3文字列、・・・のいずれかが続けて繰返す循環文字列において発生する。循環の1セットの長さはコピー元とコピー先の相対位置(相対距離)と一致する。初回の1セットは別符号で符号化され、2回目以降の循環において重なりが発生する。
そこで、循環の1セットの長さをcarton(カートン)とし、一致文字列の先頭からP(1)=carton、P(2)=carton×2、・・・、P(n)=carton×n(ただP(n)はlengthより小さい)の位置の全てまたはいずれかで分割することで、コピー元とコピー先が重ならないようにする。
図14に、P(1)、P(3)、P(7)、・・・、P(2m−1)(ただし (2m−1)<n)で分割する例を、図15に、n=(一致長+carton−1)÷cartonとし、P(n÷2)、P(n÷4) 、P(n÷8)、・・・、P(n÷2m))(ただしn÷2m>1)で分割する例を示した。また、一致長の最小値をNを予め定め、一致文字列を分割することで一致長がN以下となる部分は非一致列として扱ってもよい。
図16では、重なりの最小距離X, 一致長の最小値Nを定めた上で、P(1)、P(1+2)、P(1+2+4)、・・・、P(2m−1)(ただし (2m−1)<n)で分割する例において、重なりの最小距離X=8、一致長の最小値N=3の場合が示されている。この場合、一致文字列を分割することで一致長がN以下となる部分は非一致列として扱う。
また、一致長の最小値をNとしているとき、循環の1セットがN以上になるように調節した上で、上記分割を行っても良い。具体的には、相対位置offset<Nのとき、N≦offset×i(ただし、iは整数値)となる最大の「offset×i」の長さの分、一致列の先頭位置を後ろへずらしても良い。
例えば、図17には、一致長の最小値N=3として、循環の1セットがN以上になるように調整した上で、P(1)、P(1+2)、P(1+2+4)、・・・、P(2m−1)(ただし (ただし (2m−1)<n)の分割を行った例が示されている。
また、P(1)、P(2), ・・・、P(n)の全て、および図14〜17に示す分割から最も符号量が小さくなるものを選択してもよい。
<<第1実施例(Ex1)>>
図14は、P(1)、P(3)、P(7)、・・・、P(2m−1)(ただし (2m−1)<n)で分割する例を示す図である。
carton=1の場合の例として、図14には、元データが“aaaaaaaaaab”の場合が示されている。
この場合、第1番目のアドレスの位置の“a”が非一致列であり、第2〜10番目のアドレスの位置の“aaaaaaaaa”が一致列である。第11番目のアドレスの位置の文字“b”は非一致列である。第2〜10番目のアドレスの位置の一致列“aaaaaaaaa”を1文字目、3文字目、7文字目で分割する。すなわち、一致列“aaaaaaaaa”を、「“a”+“aa”+”aaaa”+残り」と分割する。
元データが“aaaaaaaaaab”の場合、圧縮データは “{1、a}(1、1)(2、2)(4、4)(2、8){1、b}”となる。
carton=2の場合の例として、図14には、元データが“ababababac”の場合が示されている。この場合、第1〜2番目のアドレスの位置の“ab”が非一致列であり、第3〜10番目のアドレスの位置の“abababa”が一致列である。第11番目のアドレスの位置の文字“c”は非一致列である。第3〜9番目のアドレスの位置の“abababa”を1カートン目、3カートン目で分割する。すなわち、一致列“abababab”を、「“ab”+“abab”+残り」と分割する。
元データが“ababababac”の場合、圧縮データは “{2、ab}、(2、2)(4、4)(3、8){1、c}”となる。
carton=3の場合の例として、図14には、元データが“abcabcabcabd”の場合が示されている。この場合、第1〜3番目のアドレスの位置の“abc”が非一致列であり、第4〜11番目のアドレスの位置の“abcabcab”が一致列である。第12番目のアドレスの位置の文字“d”は非一致列である。第4〜11番目のアドレスの位置の“abcabcab” を1カートン目で分割する。すなわち、一致列“abcabcabc”を、「“abc”+残り」と分割する。
元データが“abcabcabcabd”の場合、圧縮データは “{3、abc}(3、3)(5、6){1、d}”となる。
carton=4の場合の例として、図14には、元データが“abcdabcdabcdabce”の場合が示されている。この場合、第1〜4番目のアドレスの位置の“abcd”が非一致列であり、第5〜15番目のアドレスの位置の“abcdabcdabcd”が一致列である。第17番目のアドレスの位置の文字“e”は非一致列である。第5〜15番目のアドレスの位置の“abcdabcdabc” を1カートン目で分割する。すなわち、一致列“abcdabcdabc”を、「“abcd”+残り」と分割する。
元データが“abcdabcdabcdabcde”の場合、圧縮データは “{4、abcd}(4、4)(7、8){1、e}”となる。
carton=7の場合の例として、図14には、元データが“abcdefgabcdefgabcdefh”の場合が示されている。この場合、第1〜7番目のアドレスの位置の“abcdefg”が非一致列であり、第8〜20番目のアドレスの位置の“abcdefgabcdef”が一致列である。第21番目のアドレスの位置の文字“h”は非一致列である。第8〜20番目のアドレスの位置の“abcdefgabcdef” を1カートン目で分割する。すなわち、一致列“abcdefgabcdef”を、「“abcdefg”+残り」と分割する。
元データが“abcdefgabcdefgabcdefh”の場合、圧縮データは “{7、abcdefg}(7、7)(6、14){1、h}”となる。
carton=8の場合の例として、図14には、元データが“abcdefghabcdefghabcdefgi”の場合が示されている。この場合、第1〜8番目のアドレスの位置の“abcdefgh”が非一致列であり、第9〜24番目のアドレスの位置の“abcdefghabcdefg”が一致列である。第25番目のアドレスの位置の文字“i”は非一致列である。第9〜23番目のアドレスの位置の“abcdefghabcdefg” を1カートン目で分割する。すなわち、一致列“abcdefghabcdefg”を、「“abcdefgh”+残り」と分割する。
元データが“abcdefghabcdefghabcdefgi”の場合、圧縮データは “{8、abcdefgh}(8、8)(7、16){1、i}”となる。
<<第2実施例(Ex2)>>
図15は、n=(一致長+carton−1)÷cartonとし、P(n÷2)、P(n÷4) 、P(n÷8)、・・・、P(n÷2m))(ただしn÷2m>1)で分割する例を示す図である。
carton=1の場合の例として、図15には、元データが“aaaaaaaaaab”の場合が示されている。
第2〜10番目のアドレスの位置の一致列“aaaaaaaaa”を分割するが、この場合n=(9+1−1)÷1=9であるので、P(4)、P(2)、P(1)で分割する。すなわち、一致列“aaaaaaaaa”を「“a”+“a”+“aa”+残り」と分割する。
元データが“aaaaaaaaaab”の場合、圧縮データは “{1、a}(1、1)(1、2)(2、3)(5、5){1、b}”となる。
carton=2の場合の例として、図15には、元データが“ababababababc”の場合が示されている。この場合、第1〜2番目のアドレスの位置の“ab”が非一致列であり、第3〜11番目のアドレスの位置の“ababababa”が一致列である。第12番目のアドレスの位置の文字“c”は非一致列である。この場合、n=(9+2−1)÷2=5であるので、P(2)、P(1)で分割する。すなわち、一致列“ababababab”を、「“ab”+“ab”+残り」と分割する。
元データが“ababababababc”の場合、圧縮データは “{2、ab}、(2、2)(2、4)(5、4){1、c}”となる。
carton=3の場合の例として、図15には、元データが“abcabcabcabd”の場合が示されている。この場合、第1〜3番目のアドレスの位置の“abc”が非一致列であり、第4〜11番目のアドレスの位置の“abcabcab”が一致列である。第12番目のアドレスの位置の文字“d”は非一致列である。この場合、n=(8+3−1)÷3=3であるので、P(1)で分割する。すなわち、一致列“abcabcab”を、「“abc”+残り」と分割する。
元データが“abcabcabcabd”の場合、圧縮データは “{3、abc}(3、3)(5、6){1、d}”となる。
carton=4の場合の例として、図15には、元データが“abcdabcdabcdabce”の場合が示されている。この場合、第1〜4番目のアドレスの位置の“abcd”が非一致列であり、第5〜15番目のアドレスの位置の“abcdabcdabc”が一致列である。第16番目のアドレスの位置の文字“e”は非一致列である。この場合、n=(11+4−1)÷4=3であるので、P(1)で分割する。すなわち、一致列“abcdabcdabc”を「“abcd”+残り」と分割する。
元データが“abcdabcdabcdabce”の場合、圧縮データは “{4、abcd}(4、4)(7、8){1、e}”となる。
carton=7の場合の例として、図15には、元データが“abcdefgabcdefgabcdefh”の場合が示されている。この場合、n=(11+7−1)÷7=2であるので、一致列“abcdefgabcdef”を、「“abcdefg”+残り」と分割する。
元データが“abcdefgabcdefgabcdefh”の場合、圧縮データは “{7、abcdefg}(7、7)(6、14){1、h}”となる。
carton=8の場合の例として、図15には、元データが“abcdefghabcdefghabcdefgi”の場合が示されている。この場合、第1〜8番目のアドレスの位置の“abcdefgh”が非一致列であり、第9〜23番目のアドレスの位置の“abcdefghabcdefg”が一致列である。第24番目のアドレスの位置の文字“i”は非一致列である。この場合、n=(15+8−1)÷8〜2であるので、一致列“abcdefghabcdefgh”を、「“abcdefgh”+残り」と分割する。
元データが“abcdefghabcdefghabcdefgi”の場合、圧縮データは “{8、abcdefgh}(8、8)(7、16){1、i}”となる。
<<第3実施例(Ex3)>>
図16は、重なりの最小距離X, 一致長の最小値Nを定めた上で、P(1)、P(1+2)、P(1+2+4)、・・・、P(2m−1)(ただし (2m−1)<n)で分割する例を示す図である。図16では、重なりの最小距離X=8、一致長の最小値N=3の場合が示されている。この場合、一致文字列を分割することで一致長がN以下となる部分は非一致列として扱う。
carton=1の場合の例として、図16には、元データが“aaaaaaaaaab”の場合が示されている。
この場合、第1番目のアドレスの位置の“a”が非一致列であり、第2〜10番目のアドレスの位置の“aaaaaaaaa”が一致列である。第11番目のアドレスの位置の文字“b”は非一致列である。第2〜10番目のアドレスの位置の一致列“aaaaaaaaa”を1文字目、3文字目、7文字目で分割するが、一致長の最小値N=3とするためには、元データ “aaaaaaaaaab”を「“aaaa”+“aaaa”+“aab”」と分割する。
よって、圧縮データは “{4、aaaa}(4、4){3、aab}”となる。
carton=2の場合の例として、図14には、元データが“abababababc”の場合が示されている。この場合、第1〜2番目のアドレスの位置の“ab”が非一致列であり、第3〜10番目のアドレスの位置の“abababab”が一致列である。第11番目のアドレスの位置の文字“c”は非一致列である。第3〜10番目のアドレスの位置の“abababab”を1カートン目、3カートン目で分割するが、一致長の最小値N=3とするためには、元データ “abababababc”を、「“abab”+“abab”+“abab”+“c”」と分割する。
よって圧縮データは、“{4、abab}(4、4)(4、8){1、c}”となる。
carton=3の場合の例として、図16には、元データが“abcabcabcabcd”の場合が示されている。この場合、第1〜3番目のアドレスの位置の“abc”が非一致列であり、第4〜12番目のアドレスの位置の“abcabcabc”が一致列である。第13番目のアドレスの位置の文字“d”は非一致列である。第4〜12番目のアドレスの位置の“abcabcabc” を1カートン目で分割するが、一致長の最小値N=3とするためには、元データ “abcabcabcabcd”を、「“abc”+“abc”+“abc”+“d”」と分割する。
よって、圧縮データは、“{3、abc}(3、3)(6、6){1、d}”となる。
carton=4の場合の例として、図16には、元データが“abcdabcdabcdabcde”の場合が示されている。この場合、第1〜4番目のアドレスの位置の“abcd”が非一致列であり、第5〜16番目のアドレスの位置の“abcdabcdabcd”が一致列である。第17番目のアドレスの位置の文字“e”は非一致列である。第5〜16番目のアドレスの位置の“abcdabcdabcd” を1カートン目で分割するが、一致長の最小値N=3とするためには、元データ“abcdabcdabcdabcde”を、「“abcd”+“abcd”+“abcdabcd”+“e”」と分割する。よって、圧縮データは “{4、abcd}(4、4)(8、8){1、e}”となる。
carton=7の場合の例として、図16には、元データが“abcdefgabcdefgabcdefh”の場合が示されている。この場合、第1〜7番目のアドレスの位置の“abcdefg”が非一致列であり、第8〜21番目のアドレスの位置の“abcdefgabcdefg”が一致列である。第22番目のアドレスの位置の文字“h”は非一致列である。第8〜21番目のアドレスの位置の“abcdefgabcdef”
を1カートン目で分割するが、一致長の最小値N=3とするためには、元データ“abcdefgabcdefgabcdefgh”を、「“abcdefg”+“abcdefg”+“abcdef”+“h”」と分割する。
よって、圧縮データは “{7、abcdefg}(7、7)(6、14){1、h}”となる。
carton=8の場合の例として、図16には、元データが“abcdefghabcdefghabcdefgi”の場合が示されている。この場合、第1〜8番目のアドレスの位置の“abcdefgh”が非一致列であり、第9〜23番目のアドレスの位置の“abcdefghabcdefg”が一致列である。第24番目のアドレスの位置の文字“i”は非一致列である。この場合、carton=8は重なりの最小距離以上のため分割しない。
よって、圧縮データは “{8、abcdefgh}(15、8){1、i}”となる。
<<第4実施例(Ex4)>>
図17は、循環の1セットが一致長の最小値N=3以上になるように先頭を調整する例を示す図である。
carton=1の場合は、carton=3となるように一致列の先頭のアドレスの位置を調整する。
元データ “aaaaaaaaaab”を「“aaa”+“aaa”+“aaaa”+“b”」と分割する。
よって、圧縮データは、“{3、aaa}(3、3)(4、6){1、b}”となる。
carton=2の場合は、carton=4となるように一致列の先頭のアドレスの位置を調整する。
元データが“ababababac”の場合、「“abab”+“abab”+“aba”+“c”」と分割する。
よって、圧縮データは、“{4、abab}(4、4)(3、8){1、c}”となる。
carton=3の場合は、carton=3は一致長の最小値以上であるので、政党距離は調整しない。
元データが“abcabcabcabd”の場合、圧縮データは、“{3、abc}(3、3)(5、6){1、d}”となる。
10、20 データ圧縮装置
11、21 入力バッファ部
12、22 一致列検索部
13、23 一致長符号化部
14、24 一致位置符号化部
15、25 非一致長符号化部
16、26 非一致位置符号化部
17、27 出力バッファ部
28 一致列分割部
本発明は、データ圧縮装置、方法およびプログラムに関するものである。
データ圧縮アルゴリズムとして、1977年にAbraham Lempel氏とJacob Ziv氏が発表したLZ77方式が知られている。LZ77方式は辞書式圧縮法の一つで、スライド辞書法とも呼ばれ、データを先頭から順番に符号化していく。スライド辞書法は、現在注目している位置から始まるシンボル列が、それ以前に出現していたかを探す。もし出現していたならば、シンボル列をその出現位置と長さのポインタに置き換える。スライド辞書法の名前は、シンボル列を探す範囲をスライド窓と呼び、これを辞書として使用することに由来する。
LZ77方式では、繰返し出現するデータ列を過去に出現したシンボル列の長さと出現位置に置き換えることでデータ量を削減する。復元の際には、過去の位置から一致長分のシンボル列をコピーすることで元のデータに復元できる。また、繰返しが見つからなかったときに、見つからなかった長さと見つからなかったシンボル列を符号化する方法が示されている。
また、中央処理装置(Central Processing Unit、CPU)のオペレーティングシステム(OS)によっては、1命令で複数データを扱うSingle Instruction Multiple Data(SIMD)命令が用意されており、16バイト、32バイト単位でのメモリ間のデータコピーを高速に行うことができる。SIMD命令を復元時のコピー処理において用いると復元処理の高速化を実現することができる。
LZ77方式では、コピー元の文字列の最後尾のアドレスがコピー先の文字列の先頭のアドレスより後方になることがある。このことを以下では、単に「コピー元とコピー先が重なる」という。たとえば、同じ文字が「aaaa…」と続くケースだと、コピー元の文字列はアドレス「1,2,3,4…」で、コピー先の文字列はアドレス「2,3,4,…」となり、アドレス「2,3,4,…」において重なりを持つ。このようなケースでは、復元処理において、ステップ1で、第1バイトを第2バイトにコピーし、ステップ2で第2バイトを第3バイトにコピーする、という手順でそれ以前に出現した文字列をコピーする。この場合、ステップ1の処理が終わっていないとステップ2の処理を行うことができない。つまり、LZ77方式は、繰返し出現するデータ列を過去に出現したデータ列の長さと出現位置に置き換えているため、単純なコピー処理で復元できるにも関わらず、コピー元とコピー先が重なっているときは、1バイトずつのコピー処理が必要となることがある。このため、復元時に高速な多バイトコピーを使用するには、まずコピー元とコピー先が重なるか否か確認する必要があり、また、重なっている場合は、1バイトずつのコピーを行う煩雑な処理が必要であるという問題がある。
よって、本発明は、多バイトコピーを用いて復元を行う上で不都合な重なりを制限した一致列を選択して圧縮することで、高速に復元できる圧縮データを生成するデータ圧縮装置、方法およびプログラムを提供することを目的とする。
データ圧縮装置が提供される。データ圧縮装置は、圧縮前のデータの文字列中の第1の文字列の後に、前記第1の文字列と同一である第2の文字列を一致列として抽出し、前記一致列の長さと、前記第1の文字列が前記第2の文字列の幾つ前のアドレスの位置から開始されるかを示す相対位置を決定する一致列検索部と、前記一致列検索部で抽出された前記第2の文字列から、長さが前記相対位置より小さい第3の文字列を抽出する一致列分割部と、前記第2または第3の文字列の長さを符号化する一致長符号化部と、前記相対位置を符号化する一致位置符号化部と、
を含むことを特徴とする。
多バイト単位で圧縮データの復元を実現するために、元データ中で繰り返し出現する一致列を再分割してから圧縮することで、高速に復元できる圧縮データを生成することができる。
LZ77方式の概略を説明する図である。
比較例におけるデータ圧縮装置の機能ブロック図の例を示す図である。
比較例におけるデータ圧縮装置での圧縮処理の流れの例を示す図である。
比較例における元データと圧縮データの例を示す図である。
比較例における復元処理の流れの例を示す図である。
比較例におけるデータ圧縮装置での圧縮処理の例を示す図である。
比較例における復元処理の例を示す図である。
実施形態におけるデータ圧縮装置の機能ブロック図の例を示す図である。
実施形態におけるデータ圧縮装置での圧縮処理の流れの例を示す図である。
実施形態における復元処理の流れの例を示す図である。
実施例におけるデータ圧縮装置での圧縮処理の流れの例を示す図である。
実施例における先頭位置調整処理の流れの例を示す図である。
実施例における一致列分割処理の流れの例を示す図である。
実施例における一致列分割処理の流れの別の例を示す図である。
実施例における一致長調整処理の流れの例を示す図である。
P(1)、P(3)、…、P(2m−1)で分割する例を示す図である。
P(n÷2)、P(n÷4)、…、P(n÷2m)で分割する例を示す図である。
P(1)、P(3)、…、P(2m−1)で分割する別の例を示す図である。
P(1)、P(3)、…、P(2m−1)で分割するさらに別の例を示す図である。
コンピュータの構成の例を示す図である。
以下、図面を参照して、まず、比較例について説明し、その後、実施形態について説明する。
また、以下ではLZ77方式を用いたデータ圧縮装置、方法およびプログラムについて説明するが、もちろん、データ圧縮方法はLZ77方式には限定されず、繰返し出現するデータ列を過去に出現したデータ列の長さと出現位置に置き換えることでデータ量を削減するような圧縮方法であれば適用可能である。
LZ77方式では、繰り返し現われる文字列を検索し、2回目以降にその文字列が現われるとき、その文字列を、出現位置と長さに関するデータに置き換えることにより、圧縮する。ここで、出現位置とは、ある文字列が複数回目に現われるとき、複数回目に現れたときの先頭位置と、以前に現れたときの先頭位置のアドレスの差であり得る。
以下では、次のような表記規則を用いる。
(規則1)一致列は、(一致長、一致列の開始位置)で表す、
(規則2)非一致列は、{非一致長、非一致文字列}で表す。
ここで、一致列の開始位置は、幾つ前のアドレスに同一の文字列があるか、を示す。一致列の開始位置は、一致位置、相対位置とも呼ぶ。一致列の開始位置(相対位置)は、ある文字列が複数回目に現われるとき、複数回目に現れたときの先頭位置と、以前に現れたときの先頭位置のアドレスの差で、すなわち、相対距離の大きさであり得る。たとえば、一致列の開始位置が、“14”である場合、複数回目に現れたときの先頭位置は、以前に現れたときの先頭位置より14アドレス分だけ後方に位置することを意味しても良い。元データの文字列中の一致列を(一致長、一致列の開始位置)のような形式の圧縮データに符号化するとも言う。同様に、元データの文字列中の非一致列を{非一致長、非一致文字列}のような形式の圧縮データに符号化するとも言う。
<比較例>
図1〜6Bを参照して、比較例について説明する。以下の比較例の説明は、LZ77方式の概略の説明でもある。
図1は、LZ77方式の概略を説明する図である。
例えば、図1に示されている第1〜34番目のアドレスの位置に格納されている圧縮前のデータ(以下、単に元データと呼ぶことがある)では、第1〜14番目のアドレスの位置に“compression_de”という文字列が格納されており、第15〜22番目のアドレスの位置に“compress”という文字列が格納されており、第23番目のアドレスの位置には“_”(アンダーバー)が、第24〜34番目のアドレスの位置には“compression”という文字列が格納されている。よって、圧縮データは、まず、第1〜14番目のアドレスの位置に“compression_de”は非一致列であり、非一致長は14であるので、圧縮データでは、“{14、compression_de}”と表される。元データの第15〜22番目のアドレスの位置に“compress”とあるが、これは第1〜8番目のアドレスの位置の文字列と同一である。“compress”は8文字であり、一致文字列が開始されるアドレスの位置は14アドレス前であるので、一致列の開始位置は14である。よって、元データの第15〜22番目のアドレスのデータは、圧縮データでは “(8、14)”と符号化される。元データの第23番目のアドレスの位置に格納されている“_”(アンダーバー)は、それ以前には出現していないので、圧縮データでは“{1、_}”と符号化される。元データの第24〜34番目のアドレスの位置に“compression”とあるが、これは第1〜8番目のアドレスの位置の文字列と同一である。“compress”は8文字であり、一致文字列が開始されるアドレスの位置は23アドレス前であるので、一致列の開始位置は23である。よって、元データの第24〜34番目のアドレスのデータは、圧縮データでは “(11、23)”と符号化される。
このように、図1に示されている元データの文字列は、圧縮データでは、“{14、compression_de}(8、14){1、_}(11、23)”のように表される。
図2は、LZ77方式を用いて元データを圧縮し、圧縮データを生成する圧縮装置の機能ブロック図の例である。
圧縮装置10は、入力バッファ部11、一致列検索部12、一致長符号化部13、一致位置符号化部14、非一致長符号化部15、非一致列符号化部16、および出力バッファ部17を含む。
入力バッファ部11は、例えば、図1に示されている第1〜34番目のアドレスの位置に格納されているような圧縮前のデータ(元データ)を外部から受信し、必要に応じて、一時的に格納する。図1に示されている例では、元データは、“compression_decompression_compression.”である。
一致列検索部12は、入力バッファ部11に格納された元データの文字列に、繰り返し出現する文字列(一致列)が存在するかどうかを検索、抽出する。また、一致列検索部12は、一致列が存在する場合は、その一致列を決定する。例えば、図1に示されている例では、“compress”なる文字列や、“compression” なる文字列は複数回出現するので、一致列である。
一致長符号化部13は、一致列検索部12で検索され、抽出された一致列の長さを抽出し、規則1に従って、一致列を(一致長、一致列の開始位置)と表すときの、第1要素を決定する。例えば、図1に示されている例では、元データの第15〜22番目のアドレスの位置にある“compress”なる文字列は、第1〜8番目のアドレスの位置の文字列と同一であり、8文字である。よって、一致長符号化部13によって、一致長は8と符号化される。
一致位置符号化部14は、一致列検索部12で検索され、抽出された一致列が幾つ前のアドレスの位置から開始されるかを検出し、規則1に従って、一致列を(一致長、一致列の開始位置)と表すときの、第2要素を決定する。例えば、図1に示されている例では、元データの第15〜22番目のアドレスの位置にある“compress”なる文字列は、第1〜8番目のアドレスの位置の文字列と同一であり、一致文字列が開始されるアドレスの位置は14アドレス前である。よって、一致長符号化部13によって、一致列の開始位置は14と符号化される。
非一致長符号化部15は、一致列検索部12では一致列として抽出されなかった非一致列の長さを抽出し、規則2に従って、非一致列を{非一致長、非一致文字列}と表すときの、第1要素を決定する。例えば、図1に示されている例では、第1〜14番目のアドレスの位置に“compression_de”は非一致列であり、14文字である。よって、非一致長符号化部15によって、非一致長は14と符号化される。
非一致列符号化部16は、一致列検索部12では一致列として抽出されなかった非一致列を抽出し、規則2に従って、非一致列を{非一致長、非一致文字列}と表すときの、第2要素を決定する。例えば、図1に示されている例では、第1〜14番目のアドレスの位置に“compression_de”は非一致列である。よって、非一致長符号化部15によって、非一致文字列は“compression_de”と符号化される。
出力バッファ部17は、一致長符号化部13、一致位置符号化部14、非一致長符号化部15、および非一致列符号化部16の結果を用いて、元データを符号化、圧縮した結果である圧縮データを生成し、必要に応じて、一時的に格納する。たとえば、図1に示されている例では、元データである文字列“compression_decompression_compression.”は、“{14、compression_de}(8、14){1、_}(11、23)”と符号化される。
図3は、比較例におけるデータ圧縮装置での圧縮処理の流れの例を示す図である。
処理が開始されるとS100で一致列検索部12は、元データの文字列に、繰り返し出現する文字列である一致列が存在するかどうかを検索する。本ステップの処理が終了すると、処理はS102に進む。元データの文字列は、入力バッファ部11に格納されているものであっても良い。
S102で一致列検索部12は、一致列が見つかったかどうかを判定する。もしこの判定の結果が“YES”、すなわち、一致列が見つかった場合には、処理はS104に進む。また、もしこの判定の結果が“NO”、すなわち、一致列が見つからなかった場合には、処理はS112に進む。
S104で一致列検索部12は、S102で見つかった一致列の最初の文字のアドレスの位置の直前の文字列が非一致列かどうかを判定する。もしこの判定の結果が“YES”、すなわち、直前の文字列が非一致列である場合には、処理はS106に進む。また、もしこの判定の結果が“NO”、すなわち、直前の文字列が非一致列ではない場合には、処理はS108に進む。
S106で非一致長符号化部15と非一致列符号化部16は、S102で見つかった一致列の直前の非一致列を符号化する。符号化の例は、図1に示されている。本ステップの処理が終了すると、処理はS108に進む。
S108で一致長符号化部13と一致位置符号化部14は、S102で見つかった一致列を符号化する。符号化の例は、図1に示されている。本ステップの処理が終了すると、処理はS110に進む。
S110では出力バッファ部17は、圧縮すべき全ての元データを処理したかどうかを判定する。もしこの判定の結果が“YES”、すなわち、全ての元データを処理した場合には、圧縮処理を終了する。また、もしこの判定の結果が“NO”、すなわち、全ての元データを処理していない場合には、処理はS100に戻る。
S102で一致列が見つからなかった場合は、S112に進む。
S112で非一致長符号化部15と非一致列符号化部16はそれぞれ、一致が見つからなかった非一致列の長さと文字列を抽出する。そして、非一致列の長さおよび文字列に関する情報をそれぞれ、非一致長符号化部15と非一致列符号化部16内に一時的に記憶する。この情報は、S106で用いられる。本ステップの処理が終了すると、処理はS100に戻る。
図4は、比較例における元データと圧縮データの例を示す図である。
図4では、元データが循環文字列である場合を取り上げている。循環文字列の長さをcarton(カートン)と呼ぶ。図6においても、上記規則1、2を用いる。
また、図4において、P(n)(nは整数)は、cartonの区切りを示す。
carton=1の場合の例として、図4には、元データが“aaaaaaaaaab”の場合が示されている。
この場合、第1番目のアドレスの位置の“a”が非一致列であり、第2〜10番目のアドレスの位置の“aaaaaaaaa”が一致列である。
元データが“aaaaaaaaaab”の場合、圧縮データは “{1、a}、(9、1)、{1、b}”となる。ここで、圧縮データ中の一致列を示す部分“(9、1)”の第2要素の1は、carton(カートン)に一致する。
carton=2の場合の例として、図4には、元データが“abababababc”の場合が示されている。この場合、第1〜2番目のアドレスの位置の“ab”が非一致列であり、第3〜10番目のアドレスの位置の“abababab”が一致列である。第11番目のアドレスの位置の文字“c”は非一致列である。循環文字列の長さが2であるので、第2〜10番目のアドレスは2文字ずつ分割され、第4番目のアドレスの位置がP(1)、第6番目のアドレスの位置がP(2)のように分割される。
元データが“abababababc”の場合、圧縮データは “{2、ab}、(10、2)、{1、c}”となる。
carton=3の場合の例として、図4には、元データが“abcabcabcabcd”の場合が示されている。この場合、第1〜3番目のアドレスの位置の“abc”が非一致列であり、第4〜12番目のアドレスの位置の“abcabcabc”が一致列である。第13番目のアドレスの位置の文字“d”は非一致列である。
元データが“abcabcabcabcd”の場合、圧縮データは “{3、abc}、(9、3)、{1、d}”となる。
carton=4の場合の例として、図4には、元データが“abcdabcdabcdabcde”の場合が示されている。この場合、第1〜4番目のアドレスの位置の“abcd”が非一致列であり、第5〜16番目のアドレスの位置の“abcdabcdabcd”が一致列である。第17番目のアドレスの位置の文字“e”は非一致列である。
元データが“abcdabcdabcdabcde”の場合、圧縮データは “{4、abcd}、(12、4)、{1、e}”となる。
carton=7の場合の例として、図4には、元データが“abcdefgabcdefgabcdefgh”の場合が示されている。この場合、第1〜7番目のアドレスの位置の“abcdefg”が非一致列であり、第8〜21番目のアドレスの位置の“abcdefgabcdefg”が一致列である。第22番目のアドレスの位置の文字“h”は非一致列である。
元データが“abcdefgabcdefgabcdefgh”の場合、圧縮データは “{7、abcdefg}、(14、7)、{1、h}”となる。
carton=8の場合の例として、図4には、元データが“abcdefghabcdefghabcdefghi”の場合が示されている。この場合、第1〜8番目のアドレスの位置の“abcdefgh”が非一致列であり、第9〜24番目のアドレスの位置の“abcdefghabcdefgh”が一致列である。第25番目のアドレスの位置の文字“i”は非一致列である。
元データが“abcdefghabcdefghabcdefghi”の場合、圧縮データは “{8、abcdefgh}、(16、8)、{1、i}”となる。
ここで、図3のような処理によって圧縮されたデータの復元処理について図5を参照して説明する。
図5の処理は、たとえば、図18のような構成を有するコンピュータよって処理され得る。図18に示されているコンピュータ100は、中央処理装置(Central Processing Unit(CPU))102と、メモリ、Read Only Memory(ROM)104、及びRandom Access Memory(RAM)106を備えている。
処理が開始される前に、圧縮データがRAM106に格納されているものとする。処理は、圧縮データの列、たとえば図1の例では、圧縮データ“{14、compression_de}(8、14){1、_}(11、23)”を括弧単位で順次、復元処理を行う。
処理が開始されるとS200でCPU102は、現在処理しているデータが一致列であるかどうかを判定する。もしこの判定の結果が“YES”、すなわち、現在処理しているデータが一致列である場合には、処理はS202に進む。また、もしこの判定の結果が“NO”、すなわち、現在処理しているデータが一致列ではない場合には、処理はS210に進む。
S202でCPU102は、規則1に従って、一致列の圧縮データから一致長と一致列の開始位置を読み取る。本ステップの処理が終了すると、処理はS204に進む。
S204でCPU102は、コピー元とコピー先に重なりがあるかどうかを判定する。
ここで、図6A、6Bを参照して、コピー元とコピー先に重なりがある例について説明する。
図6Aに示されているように、元データの文字列は、文字“a”が10個並んだ文字列、“aaaaaaaaaa”で開始される文字列であるとする。この元データの文字列を、上記規則1、2に従って圧縮すると、次のようになる。
すなわち、第1番目のアドレスに位置する文字列“aaa”は、それ以前には文字がないので非一致列である。よって、仮の非一致列として”{1, a}が抽出される。
第2〜9番目のアドレスに位置する文字列“aaaaaaaaa”の処理では、この文字列は、第1番目のアドレスに位置する文字列“aaaaaaaaa”と一致するので、一致列であると判定される(図3のS102を参照)。さらに仮の非一致列を保有しているかどうかを判定し(図3のS104を参照)、保有しているので、非一致列{1,a}の符号化が行われる(S106)。また、第2〜9番目のアドレスに位置する文字列「aaaaaaaaa」の符号化が行われる。上記規則1に従うと、一致列は、(一致長、一致列の開始位置)で表され、今の場合、一致長は第2番目から第9番目のアドレスまでの9、一致列の開始位置は第1番目のアドレスであり、第2番目のアドレスの1つ前であるので、一致列の開始位置は1である。よって、元データは、図6Aに示されているように、“{1、a}(9、1)”と符号化される。よって、圧縮データは、“{1、a}(9、1)”となる。
図6Bは、圧縮データ“{1、a}(9、1)”の復元処理の概略を説明する図である。
圧縮データ“{1、a}(9、1)”の復元では、まず、“{1、a}”の部分を復元する。結果は、第1番目のアドレスの位置に文字“a”が格納される。
次に、“(9、1)”の部分の復元では、各アドレスにおいて、1つ前のアドレスに格納された文字を自身のアドレスにコピーする操作を行う。つまり、第3番目のアドレスの復元は、第2番目のアドレスに格納された文字を第3番目のアドレスの位置に格納する操作を含む。逆に言うと、第3番目のアドレスを復元するためには、第1番目のアドレスに格納された文字を第2番目のアドレスにコピーする操作の終了を待つ必要がある。
また、図1に示されている例では、圧縮データ中の“(8、14)”の部分の復元では、14アドレス前から8文字分コピーをして、第15〜22番目のアドレスの位置にコピーをするが、この場合は、コピー元とコピー先に重なりはない。
このようにS204でCPU102は、たとえば、図6Bに示されているように、復元処理において、コピー元とコピー先に重なりがあるかどうかを判定する。もしこの判定の結果が“YES”、すなわち、コピー元とコピー先に重なりがある場合には、処理はS206に進む。また、もしこの判定の結果が“NO”、すなわち、コピー元とコピー先に重なりがない場合には、処理はS208に進む。
S206でCPU102は、一致列の開始位置から一致長分をコピーする。本ステップの処理が終了すると、処理はS214に進む。
S208でCPU102は、重ならない範囲で、一致列の開始位置から順に一致長分をコピーする。図6Bに示されている例では、一致列の開始位置から1文字分の「a」をコピーする。
S200で現在処理しているデータが一致列ではないと判定された場合には、S210に進む。
S210でCPU102は、規則2に従って非一致列の圧縮データから非一致長を読み取り復元する。本ステップの処理が終了すると、処理はS212に進む。
S212でCPU102は、規則2に従って非一致列の圧縮データから非一致文字列を読み取り復元する。
たとえば、圧縮データ“{14、compression_de}(8、14){1、_}(11、23)”中の“{14、compression_de}”の部分から、非一致長14、非一致文字列“compression_de”と読み取ることができる。そして、第1〜14番目のアドレスの位置に“compression_de”と格納する。本ステップの処理が終了すると、処理はS214に進む。
S214でCPU102は、復元すべき全ての元データを処理したかどうかを判定する。もしこの判定の結果が“YES”、すなわち、全ての圧縮データを処理した場合には、復元処理を終了する。また、もしこの判定の結果が“NO”、すなわち、全ての圧縮データを処理していない場合には、処理はS200に戻る。
このように、比較例では、たとえば図6Bに示すようにコピー元とコピー先が重なることがある。図6Bの例では、<ステップ1:第1バイトを第2バイトにコピー>、<ステップ2:第2バイトを第3バイトにコピー>の手順でコピーすることになり、ステップ1の処理が終わっていないとステップ2の処理が行えず、カートン以下の長さ単位での、たとえば1バイトずつのコピー処理が必要となる。このように、復元時に高速な多バイトコピーを使用するには、まずコピー元とコピー先が重なるか否か確認する必要があり、また、重なっている場合は、カートン以下の長さ単位での、たとえば1バイトずつでコピーを行う煩雑な処理が必要である。
<実施形態>
以下で説明する実施形態では、たとえばLZ77方式において、相対位置をoffset、一致長をlengthとしたときに、相対位置が一致長より大きくなる、すなわちoffset>lengthとなるように一致列を分割して符号化する。このように圧縮することによって、一致列の分割によりコピー元とコピー先が重ならなくなるため、復元処理の際に条件分岐がなく、高速な復元処理を実現することができる圧縮データを生成することができる。すなわち、多バイト単位で圧縮データの復元を実現するために、元データ中で繰り返し出現する一致列を、復元時にコピー元とコピー先が重ならないように再分割してから圧縮することで、高速に復元できる圧縮データを生成することができる。
ここで、「重なり」とは、コピー元の文字列の最後尾のアドレスがコピー先の文字列の先頭のアドレスより後方になることを意味し得る。
図7は、元データを圧縮し、圧縮データを生成する圧縮装置の機能ブロック図の例である。
圧縮装置20は、入力バッファ部21、一致列検索部22、一致長符号化部23、一致位置符号化部24、非一致長符号化部25、非一致列符号化部26、出力バッファ部27、および一致列分割部28を含む。比較例の圧縮装置10とは、一致列分割部28が含まれている点で異なっている。
入力バッファ部21は、例えば、圧縮前のデータ(元データ)を外部から受信し、必要に応じて、一時的に格納する。
一致列検索部22は、入力バッファ部11に格納された元データの文字列に、繰り返し出現する文字列(一致列)が存在するかどうかを検索、抽出する。また、一致列検索部22は、一致列が存在する場合は、その一致列を決定する。例えば、図1に示されている例では、“compress”なる文字列や、“compression” なる文字列は複数回出現するので、一致列である。
このように一致列検索部22は、圧縮前のデータの文字列中の第1の文字列の後に、第1の文字列と同一である第2の文字列を一致列として抽出し、一致列の長さと、第1の文字列が第2の文字列の幾つ前のアドレスの位置から開始されるかを示す相対位置を決定する。
そして一致列分割部28は、相対位置が一致長以上、すなわちoffset≧lengthとなるように一致列を分割する。
このように一致列分割部28は、一致列検索部で抽出された第2の文字列から、長さが相対位置より小さい第3の文字列を抽出する。
たとえば、元データが“aaaaaaaaaab”である例をあげる。この例では、第1〜10番目のアドレスの位置に文字“a”が格納され、第11番目のアドレスの位置に文字“b”が格納されている。
このとき、たとえば、図14のように、元データの文字列“aaaaaaaaaab”の第2〜10番目のアドレスの位置の文字列“aaaaaaaaa”(9個の“a”)を、“a”+“aa”+“aaaa”+“aa”と分割することができる。つまり、図4のP(1)、P(3)、P(7)の位置、つまりP(2m−1)の位置で分割する。すると、元データ“aaaaaaaaaab”の第2番目のアドレスの一致列“a”に対しては、一致長lengthが1、相対位置offsetが1なので、offset≧lengthとなる。第3〜4番目の一致列“aa”については、一致長lengthが2、相対位置offsetが2なのでoffset≧lengthとなる。第5〜8番目の一致列“aaaa”については、一致長lengthが4、相対位置offsetが4なのでoffset≧lengthとなる。
また、たとえば、図14に示されているように、元データの文字列“aaaaaaaaaab”の第2〜10番目のアドレスの位置の文字列“aaaaaaaaa”(9個の“a”)を“a”+“a”+“aa”+“aaaaaa”と分割することができる。つまり、図4のP(1)、P(2)、P(4)の位置、つまり、n=(一致長列+carton−1)÷cartonとし、P(n÷2)、 P(n÷4)、…、P(n÷2m)の位置で分割する。すると、元データ“aaaaaaaaaab”の第2番目のアドレスの一致列“a”に対しては、一致長lengthが1、相対位置offsetが1なので、offset≧lengthとなる。第3番目の一致列“a”については、一致長lengthが1、相対位置offsetが2なのでoffset≧lengthとなる。第3〜5番目の一致列“aa”については、一致長lengthが2、相対位置offsetが3なのでoffset≧lengthとなる。第6〜10番目の一致列“aaaaa”については、一致長lengthが5、相対位置offsetが5なのでoffset≧lengthとなる。
一致長符号化部23および一致位置符号化部24は、一致列分割部28で分割された一致列に対し、規則1に従って、一致列を(一致長、一致列の開始位置)と表すときの、第1要素および第2要素をそれぞれ符号化する。
たとえば、図14のように、元データの文字列“aaaaaaaaaab”の第2〜10番目のアドレスの位置の一致列“aaaaaaaaaa” (9個の“a”)を、“a”+“aa”+“aaaa”+“aa”と分割すると、一致列は、“(1、1)(2、2)(4、4)(2、8)”と符号化される。
また、たとえば、図15に示されているように、元データの文字列“aaaaaaaaaab”の第2〜10番目のアドレスの位置の一致列“aaaaaaaaa”(9個の“a”)を“a”+“a”+“aa”+“aaaaaa”と分割すると、一致列は、“(1、1)(1、2)(2、3)(5、5)” と符号化される。
非一致長符号化部25は、一致列検索部22では一致列として抽出されなかった非一致列の長さを抽出し、規則2に従って、非一致列を{非一致長、非一致文字列}と表すときの、第1要素を符号化する。
非一致列符号化部26は、一致列検索部22では一致列として抽出されなかった非一致列を抽出し、規則2に従って、非一致列を{非一致長、非一致文字列}と表すときの、第2要素を符号化する。
出力バッファ部27は、一致長符号化部23、一致位置符号化部24、非一致長符号化部25、および非一致列符号化部26の結果を用いて、元データを符号化、圧縮した結果である圧縮データを生成し、必要に応じて、一時的に格納する。
図18は実施形態のデータ圧縮装置200の構成の例を示す図である。
このコンピュータ100は、Central Processing Unit(CPU)102、Read Only Memory(ROM)104、及びRandom Access Memory(RAM)106を備えている。コンピュータ100は、さらに、ハードディスク装置108、入力装置110、表示装置112、インタフェース装置114、及び記録媒体駆動装置116を備えている。なお、これらの構成要素はバスライン118を介して接続されており、CPU102の管理の下で各種のデータを相互に授受することができる。
Central Processing Unit(CPU)102は、このコンピュータ100全体の動作を制御する演算処理装置であり、コンピュータ100の制御処理部として機能する。
Read Only Memory(ROM)104は、所定の基本制御プログラムが予め記録されている読み出し専用半導体メモリである。CPU102は、この基本制御プログラムをコンピュータ100の起動時に読み出して実行することにより、このコンピュータ100の各構成要素の動作制御が可能になる。
Random Access Memory(RAM)106は、CPU102が各種の制御プログラムを実行する際に、必要に応じて作業用記憶領域として使用する、随時書き込み読み出し可能な半導体メモリである。
ハードディスク装置108は、CPU102によって実行される各種の制御プログラムや各種のデータを記憶しておく記憶装置である。CPU102は、ハードディスク装置108に記憶されている所定の制御プログラムを読み出して実行することにより、後述する各種の制御処理を行えるようになる。
入力装置110は、例えばマウス装置やキーボード装置であり、情報処理装置のユーザにより操作されると、その操作内容に対応付けられている各種情報の入力を取得し、取得した入力情報をCPU102に送付する。
表示装置512は例えば液晶ディスプレイであり、CPU102から送付される表示データに応じて各種のテキストや画像を表示する。
インタフェース装置114は、このコンピュータ100に接続される各種機器との間での各種情報の授受の管理を行う。
記録媒体駆動装置116は、可搬型記録媒体120に記録されている各種の制御プログラムやデータの読み出しを行う装置である。CPU102は、可搬型記録媒体120に記録されている所定の制御プログラムを、記録媒体駆動装置116を介して読み出して実行することによって、後述する各種の制御処理を行うようにすることもできる。なお、可搬型記録媒体120としては、例えばUSB(Universal Serial Bus)規格のコネクタが備えられているフラッシュメモリ、CD−ROM(Compact Disc Read Only Memory)、DVD−ROM(Digital Versatile Disc Read Only Memory)などがある。
このようなコンピュータ100を用いて情報処理装置を構成するには、例えば、上述の各処理部における処理をCPU102に行わせるための制御プログラムを作成する。作成された制御プログラムはハードディスク装置108若しくは可搬型記録媒体120に予め格納しておく。そして、CPU102に所定の指示を与えてこの制御プログラムを読み出させて実行させる。こうすることで、情報処理装置が備えている機能がCPU102により提供される。
図8は、実施形態におけるデータ圧縮装置20での圧縮処理の流れの例を示す図である。
また、データ圧縮装置20が図18に示されているような汎用コンピュータ100である場合には、下記の説明は、そのような処理を行う制御プログラムを定義する。すなわち、以下では、下記に説明する処理を汎用コンピュータに行わせる制御プログラムの説明でもある。
処理が開始されるとS300で一致列検索部22は、元データの文字列に、繰り返し出現する文字列である一致列が存在するかどうかを検索する。本ステップの処理が終了すると、処理はS302に進む。元データの文字列は、入力バッファ部21に格納されているものであっても良い。
S302で一致列検索部22は、一致列が見つかったかどうかを判定する。もしこの判定の結果が“YES”、すなわち、一致列が見つかった場合には、処理はS304に進む。また、もしこの判定の結果が“NO”、すなわち、一致列が見つからなかった場合には、処理はS306に進む。
S304で非一致長符号化部25と非一致列符号化部26はそれぞれ、一致が見つからなかった非一致列の長さと文字列を抽出する。そして、非一致列の長さおよび文字列に関する情報をそれぞれ、非一致長符号化部25と非一致列符号化部26内に一時的に記憶する。この情報は、S106で用いられる。本ステップの処理が終了すると、処理はS100に戻る。
S302で一致列が見つからなかった場合には、処理はS306に進む。
S306で一致列分割部28は、一致列の長さ、つまり一致長と、その一致列が幾つ前のアドレスの位置から開始されるか、つまり相対位置を検出する。そしてS306で一致列分割部28は、相対位置が一致長以上、すなわち相対位置offset≧一致長lengthとなるように一致列を分割する。
相対位置が一致長以上である、すなわち相対位置offset≧一致長lengthを満たす場合には、このステップでの処理は行われない。
S308で一致列分割部28は、分割した一致列の最初の文字のアドレスの位置の直前の文字列が非一致列かどうかを判定する。もしこの判定の結果が“YES”、すなわち、直前の文字列が非一致列である場合には、処理はS310に進む。また、もしこの判定の結果が“NO”、すなわち、直前の文字列が非一致列ではない場合には、処理はS312に進む。
S310で非一致長符号化部25と非一致列符号化部26は、S306で必要に応じて分割された一致列の直前の非一致列を符号化する。本ステップの処理が終了すると、処理はS312に進む。
S312で一致長符号化部23と一致位置符号化部24は、S306で必要に応じて分割された一致列を符号化する。本ステップの処理が終了すると、処理はS314に進む。
S314で出力バッファ27は圧縮すべき全ての元データを処理したかどうかを判定する。もしこの判定の結果が“YES”、すなわち、全ての元データを処理した場合には、圧縮処理を終了する。また、もしこの判定の結果が“NO”、すなわち、全ての元データを処理していない場合には、処理はS300に戻る。
ここで、図8のような処理によって圧縮されたデータの復元処理について図9を参照して説明する。
図9の処理は、たとえば、図18のような構成を有するコンピュータよって処理され得る。
処理が開始される前に、圧縮データがRAM106に格納されているものとする。
処理が開始されるとS400でCPU102は、現在処理しているデータが一致列であるかどうかを判定する。もしこの判定の結果が“YES”、すなわち、現在処理しているデータが一致列である場合には、処理はS402に進む。また、もしこの判定の結果が“NO”、すなわち、現在処理しているデータが一致列ではない場合には、処理はS406に進む。
S402でCPU102は、規則1に従って、一致列の圧縮データから一致長と一致列の開始位置を読み取る。本ステップの処理が終了すると、処理はS404に進む。
S404でCPU102は、一致列の開始位置から一致長分をコピーする。本ステップの処理が終了すると、処理はS410に進む。
S400で現在処理しているデータが一致列ではないと判定された場合には、S406に進む。
S406でCPU102は、規則2に従って非一致列の圧縮データから非一致長を読み取り復元する。本ステップの処理が終了すると、処理はS408に進む。
S408でCPU102は、規則2に従って非一致列の圧縮データから非一致文字列を読み取り復元する。
本ステップの処理が終了すると、処理はS410に進む。
S410でCPU102は、復元すべき全ての元データを処理したかどうかを判定する。もしこの判定の結果が“YES”、すなわち、全ての圧縮データを処理した場合には、復元処理を終了する。また、もしこの判定の結果が“NO”、すなわち、全ての圧縮データを処理していない場合には、処理はS400に戻る。
このように、図8のような処理によって圧縮されたデータの復元処理は、図4に示されている復元処理に比べると単純化されており、よって、高速に処理することができる。
<実施例>
コピー元とコピー先の重なりは、同じ1文字、2文字列、3文字列、・・・のいずれかが続けて繰返す循環文字列において発生する。LZ77方式において、一致列を検索して相対位置offset、一致長lengthが得られたとする。offset<lengthのとき、コピー元とコピー先が重なるため一致列を分割して符号化する。また、offset<lengthであれば常に分割を行うのではなく、重なりの最小距離を予めXと定め、offset<Xのときのみ分割を行うようにしてもよい。
分割の仕方には、いくつか考えられる。以下では、次のような場合について説明する。
(Ex1)P(1)、P(3)、P(7)、・・・、P(2m−1)(ただし (2m−1)<n)で分割する、
(Ex2)n=(一致長+carton−1)÷cartonとし、P(n÷2)、P(n÷4) 、P(n÷8)、・・・、P(n÷2m))(ただしn÷2m>1)で分割する、
(Ex3)重なりの最小距離X, 一致長の最小値Nを定めた上で、P(1)、P(1+2)、P(1+2+4)、・・・、P(2m−1)(ただし (2m−1)<n)で分割する、
(Ex4)一致長の最小値をNとし、循環の1セットがN以上になるように調節した上で、上記(Ex1)〜(Ex3)の分割をする。
以下では上記(Ex1)〜(Ex4)について、説明する。
図10は、実施例におけるデータ圧縮装置での圧縮処理の流れの例を示す図である。
また、データ圧縮装置20が図18に示されているような汎用コンピュータ100である場合には、下記の説明は、そのような処理を行う制御プログラムを定義する。すなわち、以下では、下記に説明する処理を汎用コンピュータに行わせる制御プログラムの説明でもある。
処理が開始されるとS500で入力バッファ部21は、現在のアドレスの位置p_curと、非一致長n_lenをリセットする。たとえば、p_cur=0、n_len=0とする。本ステップの処理が終了すると、処理はS502に進む。
次のS502で一致列検索部22は、一致列を検索する。具体的には、一致長lenと相対位置offsetを求める。本ステップの処理が終了すると、処理はS504に進む。
S504で一致列検索部22は、一致列が見つかったかどうかを判定する。もしこの判定の結果が“YES”、すなわち、一致列が見つかった場合には、処理はS506に進む。また、もしこの判定の結果が“NO”、すなわち、一致列が見つからなかった場合には、処理はS532に進む。
S506で一致列検索部22は、現在のアドレスの位置p_curと、非一致長n_lenを更新する。たとえば、現在のアドレスの位置p_curと、非一致長n_lenをそれぞれ、1だけ増加させる。
S506では、先頭位置調整処理が行われる。
図11を参照して、先頭位置調整処理について説明する。この処理では、一致長の最小値Nが定められているとする。
処理が開始されるとS600で一致列検索部22は、相対位置offsetを変数iに代入する。本ステップの処理が終了すると、処理はS602に進む。
S602で一致列検索部22は、変数iが一致長の最小値N以上であるかを判定する。もしこの判定の結果が“YES”、すなわち、変数iが一致長の最小値N以上である場合には、処理はS606に進む。また、もしこの判定の結果が“NO”、すなわち、変数iが一致長の最小値N以上ではない場合には、処理はS604に進む。
S606で一致列検索部22は、非一致長n_lenに(i−offset)の値を加え、現在のアドレスの位置p_curに(i−offset)の値を加える。さらに、一致列の一致長lenから(i−offset)の値を引く。本ステップの処理が終了すると、先頭位置調整処理は終了する。
S604で一致列検索部22は、変数iにoffsetの値を加える。
図10に戻って、S506の次のS508で一致列分割部28は、一致列分割処理を行う。
図12A、12Bを参照して、一致列分割処理について説明する。
図12Aは、上記Ex1のように、P(1)、P(3)、P(7)、・・・、P(2m−1)(ただし (2m−1)<n)で分割する場合の処理を示す図である。
処理を開始すると、S700で一致列分割部28は、分割した一致列の後尾番号e_numの値をリセットし、一致列の一致長の変数len2に一致列の一致長lenの値を代入する。本ステップの処理が終了すると、処理はS702に進む。
S702で一致列分割部28は、offset>Xまたはoffset>len2であるかを判定する。もしこの判定の結果が“YES”、すなわち、offset>Xまたはoffset>len2である場合には、処理はS704に進む。また、もしこの判定の結果が“NO”、すなわち、offset≦Xかつoffset≦len2の場合には、処理はS706に進む。
S704で一致列分割部28は、分割した一致列の一致位置A_offset[e_num]にoffsetの値を代入し、分割した一致列の一致長A_len[e_num]にlen2の値を代入する。本ステップの処理が終了すると、処理はS706に進む。
S706で一致列分割部28は、分割した一致列の一致位置A_offset[e_num]にoffsetの値を代入し、分割した一致列の一致長A_len[e_num]にlen2の値を代入する。さらに、e_numの値を更新する。たとえば、e_numの値を1だけ増やす。len2の値からoffsetの値を引き、offsetの値を更新する。offsetの値の更新は、たとえば、値を2倍にする。本ステップの処理が終了すると、処理はS702に戻る。
図12Bは、上記Ex2のように、n=(一致長+carton−1)÷相対位置とし、P(n÷2)、P(n÷4) 、P(n÷8)、・・・、P(n÷2m))(ただしn÷2m>1)で分割する場合の処理を示す図である。
処理を開始すると、S800で一致列分割部28は、一致長をlen、相対位置をoffsetとして、n=(len+carton−1)÷offsetで算出する。さらに、ダミー変数iをリセットし、i=0とする。本ステップの処理が終了すると、処理はS802に進む。
S802で一致列分割部28は、S800で算出されたnの値が1以下であるかどうかを判定する。もしこの判定の結果が“YES”、すなわち、nの値が1以下である場合には、処理はS806に進む。また、もしこの判定の結果が“NO”、すなわち、nの値が1より大きいの場合には、処理はS804に進む。
S804で一致列分割部28は、nの値を更新する。たとえば、値を半分にする。さらに、分割位置P(i)にnの値を代入し、さらにダミー変数iの値を1増やす。本ステップの処理が終了すると、処理はS802に戻る。
S806で一致列分割部28は、一致列の一致長の変数len2と、分割した一致列の後尾番号e_numの値をリセットする。len2=0、e_num=0とする。本ステップの処理が終了すると、処理はS808に進む。
S808で一致列分割部28は、ダミー変数iの値が1より小さいかどうかを判定する。もしこの判定の結果が“YES”、すなわち、ダミー変数iの値が1より小さい場合には、処理はS810に進む。また、もしこの判定の結果が“NO”、すなわち、ダミー変数iの値が1以上の場合には、処理はS812に進む。
S810で一致列分割部28は、分割した一致列の一致長A_len[e_num]に(len−len2)の値を代入する。また分割した一致列の一致位置A_offset[e_num]に(P(0)+1)×offsetの値を代入する。本ステップの処理が終了すると、一致列分割処理を終了する。
S812で一致列分割部28は、ダミー変数iの値を1減らす。また、ダミー変数tmpに分割位置P(i)と相対位置offsetの積、P(i)×offsetを代入し、このダミー変数tmpを分割した一致列の一致長A_len[e_num]と、分割した一致列の一致位置A_offset[e_num]に代入する。len2の値にtmpの値を加え、e_numの値を1増やす。本ステップの処理が終了すると、処理はS808に戻る。
図10に戻り、S510で一致列分割部28は、分割した一致列の先頭番号f_numと分割した一致列の非一致長n_len2をリセットする。f_num=0、n_len2=0とする。本ステップの処理が終了すると、S512に進む。
S512で一致列分割部28は、一致長調整処理を行う。
一致長調整処理について、図13を参照して説明する。
処理を開始するとS900で一致列分割部28は、分割した一致列の一致位置A_offset[f_num]が一致長の最小値N以上であるかどうかを判定する。もしこの判定の結果が“YES”、すなわち、分割した一致列の一致位置A_offset[f_num]が一致長の最小値N以上である場合には、処理はS904に進む。また、もしこの判定の結果が“NO”、すなわち、分割した一致列の一致位置A_offset[f_num]が一致長の最小値Nより小さい場合には、処理はS902に進む。
S902で一致列分割部28は、分割した一致列の非一致長n_lenの値にA_offset[f_num]の値を加える。また、f_numの値を1増やす。本ステップの処理が終了すると、処理はS900に戻る。
S900およびS902の処理で、先頭の分割列の調整を行う。
S904で一致列分割部28は、分割した一致列の一致長A_len[e_num−1]が一致長の最小値N以上であるか、またはe_numの値がf_numの値より小さいかどうかを判定する。もしこの判定の結果が“YES”、すなわち、分割した一致列の一致長A_len[e_num−1]が一致長の最小値N以上であるか、またはe_numの値がf_numの値より小さい場合には、一致長調整処理を終了する。また、もしこの判定の結果が“NO”、すなわち、分割した一致列の一致位置A_offset[e_num−1]が一致長の最小値Nより小さく、かつe_numの値がf_numの値以上である場合には、処理はS906に進む。
S906で一致列分割部28は、分割した一致列の非一致長n_len2の値に分割した一致列の一致長A_len[e_num−1]の値を加え、e_numの値を1減らす。
図10に戻って、S514で一致列分割部28は、非一致長n_lenが0かどうかを判定する。もしこの判定の結果が“YES”、すなわち、非一致長n_lenが0である場合には、処理はS518に進む。また、もしこの判定の結果が“NO”、すなわち、非一致長n_lenが0でない場合には、処理はS516に進む。
S516で非一致長符号化部25と非一致列符号化部26は、非一致列の符号化を行う。つまり、非一致長n_lenと、非圧縮データInBuf[(p_cur−n_len)、…、(p_cur−1)]の符号化を行う。本ステップの処理が終了すると、処理はS518に進む。
S518で一致列分割部28は、分割した一致列の先頭のアドレス番号f_numが分割した一致列の後尾のアドレス番号e_numの値より大きいかを判定する。もしこの判定の結果が“YES”、すなわち、f_num>e_numである場合には、処理はS520に進む。また、もしこの判定の結果が“NO”、すなわち、f_num≦e_numである場合には、処理はS524に進む。
S524で一致長符号化部23と一致位置符号化部24は、一致列の符号化を行う。つまり、一致列の一致長A_len[f_num]およびA_offset[f_num]の符号化を行う。本ステップの処理が終了すると、処理はS526に進む。
S526で一致長符号化部23と一致位置符号化部24は、分割した一致列の先頭のアドレス番号f_numの値を1増やす。本ステップの処理が終了すると、処理はS518に戻る。
S520で一致列分割部28は、非一致長n_lenに分割した一致列の非一致長n_len2の値を代入し、現在位置p_curに一致長lenの値を加える。本ステップの処理が終了すると、処理はS522に進む。
S522で出力バッファ27は圧縮すべき全ての元データを処理したかどうかを判定する。もしこの判定の結果が“YES”、すなわち、全ての元データを処理した場合には、S524に進む。また、もしこの判定の結果が“NO”、すなわち、全ての元データを処理していない場合には、処理はS502に戻る。
S524で一致列分割部28は、非一致長n_lenが0かどうかを判定する。もしこの判定の結果が“YES”、すなわち、非一致長n_lenが0である場合には、処理を終了する。また、もしこの判定の結果が“NO”、すなわち、非一致長n_lenが0でない場合には、処理はS526に進む。
S526で非一致長符号化部25と非一致列符号化部26は、非一致列の符号化を行う。つまり、非一致長n_lenと、非圧縮データInBuf[(p_cur−n_len)、…、(p_cur−1)]の符号化を行う。本ステップの処理が終了すると、処理は終了する。
圧縮装置20および上記の圧縮方法では、LZ77方式において、ある一致列の相対位置offsetと一致長lengthであるとき、offset<lengthのとき、コピー元とコピー先が重なるため一致列を分割して符号化する。
また、重なりの最小距離を予めXと定め、offset<Xのときのみ分割を行うようにしてもよい。
また、コピー元とコピー先の重なりは、同じ1文字、2文字列、3文字列、・・・のいずれかが続けて繰返す循環文字列において発生する。循環の1セットの長さはコピー元とコピー先の相対位置(相対距離)と一致する。初回の1セットは別符号で符号化され、2回目以降の循環において重なりが発生する。
そこで、循環の1セットの長さをcarton(カートン)とし、一致文字列の先頭からP(1)=carton、P(2)=carton×2、・・・、P(n)=carton×n(ただP(n)はlengthより小さい)の位置の全てまたはいずれかで分割することで、コピー元とコピー先が重ならないようにする。
図14に、P(1)、P(3)、P(7)、・・・、P(2m−1)(ただし (2m−1)<n)で分割する例を、図15に、n=(一致長+carton−1)÷cartonとし、P(n÷2)、P(n÷4) 、P(n÷8)、・・・、P(n÷2m))(ただしn÷2m>1)で分割する例を示した。また、一致長の最小値をNを予め定め、一致文字列を分割することで一致長がN以下となる部分は非一致列として扱ってもよい。
図16では、重なりの最小距離X, 一致長の最小値Nを定めた上で、P(1)、P(1+2)、P(1+2+4)、・・・、P(2m−1)(ただし (2m−1)<n)で分割する例において、重なりの最小距離X=8、一致長の最小値N=3の場合が示されている。この場合、一致文字列を分割することで一致長がN以下となる部分は非一致列として扱う。
また、一致長の最小値をNとしているとき、循環の1セットがN以上になるように調節した上で、上記分割を行っても良い。具体的には、相対位置offset<Nのとき、N≦offset×i(ただし、iは整数値)となる最大の「offset×i」の長さの分、一致列の先頭位置を後ろへずらしても良い。
例えば、図17には、一致長の最小値N=3として、循環の1セットがN以上になるように調整した上で、P(1)、P(1+2)、P(1+2+4)、・・・、P(2m−1)(ただし (ただし (2m−1)<n)の分割を行った例が示されている。
また、P(1)、P(2), ・・・、P(n)の全て、および図14〜17に示す分割から最も符号量が小さくなるものを選択してもよい。
<<第1実施例(Ex1)>>
図14は、P(1)、P(3)、P(7)、・・・、P(2m−1)(ただし (2m−1)<n)で分割する例を示す図である。
carton=1の場合の例として、図14には、元データが“aaaaaaaaaab”の場合が示されている。
この場合、第1番目のアドレスの位置の“a”が非一致列であり、第2〜10番目のアドレスの位置の“aaaaaaaaa”が一致列である。第11番目のアドレスの位置の文字“b”は非一致列である。第2〜10番目のアドレスの位置の一致列“aaaaaaaaa”を1文字目、3文字目、7文字目で分割する。すなわち、一致列“aaaaaaaaa”を、「“a”+“aa”+”aaaa”+残り」と分割する。
元データが“aaaaaaaaaab”の場合、圧縮データは “{1、a}(1、1)(2、2)(4、4)(2、8){1、b}”となる。
carton=2の場合の例として、図14には、元データが“ababababac”の場合が示されている。この場合、第1〜2番目のアドレスの位置の“ab”が非一致列であり、第3〜10番目のアドレスの位置の“abababa”が一致列である。第11番目のアドレスの位置の文字“c”は非一致列である。第3〜9番目のアドレスの位置の“abababa”を1カートン目、3カートン目で分割する。すなわち、一致列“abababab”を、「“ab”+“abab”+残り」と分割する。
元データが“ababababac”の場合、圧縮データは “{2、ab}、(2、2)(4、4)(3、8){1、c}”となる。
carton=3の場合の例として、図14には、元データが“abcabcabcabd”の場合が示されている。この場合、第1〜3番目のアドレスの位置の“abc”が非一致列であり、第4〜11番目のアドレスの位置の“abcabcab”が一致列である。第12番目のアドレスの位置の文字“d”は非一致列である。第4〜11番目のアドレスの位置の“abcabcab” を1カートン目で分割する。すなわち、一致列“abcabcabc”を、「“abc”+残り」と分割する。
元データが“abcabcabcabd”の場合、圧縮データは “{3、abc}(3、3)(5、6){1、d}”となる。
carton=4の場合の例として、図14には、元データが“abcdabcdabcdabce”の場合が示されている。この場合、第1〜4番目のアドレスの位置の“abcd”が非一致列であり、第5〜15番目のアドレスの位置の“abcdabcdabcd”が一致列である。第17番目のアドレスの位置の文字“e”は非一致列である。第5〜15番目のアドレスの位置の“abcdabcdabc” を1カートン目で分割する。すなわち、一致列“abcdabcdabc”を、「“abcd”+残り」と分割する。
元データが“abcdabcdabcdabcde”の場合、圧縮データは “{4、abcd}(4、4)(7、8){1、e}”となる。
carton=7の場合の例として、図14には、元データが“abcdefgabcdefgabcdefh”の場合が示されている。この場合、第1〜7番目のアドレスの位置の“abcdefg”が非一致列であり、第8〜20番目のアドレスの位置の“abcdefgabcdef”が一致列である。第21番目のアドレスの位置の文字“h”は非一致列である。第8〜20番目のアドレスの位置の“abcdefgabcdef” を1カートン目で分割する。すなわち、一致列“abcdefgabcdef”を、「“abcdefg”+残り」と分割する。
元データが“abcdefgabcdefgabcdefh”の場合、圧縮データは “{7、abcdefg}(7、7)(6、14){1、h}”となる。
carton=8の場合の例として、図14には、元データが“abcdefghabcdefghabcdefgi”の場合が示されている。この場合、第1〜8番目のアドレスの位置の“abcdefgh”が非一致列であり、第9〜24番目のアドレスの位置の“abcdefghabcdefg”が一致列である。第25番目のアドレスの位置の文字“i”は非一致列である。第9〜23番目のアドレスの位置の“abcdefghabcdefg” を1カートン目で分割する。すなわち、一致列“abcdefghabcdefg”を、「“abcdefgh”+残り」と分割する。
元データが“abcdefghabcdefghabcdefgi”の場合、圧縮データは “{8、abcdefgh}(8、8)(7、16){1、i}”となる。
<<第2実施例(Ex2)>>
図15は、n=(一致長+carton−1)÷cartonとし、(P(n÷2)、P(n÷4) 、P(n÷8)、・・・、P(n÷2m))(ただしn÷2m>1)で分割する例を示す図である。
carton=1の場合の例として、図15には、元データが“aaaaaaaaaab”の場合が示されている。
第2〜10番目のアドレスの位置の一致列“aaaaaaaaa”を分割するが、この場合n=(9+1−1)÷1=9であるので、P(4)、P(2)、P(1)で分割する。すなわち、一致列“aaaaaaaaa”を「“a”+“a”+“aa”+残り」と分割する。
元データが“aaaaaaaaaab”の場合、圧縮データは “{1、a}(1、1)(1、2)(2、3)(5、5){1、b}”となる。
carton=2の場合の例として、図15には、元データが“ababababababc”の場合が示されている。この場合、第1〜2番目のアドレスの位置の“ab”が非一致列であり、第3〜11番目のアドレスの位置の“ababababa”が一致列である。第12番目のアドレスの位置の文字“c”は非一致列である。この場合、n=(9+2−1)÷2=5であるので、P(2)、P(1)で分割する。すなわち、一致列“ababababab”を、「“ab”+“ab”+残り」と分割する。
元データが“ababababababc”の場合、圧縮データは “{2、ab}、(2、2)(2、4)(5、4){1、c}”となる。
carton=3の場合の例として、図15には、元データが“abcabcabcabd”の場合が示されている。この場合、第1〜3番目のアドレスの位置の“abc”が非一致列であり、第4〜11番目のアドレスの位置の“abcabcab”が一致列である。第12番目のアドレスの位置の文字“d”は非一致列である。この場合、n=(8+3−1)÷3=3であるので、P(1)で分割する。すなわち、一致列“abcabcab”を、「“abc”+残り」と分割する。
元データが“abcabcabcabd”の場合、圧縮データは “{3、abc}(3、3)(5、6){1、d}”となる。
carton=4の場合の例として、図15には、元データが“abcdabcdabcdabce”の場合が示されている。この場合、第1〜4番目のアドレスの位置の“abcd”が非一致列であり、第5〜15番目のアドレスの位置の“abcdabcdabc”が一致列である。第16番目のアドレスの位置の文字“e”は非一致列である。この場合、n=(11+4−1)÷4=3であるので、P(1)で分割する。すなわち、一致列“abcdabcdabc”を「“abcd”+残り」と分割する。
元データが“abcdabcdabcdabce”の場合、圧縮データは “{4、abcd}(4、4)(7、8){1、e}”となる。
carton=7の場合の例として、図15には、元データが“abcdefgabcdefgabcdefh”の場合が示されている。この場合、n=(11+7−1)÷7=2であるので、一致列“abcdefgabcdef”を、「“abcdefg”+残り」と分割する。
元データが“abcdefgabcdefgabcdefh”の場合、圧縮データは “{7、abcdefg}(7、7)(6、14){1、h}”となる。
carton=8の場合の例として、図15には、元データが“abcdefghabcdefghabcdefgi”の場合が示されている。この場合、第1〜8番目のアドレスの位置の“abcdefgh”が非一致列であり、第9〜23番目のアドレスの位置の“abcdefghabcdefg”が一致列である。第24番目のアドレスの位置の文字“i”は非一致列である。この場合、n=(15+8−1)÷8〜2であるので、一致列“abcdefghabcdefgh”を、「“abcdefgh”+残り」と分割する。
元データが“abcdefghabcdefghabcdefgi”の場合、圧縮データは “{8、abcdefgh}(8、8)(7、16){1、i}”となる。
<<第3実施例(Ex3)>>
図16は、重なりの最小距離X, 一致長の最小値Nを定めた上で、P(1)、P(1+2)、P(1+2+4)、・・・、P(2m−1)(ただし (2m−1)<n)で分割する例を示す図である。図16では、重なりの最小距離X=8、一致長の最小値N=3の場合が示されている。この場合、一致文字列を分割することで一致長がN以下となる部分は非一致列として扱う。
carton=1の場合の例として、図16には、元データが“aaaaaaaaaab”の場合が示されている。
この場合、第1番目のアドレスの位置の“a”が非一致列であり、第2〜10番目のアドレスの位置の“aaaaaaaaa”が一致列である。第11番目のアドレスの位置の文字“b”は非一致列である。第2〜10番目のアドレスの位置の一致列“aaaaaaaaa”を1文字目、3文字目、7文字目で分割するが、一致長の最小値N=3とするためには、元データ “aaaaaaaaaab”を「“aaaa”+“aaaa”+“aab”」と分割する。
よって、圧縮データは “{4、aaaa}(4、4){3、aab}”となる。
carton=2の場合の例として、図16には、元データが“abababababc”の場合が示されている。この場合、第1〜2番目のアドレスの位置の“ab”が非一致列であり、第3〜10番目のアドレスの位置の“abababab”が一致列である。第11番目のアドレスの位置の文字“c”は非一致列である。第3〜10番目のアドレスの位置の“abababab”を1カートン目、3カートン目で分割するが、一致長の最小値N=3とするためには、元データ “abababababc”を、「“abab”+“abab”+“abab”+“c”」と分割する。
よって圧縮データは、“{4、abab}(4、4)(4、8){1、c}”となる。
carton=3の場合の例として、図16には、元データが“abcabcabcabcd”の場合が示されている。この場合、第1〜3番目のアドレスの位置の“abc”が非一致列であり、第4〜12番目のアドレスの位置の“abcabcabc”が一致列である。第13番目のアドレスの位置の文字“d”は非一致列である。第4〜12番目のアドレスの位置の“abcabcabc” を1カートン目で分割するが、一致長の最小値N=3とするためには、元データ “abcabcabcabcd”を、「“abc”+“abc”+“abc”+“d”」と分割する。
よって、圧縮データは、“{3、abc}(3、3)(6、6){1、d}”となる。
carton=4の場合の例として、図16には、元データが“abcdabcdabcdabcde”の場合が示されている。この場合、第1〜4番目のアドレスの位置の“abcd”が非一致列であり、第5〜16番目のアドレスの位置の“abcdabcdabcd”が一致列である。第17番目のアドレスの位置の文字“e”は非一致列である。第5〜16番目のアドレスの位置の“abcdabcdabcd” を1カートン目で分割するが、一致長の最小値N=3とするためには、元データ“abcdabcdabcdabcde”を、「“abcd”+“abcd”+“abcdabcd”+“e”」と分割する。よって、圧縮データは “{4、abcd}(4、4)(8、8){1、e}”となる。
carton=7の場合の例として、図16には、元データが“abcdefgabcdefgabcdefh”の場合が示されている。この場合、第1〜7番目のアドレスの位置の“abcdefg”が非一致列であり、第8〜21番目のアドレスの位置の“abcdefgabcdefg”が一致列である。第22番目のアドレスの位置の文字“h”は非一致列である。第8〜21番目のアドレスの位置の“abcdefgabcdef” を1カートン目で分割するが、一致長の最小値N=3とするためには、元データ“abcdefgabcdefgabcdefgh”を、「“abcdefg”+“abcdefg”+“abcdef”+“h”」と分割する。
よって、圧縮データは “{7、abcdefg}(7、7)(6、14){1、h}”となる。
carton=8の場合の例として、図16には、元データが“abcdefghabcdefghabcdefgi”の場合が示されている。この場合、第1〜8番目のアドレスの位置の“abcdefgh”が非一致列であり、第9〜23番目のアドレスの位置の“abcdefghabcdefg”が一致列である。第24番目のアドレスの位置の文字“i”は非一致列である。この場合、carton=8は重なりの最小距離以上のため分割しない。
よって、圧縮データは “{8、abcdefgh}(15、8){1、i}”となる。
<<第4実施例(Ex4)>>
図17は、循環の1セットが一致長の最小値N=3以上になるように先頭を調整する例を示す図である。
carton=1の場合は、carton=3となるように一致列の先頭のアドレスの位置を調整する。
元データ “aaaaaaaaaab”を「“aaa”+“aaa”+“aaaa”+“b”」と分割する。
よって、圧縮データは、“{3、aaa}(3、3)(4、6){1、b}”となる。
carton=2の場合は、carton=4となるように一致列の先頭のアドレスの位置を調整する。
元データが“ababababac”の場合、「“abab”+“abab”+“aba”+“c”」と分割する。
よって、圧縮データは、“{4、abab}(4、4)(3、8){1、c}”となる。
carton=3の場合は、carton=3は一致長の最小値以上であるので、先頭位置は調整しない。
元データが“abcabcabcabd”の場合、圧縮データは、“{3、abc}(3、3)(5、6){1、d}”となる。
10、20 データ圧縮装置
11、21 入力バッファ部
12、22 一致列検索部
13、23 一致長符号化部
14、24 一致位置符号化部
15、25 非一致長符号化部
16、26 非一致位置符号化部
17、27 出力バッファ部
28 一致列分割部