以下に、本願の開示する圧縮プログラム、圧縮方法、圧縮装置および伸長プログラムの実施例を図面に基づいて詳細に説明する。なお、この実施例によりこの発明が限定されるものではない。
本願発明の実施例1を説明する前に、LZ77を利用した圧縮技術および伸長技術の参考例について説明する。
LZ77を利用した圧縮技術の参考例について説明する。まず、参考例では、圧縮対象となるファイルF1を参照し、データの出現頻度を集計する。参考例では、データの出現頻度の集計結果を基にしてハフマン木を生成する。なお、以下の参考例・本実施例では、説明の便宜上、文字列を圧縮する場合について説明しているが、圧縮対象となるものは「データ」であり、文字列に限られるものではない。すなわち、圧縮対象のデータが文字列のように文字の区切りを有していないデータ、例えば、0または1が並んだデータに対しても圧縮・伸長を行うことが出来る。
図1は、ハフマン木の参考例を示す図である。図1に示すハフマン木10は、最上位に根ノード11を有し、各節点12−1〜が枝によって接続され、各最下位に葉10−1〜10−256を有する。各節点のデータ構造は、10aに示すものとなる。基本的に、上位の節点と下位の左と右の節点への3種のポインタが格納される。下位の枝と節点が無い場合は、葉のデータが格納される。また、各葉のデータ構造は、10bに示すものとなる。例えば、葉には、葉の識別子と、予備情報と、文字コードまたは最長一致文字列の長さとが格納される。各葉は、葉に格納された文字コードの出現頻度の順に並んでおり、出現頻度の高い文字コードに対して、短い圧縮データが割り当てられる。参考例のハフマン木は256個の葉を有する。なお、参考例・実施例では、説明の便宜上、圧縮対象と文字列としているため、葉には、葉の識別子と、予備情報と、文字コードまたは最長一致文字列の長さとが格納されているが、圧縮対象が「データ」である場合には、文字コードの代わりに、伸長後のデータが格納される。
図2は、LZ77を利用した圧縮処理の参考例を説明する図である。図1に示したハフマン木を生成した後に、図2に示す圧縮処理を実行する。まず、記憶領域A1、記憶領域A2および記憶領域A3が例えばメモリ内に確保される。図2に示すファイルF1内のコンテンツ部分のデータは、記憶領域A1にリードされる。記憶領域A1は、例えば符号化部などと呼ばれる。ファイルF1は、「he・・・1st horse・・・2nd horse・・・3rd horse・・・」というデータが含まれる(「・・・」は不特定な文字列である)。なお、図2の「horse」に示す三角、マル、四角の記号は、説明の便宜上、視覚的に各「horse」を区別するためのものであり、実際のファイルF1には含まれない。
記憶領域A1にリードされたデータに基づいて、圧縮データの生成処理が行なわれる。また、圧縮データの生成処理が行なわれたデータは、記憶領域A1から記憶領域A2にコピーされる。記憶領域A2は、例えば参照部と呼ばれる。圧縮データは、記憶領域A1にリードされたデータと記憶領域A2内のデータとの照合処理の結果に応じて生成される。生成された圧縮データは順次記憶領域A3に格納され、記憶領域A3に格納された圧縮データに基づいて圧縮ファイルF2が生成される。また、図2において、記憶領域A1およびA2内のデータは模式的に示されている。
図2に示される「1st horse・・・」の「h」以降が処理対象のデータである場合を例に圧縮データd1の生成を説明する。まず、記憶領域A2内で「horse・・・」の最長一致データが探索される(図2に示す「照合」)。図1の例では「he・・・1st」が存在するので、「h」が記憶領域A2内で処理対象データと最も長く一致するデータの部分(最長一致文字列)となる。参考例では、最長一致文字列のデータ量が3バイト未満の場合には、1バイト毎の文字と、ハフマン木10とを比較して、それぞれの文字のハフマン符号を特定し、圧縮データd1が生成される。圧縮データd1には、ハフマン符号に加えて、文字をハフマン符号化したことを示す識別子「0」が含まれる。
図2に示される「2nd horse・・・」の「h」以降が処理対象のデータである場合を例に圧縮データd2の生成を説明する。まず、記憶領域A2内で「horse・・・」の最長一致データが探索される(図1に示す「照合」)。図1の例では、「1st horse・・・」が記憶領域A2に存在するので、例えば、処理対象のデータの「horse」と記憶領域A2内の「1st horse・・・」の「horse」とが一致する。例えば、記憶領域A2内の一致データ「horse」が、最長一致文字列となる。最長一致文字列のデータ量が3バイト以上の場合には、最長一致文字列の記憶領域A2内での位置と、最長一致文字列のデータ長に基づき圧縮データd2が生成される。例えば、「horse」の位置と、「horse」の長さとが、圧縮データd2に格納される。なお、「horse」の長さの情報は、ハフマン木10に基づき圧縮される。圧縮データd2には、最長一致文字列の位置および長さに基づく圧縮データである旨を示す識別子「1」が含まれる。
図2に示される「3rd horse・・・」の「h」以降が処理対象のデータである場合を例に圧縮データd3の生成を説明する。まず、記憶領域A2内で「horse・・・」の最長一致データが探索される(図1に示す「照合」)。図2の例では、「1st horse・・・2nd horse」が記憶領域A2に存在するので、例えば、処理対象のデータの「horse」と記憶領域A2内の「1st horse」および「2nd horse」の「horse」とが一致する。例えば、記憶領域A2内の「1st horse」または「2nd horse」のいずれか「horse」が最長一致文字列となる。最長一致文字列のデータ量が3バイト以上の場合には、最長一致文字列の記憶領域A2内での位置と、最長一致文字列のデータ長に基づき圧縮データd3が生成される。例えば、「horse」の位置と、「horse」の長さとが、圧縮データd3格納される。なお、「horse」の長さの情報は、ハフマン木10に基づき圧縮される。圧縮データd3には、最長一致文字列に基づく圧縮データである旨を示す識別子「1」が含まれる。
図3は、LZ77を利用した伸長処理の参考例を説明する図である。伸張処理においては、圧縮ファイルF2内の圧縮データをメモリ(記憶領域B1)にロードし、ロードされた圧縮データの識別子に応じて伸長データの生成処理を行なう。図3の「*」は圧縮されたデータであることを示す。記憶領域B1は、例えば符号化部などと呼ばれる。最長一致文字列に基づく圧縮データでない旨を示す識別子「0」を含む圧縮データ(図2における圧縮データd1)を読み出した場合には、圧縮データのハフマン符号とハフマン木10とを比較し、圧縮データに対応するハフマン木10の葉を特定し、特定した葉に格納された文字コードを、伸長データして生成する。生成された伸長データは、記憶領域B2および記憶領域B3の双方に格納される。記憶領域B2は、例えば参照部などと呼ばれる。
一方、最長一致文字列に基づく圧縮データである旨を示す識別子「1」を含む圧縮データ(図2における圧縮データd2および圧縮データd3など)を読み出した場合には、圧縮データに示される記憶領域B2内のデータが伸長データとなる。圧縮データには、伸長データの位置と、伸長データの長さが格納されている。また、伸長データの長さは、ハフマン木10に基づいてハフマン符号化されている。このため、圧縮データに格納されたハフマン符号と、ハフマン木とを比較して、対応するハフマン木10の葉を特定し、伸長データの長さを得る。
例えば、圧縮データd2には、識別子「1」と、「horse」の位置と、「horse」の長さが格納されているが、このうち、「horse」の長さの情報は、ハフマン木10によってハフマン符号化されている。このため、圧縮された「horse」の長さのハフマン符号とハフマン木10とを比較して、葉を特定する。特定した葉には、復号後の「horse」の長さの情報が格納されている。そして、記憶領域B2の先頭位置からの位置および長さに対応する記憶領域B2内のデータ「horse」を伸長データとして生成する。生成された伸長データは、記憶領域B2および記憶領域B3の双方に格納される。
なお、上記の例では、説明の便宜上、文字列を用いて最長一致文字列検索を行う場合について説明したが、圧縮対象が「データ」の場合には、記憶領域B1に格納されたデータと、記憶領域B2に格納されたデータとの間で、最長一致文字列の検索が行われる。そして、一致するデータのうち、最長のデータが最長一致文字列として検出される。この最長一致文字列は、0または1が連続するデータとなる。
図4は、情報処理装置の構成の参考を示す機能ブロック図である。図4に示すように、この情報処理装置100は、圧縮部100aと、伸長部100bと、記憶部100cとを有する。圧縮部100aは、図2に示した圧縮処理を実行する処理部である。伸長部100bは、図3に示した伸長処理を実行する処理部である。記憶部100cは、圧縮対象のファイルF1、圧縮処理により得られる圧縮ファイルF2、ファイルF2を伸長して得られるファイルF3などを媒介する。
図5は、圧縮部の構成の参考例を示す機能ブロック図である。図5に示すように、圧縮部100aは、第1段階処理部120aと第2段階処理部120bとを有する。第1段階処理部120aは、参照部文字リード部101、文字頻度集計部102、頻度表生成部103、ハフマン木生成部104を有する。第2段階処理部120bは、ファイルリード部105、最長一致文字列検索部106、第1符号化部107、第2符号化部108、識別ビット生成部109、参照部更新部110、ファイルライト部111を有する。
第1段階処理部110aは、文字コードの出現頻度を集計し、ハフマン木を作成する処理部である。第1段階処理部110aに含まれる各部について説明する。
参照部文字リード部101は、所定の記憶領域に圧縮対象となるファイルF1のコンテンツ部分を読み出す処理部である。ここでは、所定の記憶領域を記憶領域A4とする。例えば、記憶領域A4は、記憶部100cに存在するものとする。参照部文字リード部101は、記憶領域A4に読み出したファイルF1に対する集計処理が完了する度に、新たなファイルF1のコンテンツ部分を読み出して、記憶領域の情報を更新する。
文字頻度集計部102は、参照部文字リード部101によって記憶領域A4に読み出されたコンテンツを参照し、データの出現頻度を集計する処理部である。文字頻度集計部102は、集計結果を頻度表生成部103に出力する。文字頻度集計部102は、記憶領域A4の情報が更新される度に、データの出現回数を計数する。例えば、文字頻度集計部102は、全てのデータの出現回数と、各データの出現回数とを基にして、データの出現頻度を集計する。ここでは説明の便宜上、文字コードを用いて説明する。
頻度表生成部103は、文字頻度集計部102から取得する各データの出現頻度の集計結果を基にして、頻度表を生成する処理部である。図6は、頻度表のデータ構造の参考例を示す図である。図6に示すように、この頻度表20は、文字コード、または、最長一致データの長さに関する識別番号と、その出現頻度とを対応付ける。頻度表20は、256のレコードを有する。頻度表生成部103は、頻度表20の情報を、ハフマン木生成部104に出力する。
ハフマン木生成部104は、頻度表20を基にしてハフマン木を生成する処理部である。ハフマン木生成部104は、256個の葉の構造体を作成し、各葉の構造体に「文字コード(データ)」と、該文字コード(データ)の「出現頻度」を割り当てる。なお、ハフマン木生成部104は、識別番号と、データとの対応関係を示すテーブルを保持しているものとする。
ハフマン木生成部104は、葉の構造体をその文字コードの出現頻度の順にソートし、出現頻度に応じて、2分木の「枝」をくみ上げ、上位に向かって、2分木の枝をくみ上げていくことで、ハフマン木を生成する。例えば、ハフマン木は、図1に示したハフマン木10に対応する。ハフマン木生成部104は、ハフマン木10の各葉に、葉の識別子と、文字コード(データ)または最長一致文字列の長さをそれぞれ格納する。また、上位へのポインタ、下位の左と右へのポインタに対応する節点のアドレスを格納する。
第2段階処理部120bは、図2で説明したように、ファイルF1を圧縮する処理部である。第2段階処理部120bに含まれる各部の処理について説明する。
ファイルリード部105は、ファイルF1内のコンテンツ部分のデータを、符号化部に対応する記憶領域A1に読み出す処理部である。ファイルリード部105は、記憶領域A1に格納されたデータに対する処理が終了し、記憶領域A1のデータが参照部である記憶領域A2に移行し、圧縮符号が格納された記憶領域A3のデータを圧縮ファイルF2へ書き込んだ後に、新たなデータをファイルF1から読み出し、記憶領域A1に格納されたデータを更新する。
最長一致文字検索部106は、参照部となる記憶領域A2に格納されたデータと、記憶領域A1に格納されたデータとを比較して、最長一致文字列を検索する処理部である。最長一致文字列を検索する処理は、図2に示した処理と同様である。最長一致文字探索部106は、最長一致文字列の情報を、第1符号部107、第2符号部108、識別ビット生成部109に出力する。
第1符号化部107は、最長一致文字列のデータ量が3バイト未満の場合に処理を行う。第1符号化部107は、最長一致文字列のデータ量が3バイト未満の場合に、それぞれ、1バイトの文字コード、または、データの2進数表現と、ハフマン木10とを比較して、ハフマン符号を特定する。第1符号化部107は、ハフマン符号と、識別ビット生成部109から取得する識別ビットとを合わせた圧縮データを、記憶領域A3に格納し、ファイルライト部111に出力する。
第2符号化部108は、最長一致文字列のデータ量が3バイト以上の場合に処理を行う。第2符号化部108は、最長一致文字列のデータ量が3バイト以上の場合に、最長一致文字列の記憶領域A2での先頭からの位置と、最長一致文字列の一致長を特定する。第2符号化部108は、最長一致文字列の一致長とハフマン木10とを比較して、一致長のハフマン符号を特定する。第2符号化部108は、最長一致文字列の位置と、一致長のハフマン符号と、識別ビットとを合わせた圧縮データを、記憶領域A3に格納し、ファイルライト部111に出力する。
識別ビット生成部109は、最長一致文字列のデータ量に基づいて、識別ビット「0」または識別ビット「1」を出力する処理部である。具体的に、識別ビット生成部109は、最長一致文字列のデータ量が3バイト未満である場合には、識別ビット「0」を出力する。これに対して、識別ビット生成部109は、最長一致文字列のデータ量が3バイト以上である場合には、識別ビット「1」を出力する。
参照部更新部110は、記憶領域A1と記憶領域A2との照合が完了した場合に、記憶領域A1に格納されたデータを、記憶領域A2に格納する処理部である。
ファイルライト部111は、最長一致文字列のデータ量が3バイト未満の場合に、識別ビット「0」と、第1符号化部107から出力されるハフマン符号とを合わせた圧縮データを、記憶領域A3に書き込む。また、ファイルライト部111は、最長一致データのデータ量が3バイト以上の場合に、識別ビット「1」と、第2符号化部108から出力される最長一致データの位置およびデータ長とを合わせた圧縮データを、記憶領域A3に書き込む。
また、ファイルライト部111は、記憶領域A1に対する処理が終了すると、記憶領域A3のデータを圧縮ファイルF2に書き込む。なお、頻度表の作成が完了後に、ファイルライト部111は、頻度表生成部103から頻度表の情報を取得し、取得した頻度表の情報を、ヘッダ情報として、圧縮ファイルF2に付加する。
次に伸長部100bの構成の一例について説明する。図7は、伸長部の構成の参考例を示す機能ブロック図である。図7に示すように、伸長部100bは、第1段階処理部130aと第2段階処理部130bとを有する。第1段階処理部130aは、頻度表リード部121と、ハフマン木生成部122とを有する。第2段階処理部130bは、ファイルリード部123と、圧縮符号識別部124と、第1伸長部125と、第2伸長部126と、参照部更新部127と、ファイルライト部128とを有する。
第1段階処理部130aは、圧縮ファイルF2のヘッダ情報に含まれる頻度表を基にして、ハフマン木を生成する処理部である。第1段階処理部130aに含まれる各処理部について説明する。
頻度表リード部121は、頻度表の情報を読み出して、ハフマン木生成部122に出力する処理部である。例えば、頻度表リード部121が読み出す頻度表の情報は、図5の頻度表生成部103によって生成された頻度表の情報を取得する。
ハフマン木生成部122は、頻度表を基にしてハフマン木を生成する処理部である。ハフマン木生成部122がハフマン木を生成する処理は、図4のハフマン木生成部104と同様である。
第2段階処理部130bは、図3で説明したように、圧縮ファイルF2を伸長する処理部である。第2段階処理部130bに含まれる各部の処理について説明する。
ファイルリード部123は、圧縮ファイルF2内の圧縮データを記憶領域B1に読み出す処理部である。ファイルリード部123は、記憶領域B1に格納された圧縮データに対する処理が終了した場合に、新たな圧縮データを圧縮ファイルF2から読み出し、記憶領域B1に格納された圧縮データを更新する。
圧縮符号識別部124は、記憶領域B1の圧縮データから、識別子を読み出し、識別子が「0」であるのか「1」であるのかを判定する処理部である。圧縮符号識別124は、判定結果を、第1伸長部125および第2伸長部126に出力する。
第1伸長部125は、圧縮データの識別子が「0」である場合に処理を行う。第1伸長部125は、識別子が「0」である場合に、圧縮データの識別子以降のデータ列と、ハフマン木10とを比較して、ハフマン木10を辿り、到達した葉に含まれるデータを、伸長データとして復号する処理部である。第1伸長部125は、伸長データを、参照部である記憶領域B2、および記憶領域B3に格納し、参照部更新部127およびファイルライト部128に出力する。
第2伸長部126は、圧縮データの識別子が「1」である場合に処理を行う。第2伸長部126は、識別子が「1」である場合には、伸長データは、参照部である記憶領域B2内のデータが伸長データとなるため、記憶領域B2から伸長データを取り出す。
第2伸長部126は、伸長データを取り出すべく、最長一致文字列の格納された記憶領域B2の先頭からの位置と、最長一致文字列の長さを特定する。位置の情報は、圧縮データの識別子「1」以降の固定長(16bit)の情報に対応する。また、長さの情報は、位置の情報以降の固定長(8bit)の情報に対応する。また、長さの情報は、ハフマン符号化されているため、第2伸長部126は、長さのハフマン符号と、ハフマン木10とを比較して、ハフマン木10を辿り、到達した葉に含まれる長さの情報を得る。
第2伸長部126は、位置と長さに対応するデータを参照部である記憶領域B2から取り出し、取り出したデータを伸長データとする。第2伸長部125は、伸長データを、参照部である記憶領域B2、および記憶領域B3に格納し、参照部更新部127およびファイルライト部128に出力する。
参照部更新部127は、第1伸長部125または第2伸長部126から伸長データを取得した場合に、伸長データによって、記憶領域B2を更新する処理部である。
ファイルライト部128は、第1伸長部125または第2伸長部126から伸長データを取得した場合に、伸長データを、記憶領域B3に格納し、ファイルF3に書き込む処理部である。
次に、参考例の問題について説明する。図8は、参考例の問題を説明するための図である。図8の縦軸は、出現頻度を示し、横軸は、データに割り当てられる圧縮符号の符号長を示す。参考例では、出現頻度の大きいデータに関しては、短い圧縮符号が割り当てられ、反対に、出現頻度の小さいデータに関しては、長い圧縮符号が割り当てられるが、出現頻度に限らず、伸長方法を区別するための1ビットの識別子が付与される。例えば、5bに含まれるような出現頻度の少ないデータに関しては、圧縮データ長に占める識別子の割合が「a2/A2」と小さいため、圧縮率に余り影響を与えない。しかし、5aに含まれるような出現頻度の大きい文字に関しては、圧縮データ長に占める識別子の割合「a1/A1」が大きく、また、出現頻度が大きいため、合計すると圧縮データ長が長くなってしまい、圧縮率の低下を招く。
次に、本実施例に係る情報処理装置の圧縮処理について説明する。まず、第1段階処理として、情報処理装置は、圧縮対象となるファイルF1をリードし、データの出現頻度を集計し、拡張ハフマン木を生成する。そして、第2段階処理として、ファイルF1をリードし、最長一致文字列検索を行い、その結果に応じて符号化を行い、圧縮ファイルF2をライトする。なお、第1段階処理において、情報処理装置は、図2に示した最長一致文字列検索部106と同様の処理を行って、ファイルF1に対して最長一致文字列検索を実行し、各最長一致文字列の位置を特定する。そして、情報処理装置は、位置を0の連続数に変換し、0の連続数の出現頻度を集計する。また、1バイト単位に文字、またはデータの出現頻度を集計する。
位置を0の連続数に変換する処理の一例について説明する。情報処理装置は、位置を16ビット長の2進数に変換し、先頭ビットから0の連続する数を計数したものを、0の連続数とする。例えば、位置が「26(10)」を、16ビットの2進数で表すと「0000000000011010」となる。このため、位置「26」に対する0の連続数は「11」となる。
情報処理装置は、データの出現頻度と、0の連続数の出現頻度を基にして、拡張ハフマン木30を生成する。図9は、拡張ハフマン木の一例を示す図である。拡張ハフマン木30は、ハフマン木10と比較して、葉の構造体が異なり、葉の数も16個多い272個となる。
図9に示す拡張ハフマン木30は、最上位に根ノード31を有し、各節点32−1〜が枝によって接続され、各最下位に葉30−1〜30−272を有する。各節点のデータ構造は、30aに示すものとなる。基本的に、上位の節点と下位の左と右の節点への3種のポインタが格納される。下位の枝と節点が無い場合には、葉のデータが格納される。また、各葉のデータ構造は、30bに示すものとなる。葉には、葉の識別子と、予備情報と、識別情報と、識別情報に応じた情報とが格納される。例えば、識別情報が「0」の場合には、識別情報に応じた情報は、文字コード(データ)または最長一致文字列の長さの情報となる。識別情報が「1」の場合には、識別情報に応じた情報は「0の連続数」となる。
図10は、本実施例1に係る圧縮処理を説明する図である。図9に示した拡張ハフマン木を生成した後に、図10に示す圧縮処理を実行する。情報処理装置は、記憶領域A1、記憶領域A2および記憶領域A3を記憶部に確保する。記憶領域A1は、例えば符号化部などと呼ばれる。例えば、ファイルF1は、「he・・・1st horse・・・2nd horse・・・3rd horse・・・」というデータが含まれる。
情報処理装置は、記憶領域A1にデータをリードし、圧縮データを生成する。情報処理装置は、圧縮データの生成処理を行ったデータを、記憶領域A1から記憶領域A2にコピーする。記憶領域A2は、例えば参照部などと呼ばれる。圧縮データは、記憶領域A1にリードされたデータと記憶領域A2内のデータとの照合処理の結果に応じて生成される。情報処理装置は、圧縮データを順次記憶領域A3に格納し、記憶領域A3に格納された圧縮データに基づいて圧縮ファイルF2が生成される。特に、本実施例に係る圧縮部200aは、圧縮部100aと異なり、各圧縮データに識別子「0」または「1」を付与しないことを特徴とする。
図10において、記憶領域A1に「horse・・・」が格納され、記憶領域A2に「he・・・1st」に格納されている場合の処理の一例について説明する。情報処理装置は、記憶領域A1のデータと記憶領域A2のデータとを比較して、最長一致文字列を検索する。例えば、「h」が、記憶領域A2内で処理対象のデータと最も長く一致する文字、またはデータであるとすると、情報処理装置は、「h」を1バイトの文字、またはデータとして特定する。
情報処理装置は、例えば「h」のように最長一致文字列が3バイト未満の場合には、下記の処理を実行する。図10に示すように、情報処理装置は、1バイトの文字「h」と、拡張ハフマン木30とを比較して、文字「h」のデータのハフマン符号を特定し、圧縮データd1を生成し、記憶領域A3に格納する。なお、圧縮データd1には、識別子は含まれない。
図10において、記憶領域A1に「horse・・・」が格納され、記憶領域A2に「・・・1st horse・・・2nd」に格納されている場合の処理の一例について説明する。情報処理装置は、記憶領域A1のデータと記憶領域A2のデータとを比較して、最長一致文字列を検索する。例えば、「horse」が、記憶領域A2内で処理対象のデータと最も長く一致するデータであるとすると、情報処理装置は、「horse」を最長一致文字列として特定する。
情報処理装置は、例えば「horse」のように最長一致文字列が3バイト以上である場合には、下記の処理を実行する。図10に示すように、情報処理装置は、最長一致文字列の記憶領域A2内での位置と、最長一致文字列のデータ長を特定する。情報処理装置は、最長一致文字列の位置に対応する0の連続数と、拡張ハフマン木30とを比較して、0の連続数をハフマン符号化する。また、情報処理装置は、最長一致文字列の長さと、拡張ハフマン木30とを比較して、長さをハフマン符号化する。情報処理装置は、0の連続数のハフマン符号と、長さのハフマン符号とを合わせて圧縮データd2を生成し、記憶領域A3に格納する。なお、圧縮データd2には、識別子は含まれない。
図10において、記憶領域A1に「horse・・・」が格納され、記憶領域A2に「・・・1st horse・・・2nd horse・・・3rd」に格納されている場合の処理の一例について説明する。情報処理装置は、記憶領域A1のデータと記憶領域A2のデータとを比較して、最長一致文字列を検索する。例えば、「horse」が、記憶領域A2内で処理対象のデータと最も長く一致するデータであるとすると、情報処理装置は、「horse」を最長一致文字列として特定する。
情報処理装置は、例えば「horse」のように最長一致文字列が3バイト以上である場合には、下記の処理を実行する。図10に示すように、情報処理装置は、最長一致文字列の記憶領域A2内での位置と、最長一致文字列のデータ長を特定する。情報処理装置は、最長一致文字列の位置に対応する0の連続数と、拡張ハフマン木30とを比較して、0の連続数をハフマン符号化する。また、情報処理装置は、最長一致文字列の長さと、拡張ハフマン木30とを比較して、長さをハフマン符号化する。情報処理装置は、0の連続数のハフマン符号と、長さのハフマン符号とを合わせて圧縮データd3を生成し、記憶領域A3に格納する。なお、圧縮データd3には、識別子は含まれない。
図11は、本実施例1に係る伸長処理を説明する図である。まず、情報処理装置は、記憶領域B1、記憶領域B2および記憶領域B3を記憶部に確保する。情報処理装置は、圧縮ファイルF2内の圧縮データを記憶領域B1にロードする。また、伸長部200bは、圧縮データと拡張ハフマン木30とを比較して、葉を特定し、特定した葉に含まれる識別情報が「0」であるか「1」であるかを判定する。
情報処理装置は、識別情報が「0」である場合には、特定した葉に含まれるデータを、圧縮データに対応する伸長データとして特定する。例えば、識別情報が「0」であり、葉に「h」が含まれている場合には、圧縮データに対応する伸長データが「h」となる。情報処理装置は、伸長データ「h」を、記憶領域B2および記憶領域B3の双方に格納する。
情報処理装置は、識別情報が「1」である場合には、特定した葉に含まれる0の連続を基にして、最長一致文字列の位置を特定する。情報処理装置は、最長一致文字の位置を特定した後に、圧縮データの続きと、拡張ハフマン木30とを比較して、葉を特定し、特定した葉に含まれる最長一致文字の長さを特定する。情報処理装置は、記憶領域B2を参照し、最長一致文字列の位置および長さに対応するデータ「horse」を記憶領域B2から取得する。この取得したデータ「horse」が、圧縮データに対応する伸長データとなる。情報処理装置は、伸長データ「horse」を、記憶領域B2および記憶領域B3の双方に媒介する。
図12は、本実施例1に係る情報処理装置の構成を示す図である。図12に示すように、この情報処理装置200は、圧縮部200aと伸長部200bと、記憶部200cとを有する。圧縮部200aは、図10に示した圧縮処理を実行する処理部である。伸長部200bは、図11に示した伸長処理を実行する処理部である。記憶部200cは、圧縮対象のファイルF1、圧縮処理により得られる圧縮ファイルF2、ファイルF2を伸長して得られるファイルF3などを格納する。
図13は、本実施例1に係る圧縮部の構成を示す機能ブロック図である。図13に示すように、圧縮部200aは、第1段階処理部220aと、第2段階処理部220bとを有する。第1段階処理部220aは、参照部文字リード部201、文字頻度集計部202と、最長一致文字列検索部203と、頻度表生成部204と、拡張ハフマン木生成部205を有する。第2段階処理部220bは、ファイルリード部206と、最長一致文字列検索部207と、第1符号化部208と、第2符号化部209と、参照部更新部210と、ファイルライト部211とを有する。
参照部文字リード部201は、所定の記憶領域に圧縮対象となるファイルF1のコンテンツ部分を読み出す処理部である。例えば、参照部文字リード部201は、記憶領域A1に圧縮対象となるファイルF1のコンテンツ部分を読み出す。そして、参照部文字リード部201は、後述の最長一致文字列検索部203による最長一致データの検索が完了した後に、記憶領域A1に格納されたデータを記憶領域A2にコピーし、新たなデータをファイルF1から読み出して、記憶領域A1に格納する。
また、参照部文字リード部201は、例えば、記憶領域A4に、圧縮対象となるファイルF1のコンテンツ部分を読み出す。そして、参照部文字リード部201は、後述の文字頻度集計部202の文字集計が完了した後に、ファイルF1の続きのコンテンツ部分を記憶領域A4に格納する。
文字頻度集計部202は、例えば、記憶領域A4に格納されたデータを参照し、各データの出現頻度を集計する処理部である。文字頻度集計部202は、各データの出現頻度の情報を頻度表生成部204に出力する。文字頻度集計部202は、記憶領域A4のデータが更新される度に、データの出現回数を計数する。例えば、文字頻度集計部202は、全てのデータの出現回数と、各データの出現回数とを基にして、データの出現頻度を集計する。
最長一致文字列検索部203は、参照部となる記憶領域A2に格納されたデータと、符号化部となる記憶領域A1に格納されたデータとを比較して、最長一致文字列を検索する処理部である。最長一致文字列を検索する処理は、図5に示した最長一致文字列検索部106と同様である。
また、最長一致文字列検索部203は、最長一致文字列の位置を、0の連続数に変換する。具体的には、最長一致文字列検索部203は、位置を16ビット長の2進数に変換し、先頭から0が連続する数を計数したものを、0の連続するとして算出する。例えば、位置が「26(10)」を、16ビットの2進数で表すと「0000000000011010」となる。このため、位置「26」に対する0の連続数は「11」となる。
最長一致文字列検索部203は、記憶領域A1のデータが更新される度に、最長一致文字列の位置の0の連続数を算出し、各0の連続数の出現頻度を算出する。最長一致文字列検索部203は、各0の連続数の出現頻度の情報を頻度表生成部204に出力する。
頻度表生成部204は、各データの出現頻度と、0の連続数の出現頻度とを基にして、拡張した頻度表を生成する処理部である。頻度表生成部204は、拡張した頻度表の情報を、拡張ハフマン木生成部205に出力する。図14は、拡張した頻度表のデータ構造の一例を示す図である。図14に示すように、この拡張した頻度表40は、文字コード(データ)/長さと出現頻度とを対応付ける。また、0の連続数と出現頻度とを対応付ける。文字コード(データ)/長さと出現頻度とを対応付けたレコードの数は、256である。0の連続数と出現頻度とを対応付けたレコードの数は16である。文字コード(データ)/長さの番号は、所定の文字コードに対応する番号あるいは長さに対応する。
頻度表生成部204は、頻度表40の1段目〜256段目までのレコードについては、文字頻度集計部202から取得する各データの出現頻度の情報を格納する。頻度表生成部204は、257段目〜272段目までのレコードについては、最長一致文字列検索部203から取得する0の連続数の出現頻度の情報を格納する。
拡張ハフマン木生成部205は、拡張した頻度表40を基にして、拡張したハフマン木30を生成する処理部である。拡張ハフマン木生成部205のデータ構造は、図9に示した拡張ハフマン木30に対応する。
拡張ハフマン木生成部205は、葉の識別子と、予備情報と、識別情報「0」と、文字または最長一致文字列の長さとを対応付けた葉の構造体を256個生成する。また、拡張ハフマン木生成部205は、葉の識別子と、予備情報と、識別情報「1」と、0の連続数とを対応付けた葉の構造体を16個生成する。また、拡張ハフマン木生成部205は、葉の構造体に含まれる文字コード(データ)または0の連続数と、頻度表40とを比較して、各葉の構造体の出現頻度を特定する。
拡張ハフマン木生成部205は、葉の構造体を文字コード、または、0の連続数の出現頻度の順にソートし、出現頻度に応じて、2分木の「枝」をくみ上げ、上位に向かって、2分木の枝をくみ上げていくことで、ハフマン木を生成する。
第2段階処理部220bは、図10で説明したように、ファイルF1を圧縮する処理部である。第2段階処理部220bに含まれる各部の処理について説明する。
ファイルリード部206は、ファイルF1内のコンテンツ部分のデータを、符号化部に対応する記憶領域A1に読み出す処理部である。ファイルリード部206は、記憶領域A1に格納されたデータに対する処理が終了し、記憶領域A1のデータが参照部A2に移行し、圧縮符号が格納された記憶領域A3のデータをF2へ書き込んだ後に、新たなデータをファイルF1から読み出し、記憶領域A1に格納されたデータを更新する。
最長一致文字検索部207は、参照部となる記憶領域A2に格納された圧縮データと、記憶領域A1に格納されたデータとを比較して、最長一致文字列を検索する処理部である。最長一致文字列を検索する処理は、図10に示した処理と同様である。最長一致文字探索部207は、最長一致文字列の情報を、第1符号部208、第2符号部209に出力する。
第1符号化部208は、最長一致文字列のデータ量が3バイト未満の場合に処理を行う。第1符号化部208は、最長一致文字列のデータ量が3バイト未満の場合に、それぞれの1バイトの文字コード、またはデータの2進数表現と、拡張ハフマン木30とを比較して、ハフマン符号を特定する。第1符号化部208は、ハフマン符号を記憶領域A3に格納し、ファイルライト部211に出力する。このハフマン符号そのものが、圧縮データとなる。
図15は、圧縮部の第2符号化部の処理を説明するための図(1)である。第2符号化部209は、最長一致文字列のデータ量が3バイト以上の場合に処理を行う。図15に示すように、記憶領域A1に「horse・・・」が格納され、記憶領域A2に「・・・1st horse・・・2nd」が格納されており、最長一致文字列を「horse」とする。
第2符号化部308は、最長一致文字列のデータ量が3バイト以上の場合に、最長一致文字列の記憶領域A2での先頭からの位置と、最長一致文字列の一致長を特定する。図15に示す例では、最長一致文字列の位置は「X1」となり、最長一致文字列の長さは「Y1」となる。
第2符号化部209は、最長一致文字列の位置「X1」を16ビット長の2進数で表した場合における「0の連続数」と、「1以降のビット列」とを特定する。第2符号化部209は、「0の連続数」と、拡張ハフマン木30とを比較して、「0の連続数」のハフマン符号を求める。また、第2符号化部209は、最長一致文字列の長さ「Y1」と、拡張ハフマン木30とを比較して、最長一致文字列の長さ「Y1」のハフマン符号を求める。
第2符号化部209は、最長一致文字列の位置の「0の連続数」のハフマン符号と、最長一致文字列の位置の「1以降のビット列」と、最長一致文字列の「長さ」のハフマン符号を組み合わせて、圧縮データd2を生成する。第2符号化処理部209は、圧縮データd2を、記憶領域A3に格納し、ファイルライト部211に出力する。
参照部更新部210は、記憶領域A1と記憶領域A2との照合が完了した場合に、記憶領域A1に格納されたデータを、記憶領域A2に格納する処理部である。
ファイルライト部211は、最長一致文字列のデータ量が3バイト未満の場合に、第1符号化部208から出力される圧縮データを、記憶領域A3に書き込む。また、ファイルライト部211は、最長一致データのデータ量が3バイト以上の場合に、第2符号化部109から出力される圧縮データを、記憶領域A3に書き込む。
また、ファイルライト部211は、記憶領域A1に対する処理が終了すると、記憶領域A3のデータを圧縮ファイルF2に書き込む。なお、ファイルライト部211は、第1段階処理において、頻度表の作成の完了後に、頻度表生成部204から頻度表の情報を取得し、取得した頻度表の情報を、ヘッダ情報として、圧縮ファイルF2に付加する。
図16は、本実施例に係る伸長部の構成を示す機能ブロック図である。図16に示すように、この伸長部200bは、第1処理部230aと、第2段階処理部230bとを有する。第1段階処理部230aは、頻度表リード部221と、拡張ハフマン木生成部222とを有する。
第1段階処理部230aは、圧縮ファイルF2のヘッダ情報に含まれる拡張された頻度表40の情報を基にして、拡張ハフマン木30を生成する処理部である。第1段階処理部230aに含まれる各処理部について説明する。
頻度表リード部221は、拡張された頻度表40の情報を読み出して、拡張ハフマン木生成部222に出力する処理部である。例えば、頻度表リード部221が読み出す拡張された頻度表の情報は、図13の頻度表生成部204によって生成された拡張された頻度表の情報を取得する。
拡張ハフマン木生成部222は、拡張された頻度表40を基にして拡張ハフマン木30を生成する処理部である。拡張ハフマン木生成部222が拡張ハフマン木30を生成する処理は、図13の拡張ハフマン木生成部205が拡張ハフマン木30を生成する処理と同じである。
第2段階処理部230bは、図11で説明したように、圧縮ファイルF2を伸長する処理部である。第2段階処理部230bに含まれる各部の処理について説明する。
ファイルリード部223は、圧縮ファイルF2内の圧縮データを記憶領域B1に読み出す処理部である。ファイルリード部223は、記憶領域B1に格納された圧縮データに対する処理が終了した場合に、新たな圧縮データを圧縮ファイルF2から読み出し、記憶領域B1に格納された圧縮データを更新する。
葉識別部224は、記憶領域B1に格納された圧縮データと、拡張ハフマン木30とを比較して、拡張ハフマン木30を辿り、葉を特定する情報である。葉識別部224は、特定した葉の情報を、第1伸長部225および第2伸長部226に出力する。
第1伸長部225は、葉に含まれる識別情報が「0」の場合に処理を行う。図9で説明したように、識別情報が「0」の場合には、葉には文字コード(データ)の情報が含まれる。第1伸長部225は、葉に含まれる文字コード(データ)の情報を抽出する。第1伸長部225は、抽出した文字コード(データ)の情報を、伸長データとして、参照部である記憶領域B2、および記憶領域B3に格納し、ファイルライト部228に出力する。
第2伸長部226は、葉に含まれる識別情報が「1」の場合に処理を行う。図9で説明したように、識別情報が「1」の場合には、葉には「0の連続数」が含まれる。第2伸長部226は、「0の連続数」を基にして、最長一致文字列の位置を復元する。
図17は、第2伸長部の処理を説明するための図(1)である。図17において、記憶領域B1に含まれる圧縮データと、拡張ハフマン木30との比較がなされ、記憶領域B1のx1の位置まで、ポインタが移動したものとする。また、「0の連続数」を「11」とすると、最長一致文字列の位置は、16ビット長で2進数に変換されているため、1以降のビット長は、「5ビット」となる。このため、第2伸長部226は、位置X1の次から5ビット進めた位置X2までのビット列「10101」を、最長一致文字列の位置として復元する。
また、第2伸長部226は、位置X2以降のビットと拡張ハフマン木30とを比較して、拡張ハフマン木30の葉を特定し、特定した葉に含まれる最長一致文字列の長さを特定する。上記の処理を実行することで、第2伸長部226は、最長一致文字列の位置と長さを特定する。第2伸長部226は、位置と長さに対応するデータを記憶領域B2から取り出し、取り出したデータを伸長データとする。第2伸長部226は、伸長データを、参照部である記憶領域B2、およびB3に格納し、参照部更新部227およびファイルライト部228に出力する。
参照部更新部227は、第1伸長部225または第2伸長部226から伸長データを取得した場合に、伸長データによって、記憶領域B2を更新する処理部である。
ファイルライト部228は、第1伸長部225または第2伸長部226から伸長データを取得した場合に、伸長データを記憶領域B3に格納し、ファイルF3に書き込む処理部である。
図18は、本実施例1に係る圧縮部の処理手順を示すフローチャートである。図18に示すように、圧縮部200aは、前処理を実行する(ステップS101)。ステップS101の前処理において、圧縮部200aは、記憶領域A1、記憶領域A2および記憶領域A3を記憶部200cに確保する。
圧縮部200aは、ファイルF1とF2をオープンし(ステップS102)、ファイルF1をリードし、文字の出現頻度を集計し、頻度表の情報を生成する(ステップS103)。圧縮部200aは、圧縮ファイルF2のヘッダに頻度表40の情報を格納する(ステップS104)。圧縮部200aは、頻度表40の情報を基にして、拡張ハフマン木30を生成する(ステップS105)。
圧縮部200aは、最長一致文字列を検索し(ステップS106)、最長一致文字列のデータ量に応じて、圧縮データの生成・書き込みを行う(ステップS107)。圧縮部200aは、記憶領域A2を更新し(ステップS108)、記憶領域A4を更新する(ステップS109)。
圧縮部200aは、ファイルF1の終点であるか否かを判定する(ステップS110)。圧縮部200aは、ファイルF1の終点では無い場合には(ステップS110,No)、ステップS106に移行する。
一方、圧縮部200aは、ファイルF1の終点である場合には(ステップS110,Yes)、圧縮ファイルF1とF2をクローズする(ステップS111)。
次に、図18のステップS103およびステップS104で示した、頻度表40を生成する処理および拡張ハフマン木30を生成する処理手順について具体的に説明する。
図19は、頻度表および拡張ハフマン木を生成する処理手順を示すフローチャート(1)である。図19に示すように、圧縮部200aは、ファイルF1に含まれるデータの出現頻度を計算する(ステップS151)。圧縮部200aは、ファイルF1に含まれる最長一致文字列を検出し、最長一致文字列の0の連続数の出現頻度を計算する(ステップS152)。
圧縮部200aは、文字コード(データ)または最長一致文字列の長さおよび識別情報「0」を対応付けた葉と、0の連続数および識別情報「1」を対応付けた葉を生成する(ステップS153)。圧縮部200aは、葉を出現頻度の順にソートする(ステップS154)。
圧縮部200aは、出現頻度を基にして、2分木の枝をくみあげて拡張ハフマン木30を生成する(ステップS155)。
次に、図18のステップS106で示した圧縮データを生成する処理手順について具体的に説明する。
図20は、圧縮データを生成する処理手順を示すフロートチャート(1)である。図20に示すように、圧縮部200aは、最長一致文字列のデータ量が3バイト以上であるか否かを判定する(ステップS161)。
圧縮部200aは、3バイト以上である場合には(ステップS162,Yes)、最長一致文字列の0の連続数と拡張ハフマン木30とを比較して、0の連続数をハフマン符号化する(ステップS163)。
圧縮部200aは、最長一致文字列の長さと拡張ハフマン木30とを比較して、長さをハフマン符号化する(ステップS164)。圧縮部200aは、ハフマン符号化した0の連続数と、1以降のビット列と、ハフマン符号化した長さを圧縮データとして出力する(ステップS165)。
一方、圧縮部200aは、最長一致文字列のデータ量が3バイト未満の場合には(ステップS162,No)、文字コード(データ)と拡張ハフマン木30とを比較して、文字コード(データ)をハフマン符号化したものを圧縮データとして出力する(ステップS166)。
図21は、本実施例1に係る伸長部の処理手順を示すフローチャートである。図21に示すように、伸長部200bは、前処理を実行する(ステップS201)。ステップS201の前処理において、伸長部200bは、記憶領域B1、記憶領域B2および記憶領域B3を記憶部200cに確保する。
伸長部200bは、ファイルF2とF3をオープンし(ステップS202)、圧縮ファイルF2のヘッダから頻度表40を読み出す(ステップS203)。伸長部200bは、拡張ハフマン木30を生成する(ステップS204)。
伸長部200bは、圧縮データと拡張ハフマン木30とを比較し(ステップS205)、拡張ハフマン木30の葉の識別情報が「0」であるか否かを判定する(ステップS206)。
伸長部200bは、識別情報が「0」である場合には(ステップS206,Yes)、葉に含まれる文字コード(データ)を記憶領域B2に格納し(ステップS207)、伸長データの書き込みを行う(ステップS208)。
一方、伸長部200bは、識別情報が「1」である場合には(ステップS206,No)、葉に含まれる0の連続数を基に、最長一致文字列の位置および長さを特定する(ステップS209)。伸長部200bは、最長一致文字列の位置および長さに対応する文字列を記憶領域B2から取得する(ステップS210)。
伸長部200bは、データを記憶領域B2に格納し(ステップS211)、ステップS208に移行する。伸長部200bは、圧縮ファイルF2の終点であるか否かを判定する(ステップS212)。
伸長部200bは、圧縮ファイルF2の終点でない場合には(ステップS212,No)、ステップS205に移行する。一方、伸長部200bは、圧縮ファイルF2の終点である場合には(ステップS212,Yes)、ファイルF2とF3をクローズする(ステップS213)。
次に、図21のステップS209に示した葉に含まれる0の連続数を基に、最長一致文字列の位置および長さを特定する処理について説明する。図22は、葉に含まれる0の連続数を基に、最長一致文字列の位置および長さを特定する処理手順を示すフローチャートである。
図22に示すように、伸長部200bは、葉に含まれる0の連続数を基にして、圧縮データに含まれる1以降のビット列のビット長を特定する(ステップS251)。伸長部200bは、圧縮データから1以降のビット列を取得し、最長一致文字列の位置を特定する(ステップS252)。
伸長部200bは、圧縮データの続きと、拡張ハフマン木30とを比較して、最長一致文字列の長さを特定する(ステップS253)。
次に、本実施例にかかる情報処理装置200の効果について説明する。情報処置装置200の圧縮部200は、準備段階で、圧縮対象のファイルF1に対して最長一致検索をおこない、データの出現頻度と、所定長以上となる最長一致文字列の位置の出現頻度を特定する。そして、圧縮段階において、圧縮部200aは、圧縮対象のファイルF1に対して最長一致文字列検索をおこなう。圧縮部200aは、最長一致文字列が所定長未満の場合には、出現頻度の情報を基にして、最長一致文字列を符号化し、圧縮データを生成する。圧縮部200aは、最長一致文字列が所定長以上の場合には、出現頻度の情報を基にして、最長一致文字列の位置の符号化し、最長一致文字列の圧縮データを生成する。これによって、圧縮データに識別情報が付加されないため、圧縮率の低下を防止することができる。
本実施例1に係る情報処理装置100では、データの出現頻度と、0の連続数の出現頻度とをまとめ、さらに識別情報を葉に追加した拡張ハフマン木30を用いて圧縮し、この拡張ハフマン木30を用いて伸長を行うこととなる。情報処理装置100が、伸長処理を行う場合に、拡張ハフマン木30をたどり、拡張ハフマン木30の葉の識別情報を参照すれば、0の連続数で圧縮されているか否かを識別可能であるため、圧縮処理の際に、圧縮データそのものに識別情報を付与しなくても伸長を実行可能となる。
また、情報処理装置200は、伸長部200が、準備段階で、圧縮対象のファイルF1に対して最長一致検索をおこない、データの出現頻度と、所定長以上となる最長一致文字列の位置の出現頻度を取得する。そして、伸長段階において、圧縮ファイルF2と出現頻度の情報とを比較して、圧縮ファイルF2を伸長する。このため、圧縮ファイルF2に識別情報が付加されていなくても、適切に伸長することができる。
次に、本実施例2に係る情報処理装置の圧縮処理について説明する。まず、情報処理装置は、圧縮対象となるファイルF1を参照し、データの出現頻度を集計する。また、情報処理装置は、実施例1に図2に示した最長一致文字列検索部106と同様の処理を行って、ファイル1に対して最長一致文字列検索を実行し、各最長一致文字列の位置を特定する。情報処理装置は、位置を16ビットの2進数で表した場合に、先頭ビットが0の場合には、位置を0の連続数に変換し、0の連続数の出現頻度を集計する。位置を0の連続数に変換する処理は、実施例1と同様である。
これに対して、位置を16ビットの2進数で表した場合に、先頭ビットが1の場合には、位置を1の連続数に変換し、1の連続数の出現頻度を集計する。
位置を1の連続数に変換する処理の一例について説明する。情報処理装置は、位置を16ビット長の2進数に変換し、先頭ビットから1の連続する数を計数したものを、1の連続数とする。例えば、位置が「64682(10)」を、16ビットの2進数で表すと「1111110010101010」となる。このため、位置「64682」に対する1の連続数は「6」となる。
情報処理装置は、データの出現頻度と、0の連続数の出現頻度と、1の連続数の出現頻度を基にして、拡張ハフマン木30を生成する。図23は、拡張ハフマン木の一例を示す図(2)である。拡張ハフマン木50は、ハフマン木10と比較して、葉の構造体が異なり、葉の数も32個多い288個となる。
図23に示す拡張ハフマン木50は、最上位に根ノード51を有し、各節点52−1〜が枝によって接続され、各最下位に葉50−1〜50−288を有する。各節点のデータ構造は、50aに示すものとなる。基本的に、上位の節点と下位の左と右への3種のポインタが格納される。下位の枝と節点が無い場合には、葉のデータが格納される。また、各葉のデータ構造は、50bに示すものとなる。葉には、葉の識別子と、予備情報と、識別情報と、識別情報に応じた情報とが格納される。例えば、識別情報が「0」の場合には、識別情報に応じた情報は、文字または最長一致文字列の長さの情報となる。識別情報が「10」の場合には、識別情報に応じた情報は「0の連続数」となる。識別情報が「11」の場合には、識別情報に応じた情報は「1の連続数」となる。図23に示した拡張ハフマン木を生成した後に、下記に示す圧縮処理を実行する。
図24は、本実施例2に係る圧縮処理を説明する図である。情報処理装置は、記憶領域A1、記憶領域A2および記憶領域A3を記憶部に確保する。記憶領域A1は、例えば符号化部などと呼ばれる。例えば、ファイルF1は、「he・・・1st horse・・・2nd horse・・・3rd horse・・・」というデータが含まれる。
情報処理装置は、記憶領域A1にデータをリードし、圧縮データを生成する。情報処理装置は、圧縮データの生成処理を行ったデータを、記憶領域A1から記憶領域A2にコピーする。記憶領域A2は、例えば参照部などと呼ばれる。圧縮データは、記憶領域A1にリードされたデータと記憶領域A2内のデータとの照合処理の結果に応じて生成される。情報処理装置は、圧縮データを順次記憶領域A3に格納し、記憶領域A3に格納された圧縮データに基づいて圧縮ファイルF2が生成される。
図24において、記憶領域A1に「horse・・・」が格納され、記憶領域A2に「he・・・1st」に格納されている場合の処理の一例について説明する。情報処理装置は、記憶領域A1のデータと記憶領域A2のデータとを比較して、最長一致文字列を検索する。例えば、「h」が、記憶領域A2内で処理対象のデータと最も長く一致する文字、またはデータであるとすると、情報処理装置は、「h」を1バイトの文字、またはデータとして特定する。
情報処理装置は、例えば「h」のように最長一致文字列が3バイト未満の場合には、下記の処理を実行する。図24に示すように、情報処理装置は、1バイトの文字「h」と、拡張ハフマン木50とを比較して、文字「h」またはデータのハフマン符号を特定し、圧縮データd1を生成し、記憶領域A3に格納する。なお、圧縮データd1には、識別子は含まれない。
図24において、記憶領域A1に「horse・・・」が格納され、記憶領域A2に「・・・1st horse・・・2nd」に格納されている場合の処理の一例について説明する。情報処理装置は、記憶領域A1のデータと記憶領域A2のデータとを比較して、最長一致文字列を検索する。例えば、「horse」が、記憶領域A2内で処理対象のデータと最も長く一致するデータであるとすると、情報処理装置は、「horse」を最長一致文字列として特定する。
情報処理装置は、例えば「horse」のように最長一致文字列が3バイト以上であり、かつ、最長一致文字列の位置の先頭ビットが「0」の場合には、下記の処理を実行する。図24に示すように、情報処理装置は、最長一致文字列の記憶領域A2内での位置と、最長一致文字列のデータ長を特定する。情報処理装置は、最長一致文字列の位置に対応する0の連続数と、拡張ハフマン木50とを比較して、0の連続数をハフマン符号化する。また、情報処理装置は、最長一致文字列の長さと、拡張ハフマン木50とを比較して、長さをハフマン符号化する。情報処理装置は、0の連続数のハフマン符号と、長さのハフマン符号とを合わせて圧縮データd2を生成し、記憶領域A3に格納する。なお、圧縮データd2には、識別子は含まれない。
図24において、記憶領域A1に「horse・・・」が格納され、記憶領域A2に「・・・2nd horse・・・3rd」に格納されている場合の処理の一例について説明する。情報処理装置は、記憶領域A1のデータと記憶領域A2のデータとを比較して、最長一致文字列を検索する。例えば、「horse」が、記憶領域A2内で処理対象のデータと最も長く一致するデータであるとすると、情報処理装置は、「horse」を最長一致文字列として特定する。
情報処理装置は、例えば「horse」のように最長一致文字列が3バイト以上であり、かつ、最長一致文字列の位置の先頭ビットが「1」の場合には、下記の処理を実行する。図24に示すように、情報処理装置は、最長一致文字列の記憶領域A2内での位置と、最長一致文字列のデータ長を特定する。情報処理装置は、最長一致文字列の位置に対応する1の連続数と、拡張ハフマン木50とを比較して、1の連続数をハフマン符号化する。また、情報処理装置は、最長一致文字列の長さと、拡張ハフマン木50とを比較して、長さをハフマン符号化する。情報処理装置は、1の連続数のハフマン符号と、長さのハフマン符号とを合わせて圧縮データd3を生成し、記憶領域A3に格納する。なお、圧縮データd3には、識別子は含まれない。
図25は、本実施例2に係る伸長処理を説明する図である。まず、情報処理装置は、記憶領域B1、記憶領域B2および記憶領域B3を記憶部に確保する。情報処理装置は、圧縮ファイルF2内の圧縮データを記憶領域B1にロードする。また、伸長部200bは、圧縮データと拡張ハフマン木30とを比較して、葉を特定し、特定した葉に含まれる識別情報が「0」であるか「10」であるか「11」であるかを判定する。
情報処理装置は、識別情報が「0」である場合には、特定した葉に含まれるデータを、圧縮データに対応する伸長データとして特定する。例えば、識別情報が「0」であり、葉に「h」が含まれている場合には、圧縮データに対応する伸長データが「h」となる。情報処理装置は、伸長データ「h」を、記憶領域B2および記憶領域B3の双方に格納する。
情報処理装置は、識別情報が「10」である場合には、特定した葉に含まれる0の連続を基にして、最長一致文字列の位置を特定する。情報処理装置は、最長一致文字の位置を特定した後に、圧縮データの続きと、拡張ハフマン木50とを比較して、葉を特定し、特定した葉に含まれる最長一致文字の長さを特定する。情報処理装置は、記憶領域B2を参照し、最長一致文字列の位置および長さに対応するデータ「horse」を記憶領域B2から取得する。この取得したデータ「horse」が、圧縮データに対応する伸長データとなる。情報処理装置は、伸長データ「horse」を、記憶領域B2および記憶領域B3の双方に格納する。
情報処理装置は、識別情報が「11」である場合には、特定した葉に含まれる1の連続を基にして、最長一致文字列の位置を特定する。情報処理装置は、最長一致文字の位置を特定した後に、圧縮データの続きと、拡張ハフマン木50とを比較して、葉を特定し、特定した葉に含まれる最長一致文字の長さを特定する。情報処理装置は、記憶領域B2を参照し、最長一致文字列の位置および長さに対応するデータ「horse」を記憶領域B2から取得する。この取得したデータ「horse」が、圧縮データに対応する伸長データとなる。情報処理装置は、伸長データ「horse」を、記憶領域B2および記憶領域B3の双方に格納する。
図26は、本実施例2に係る情報処理装置の構成を示す図である。図26に示すように、この情報処理装置300は、圧縮部300aと伸長部300bと、記憶部300cとを有する。圧縮部300aは、図24に示した圧縮処理を実行する処理部である。伸長部300bは、図25に示した伸長処理を実行する処理部である。記憶部300cは、圧縮対象のファイルF1、圧縮処理により得られる圧縮ファイルF2、ファイルF2を伸長して得られるファイルF3などを媒介する。
図27は、本実施例2に係る圧縮部の構成を示す機能ブロック図である。図27に示すように、圧縮部300aは、第1段階処理部320aと、第2段階処理部320bとを有する。第1段階処理部320aは、参照部文字リード部301、文字頻度集計部302と、最長一致文字列検索部303と、頻度表生成部304と、拡張ハフマン木生成部305を有する。第2段階処理部320bは、ファイルリード部306と、最長一致文字列検索部307と、第1符号化部308と、第2符号化部309と、参照部更新部310と、ファイルライト部311とを有する。このうち、参照部文字リード部301、文字頻度集計部302に関する説明は、実施例1に示した参照部文字リード部201および文字頻度集計部202と同様である。
最長一致文字列検索部303は、参照部となる記憶領域A2に格納されたデータと、符号化部となる記憶領域A1に格納されたデータとを比較して、最長一致文字列を検索する処理部である。最長一致文字列を検索する処理は、図5に示した最長一致文字列検索部106と同様である。
また、最長一致文字列検索部303は、最長一致文字列の位置の先頭ビットが「0」の場合には、位置を0の連続数に変換する。具体的には、最長一致文字列検索部303は、位置を16ビット長の2進数に変換し、先頭から0が連続する数を計数したものを、0の連続するとして算出する。例えば、位置が「26(10)」を、16ビットの2進数で表すと「0000000000011010」となる。このため、位置「26」に対する0の連続数は「11」となる。
最長一致文字列検索部303は、記憶領域A1のデータが更新される度に、最長一致文字列の位置の0の連続数を算出し、各0の連続数の出現頻度を算出する。最長一致文字列検索部303は、各0の連続数の出現頻度の情報を頻度表生成部304に出力する。
一方、最長一致文字列検索部303は、最長一致文字列の位置の先頭ビットが「1」の場合には、位置を1の連続数に変換する。具体的には、最長一致文字列検索部303は、位置を16ビット長の2進数に変換し、先頭から1が連続する数を計数したものを、1の連続するとして算出する。例えば、位置が「64682(10)」を、16ビットの2進数で表すと「1111110010101010」となる。このため、位置「64682(10)」に対応する1の連続数は「6」となる。
最長一致文字列検索部303は、記憶領域A1のデータが更新される度に、最長一致文字列の位置の1の連続数を算出し、各1の連続数の出現頻度を算出する。最長一致文字列検索部303は、各1の連続数の出現頻度の情報を頻度表生成部304に出力する。
頻度表生成部304は、各データの出現頻度、0の連続数の出現頻度、1の連続数の出現頻度を基にして、拡張した頻度表を生成する処理部である。頻度表生成部304は、拡張した頻度表の情報を、拡張ハフマン木生成部305に出力する。図28は、拡張した頻度表のデータ構造の一例を示す図(2)である。図28に示すように、この拡張した頻度表60は、文字コード(データ)/長さと出現頻度とを対応付ける。また、0の連続数と出現頻度とを対応付ける。また、1の連続数と出現頻度とを対応付ける。文字コード(データ)/長さと出現頻度とを対応付けたレコードの数は、256である。0の連続数と出現頻度とを対応付けたレコードの数は16である。1の連続数と出現頻度とを対応付けたレコードの数は16である。文字コード(データ)/長さの番号は、所定の文字に対応する番号あるいは長さに対応する。
拡張ハフマン木生成部305は、拡張した頻度表60を基にして、拡張したハフマン木50を生成する処理部である。拡張ハフマン木生成部305のデータ構造は、図23に示した拡張ハフマン木50に対応する。
拡張ハフマン木生成部305は、葉の識別子と、予備情報と、識別情報「0」と、文字コード(データ)または最長一致文字列の長さとを対応付けた葉の構造体を256個生成する。拡張ハフマン木生成部305は、葉の識別子と、予備情報と、識別情報「10」と、0の連続数とを対応付けた葉の構造体を16個生成する。拡張ハフマン木生成部305は、葉の識別子と、予備情報と、識別情報「11」と、1の連続数とを対応付けた葉の構造体を16個生成する。拡張ハフマン木生成部305は、葉の構造体に含まれる文字コード、0の連続数、1の連続数と、頻度表60とを比較して、各葉の構造体の出現頻度を特定する。
拡張ハフマン木生成部305は、葉の構造体を文字コード、0の連続数、または1の連続数の出現頻度の順にソートし、出現頻度に応じて、2分木の「枝」をくみ上げ、上位に向かって、2分木の枝をくみ上げていくことで、ハフマン木を生成する。
第2段階処理部320bは、図24で説明したように、ファイルF1を圧縮する処理部である。第2段階処理部320bに含まれる各部の処理について説明する。
ファイルリード部306は、ファイルF1内のコンテンツ部分のデータを、符号化部に対応する記憶領域A1に読み出す処理部である。ファイルリード部306は、記憶領域A1に格納されたデータに対する処理が終了し、記憶領域A1のデータを参照部である記憶領域A2に移行し、圧縮符号が格納された記憶領域A3のデータを圧縮ファイルF2に書き込んだ後に、新たなデータをファイルF1から読み出し、記憶領域A1に格納されたデータを更新する。
最長一致文字検索部307は、参照部となる記憶領域A2に格納されたデータと、記憶領域A1に格納されたデータとを比較して、最長一致文字列を検索する処理部である。最長一致文字列を検索する処理は、図24に示した処理と同様である。最長一致文字探索部307は、最長一致文字列の情報を、第1符号部308、第2符号部309に出力する。
第1符号化部308は、最長一致文字列のデータ量が3バイト未満の場合に処理を行う。第1符号化部308は、最長一致文字列のデータ量が3バイト未満の場合に、それぞれの1バイトの文字コード、またはデータの2進数表現と、拡張ハフマン木50とを比較して、ハフマン符号を特定する。第1符号化部308は、ハフマン符号を記憶領域A3に格納し、ファイルライト部311に出力する。このハフマン符号そのものが、圧縮データとなる。
図29は、圧縮部の第2符号化部の処理を説明するための図(2)である。第2符号化部309は、最長一致文字列のデータ量が3バイト以上であり、かつ最長一致文字列の位置の先頭ビットが「0」の場合に、図29の上段の処理を行う。図29の上段に示すように、記憶領域A1に「horse・・・」が格納され、記憶領域A2に「・・・1st horse・・・2nd」が格納されており、最長位置文字列を「horse」とする。
第2符号化部308は、最長一致文字列のデータ量が3バイト以上の場合に、最長一致文字列の記憶領域A2での先頭からの位置と、最長一致文字列の一致長を特定する。図29に示す例では、最長一致文字列の位置は「X1」となり、最長一致文字列の長さは「Y1」となる。ここで、X1の位置を「0000000000011010」とすると、先頭ビットは「0」となる。
第2符号化部309は、最長一致文字列の位置「X1」を16ビット長の2進数で表した場合における「0の連続数」と、「1以降のビット列」とを特定する。第2符号化部309は、「0の連続数」と、拡張ハフマン木50とを比較して、「0の連続数」のハフマン符号を求める。また、第2符号化部309は、最長一致文字列の長さ「Y1」と、拡張ハフマン木50とを比較して、最長一致文字列の長さ「Y1」のハフマン符号を求める。
第2符号化部309は、最長一致文字列の位置の「0の連続数」のハフマン符号と、最長一致文字列の位置の「1以降のビット列」と、最長一致文字列の「長さ」のハフマン符号を組み合わせて、圧縮データd2を生成する。第2符号化処理部309は、圧縮データd2を、記憶領域A3に格納し、ファイルライト部311に出力する。
これに対して、第2符号化部309は、最長一致文字列のデータ量が3バイト以上であり、かつ最長一致文字列の位置の先頭ビットが「1」の場合に、図29の下段の処理を行う。図29の下段に示すように、記憶領域A1に「horse・・・」が格納され、記憶領域A2に「・・・2nd horse・・・3rd」が格納されており、最長位置文字列を「horse」とする。
第2符号化部308は、最長一致文字列のデータ量が3バイト以上の場合に、最長一致文字列の記憶領域A2での先頭からの位置と、最長一致文字列の一致長を特定する。図29に示す例では、最長一致文字列の位置は「X2」となり、最長一致文字列の長さは「Y2」となる。ここで、X2の位置を「1111110010101010」とすると、先頭ビットは「1」となる。
第2符号化部309は、最長一致文字列の位置「X2」を16ビット長の2進数で表した場合における「1の連続数」と、「0以降のビット列」とを特定する。第2符号化部309は、「1の連続数」と、拡張ハフマン木50とを比較して、「1の連続数」のハフマン符号を求める。また、第2符号化部309は、最長一致文字列の長さ「Y2」と、拡張ハフマン木50とを比較して、最長一致文字列の長さ「Y2」のハフマン符号を求める。
第2符号化部309は、最長一致文字列の位置の「1の連続数」のハフマン符号と、最長一致文字列の位置の「0以降のビット列」と、最長一致文字列の「長さ」のハフマン符号を組み合わせて、圧縮データd3を生成する。第2符号化処理部309は、圧縮データd3を、記憶領域A3に格納し、ファイルライト部311に出力する。
参照部変更部310、ファイルライト部311に関する説明は、実施例1に示した参照部更新部310およびファイルライト部311に関する説明と同様である。
図30は、本実施例2に係る伸長部の構成を示す機能ブロック図である。図30に示すように、この伸長部300bは、第1処理部330aと、第2段階処理部330bとを有する。第1段階処理部330aは、頻度表リード部321と、拡張ハフマン木生成部322とを有する。
第1段階処理部330aは、圧縮ファイルF2のヘッダ情報に含まれる拡張された頻度表60の情報を基にして、拡張ハフマン木50を生成する処理部である。第1段階処理部330aに含まれる各処理部について説明する。
頻度表リード部321は、拡張された頻度表60の情報を読み出して、拡張ハフマン木生成部322に出力する処理部である。例えば、頻度表リード部321が読み出す拡張された頻度表の情報は、図27の頻度表生成部304によって生成された拡張された頻度表の情報を取得する。
拡張ハフマン木生成部322は、拡張された頻度表60を基にして拡張ハフマン木50を生成する処理部である。拡張ハフマン木生成部322が拡張ハフマン木50を生成する処理は、図27の拡張ハフマン木生成部305が拡張ハフマン木50を生成する処理と同じである。
第2段階処理部330bは、図25で説明したように、圧縮ファイルF2を伸長する処理部である。第2段階処理部330bに含まれる各部の処理について説明する。
ファイルリード部323は、圧縮ファイルF2内の圧縮データを記憶領域B1に読み出す処理部である。ファイルリード部323は、記憶領域B1に格納された圧縮データに対する処理が終了した場合に、新たな圧縮データを圧縮ファイルF2から読み出し、記憶領域B1に格納された圧縮データを更新する。
葉識別部324は、記憶領域B1に格納された圧縮データと、拡張ハフマン木50とを比較して、拡張ハフマン木50を辿り、葉を特定する情報である。葉識別部324は、特定した葉の情報を、第1伸長部325および第2伸長部326に出力する。
第1伸長部325は、葉に含まれる識別情報が「0」の場合に処理を行う。図23で説明したように、識別情報が「0」の場合には、葉には文字コードの情報が含まれる。第1伸長部325は、葉に含まれる文字コードの情報を抽出する。第1伸長部325は、抽出した文字の情報を、伸長データとして、参照部である記憶領域B2、および記憶領域B3に格納し、ファイルライト部328に出力する。
第2伸長部326は、葉に含まれる識別情報が「10」または「11」の場合に処理を行う。図23で説明したように、識別情報が「10」の場合には、葉には「0の連続数」が含まれる。第2伸長部226は、識別情報が「10」の場合に伸長データを生成する処理は、実施例1の第2伸長部226と同様である。
図31は、第2伸長部の処理を説明するための図(2)である。図31において、記憶領域B1に含まれる圧縮データと、拡張ハフマン木50との比較がなされ、記憶領域B1のx1の位置まで、ポインタが移動したものとする。また、「1の連続数」を「6」とすると、最長一致文字列の位置は、16ビット長で2進数に変換されているため、1以降のビット長は、「10ビット」となる。このため、第2伸長部226は、位置X1の次から10ビット進めた位置X2までのビット列「010101010」の前に「111111」を加えた「111111010101010」を、最長一致文字列の位置として復元する。
また、第2伸長部226は、位置X2以降のビットと拡張ハフマン木30とを比較して、拡張ハフマン木30の葉を特定し、特定した葉に含まれる最長一致文字列の長さを特定する。上記の処理を実行することで、第2伸長部226は、最長一致文字列の位置と長さを特定する。第2伸長部226は、位置と長さに対応する文字列を参照部である記憶領域B2から取り出し、取り出した文字列を伸長データとする。第2伸長部226は、伸長データを、参照部である記憶領域B2、および、記憶領域B3に格納し、参照部更新部227およびファイルライト部228に出力する。
また、第2伸長部326は、位置X2以降のビットと拡張ハフマン木50とを比較して、拡張ハフマン木50の葉を特定し、特定した葉に含まれる最長一致文字列の長さを特定する。上記の処理を実行することで、第2伸長部326は、最長一致文字列の位置と長さを特定する。第2伸長部326は、位置と長さに対応する文字列を記憶領域B2から取り出し、取り出した文字列を伸長データとする。第2伸長部326は、伸長データを、参照部である記憶領域B2、および、記憶領域B3に格納し、参照部更新部327およびファイルライト部328に出力する。
参照部更新部327およびファイルライト部328に関する説明は、実施例1の参照部更新部327とファイルライト部328と同様である。
続いて、本実施例2に係る圧縮部300の全体の処理手順は、図18と同様である。詳細の処理手順として、頻度表60を生成する処理および拡張ハフマン木50を生成する処理手順について具体的に説明する。
図32は、頻度表および拡張ハフマン木を生成する処理手順を示すフローチャート(2)である。図32に示すように、圧縮部300aは、ファイルF1に含まれるデータの出現頻度を計算する(ステップS301)。圧縮部300aは、ファイルF1に含まれる最長一致文字列を検出し、最長一致文字列の0の連続数および1の連続数の出現頻度を計算する(ステップS302)。
圧縮部300aは、文字コードまたは最長一致文字列の長さおよび識別情報「0」を対応付けた葉を生成する(ステップS303)。圧縮部300aは、0の連続数および識別情報「10」を対応付けた葉を生成する(ステップS304)。圧縮部300bは、1の連続数および識別情報「11」を対応付けた葉を生成する(ステップS305)。
圧縮部300aは、葉を出現頻度の順にソートする(ステップS306)。圧縮部300aは、出現頻度を基にして、2分木の枝をくみあげて拡張ハフマン木50を生成する(ステップS307)。
続いて、本実施例2に係る圧縮部300aが、圧縮データを生成する処理手順について具体的に説明する。
図33は、圧縮データを生成する処理手順を示すフロートチャート(2)である。図33に示すように、圧縮部300aは、最長一致文字列のデータ量が3バイト以上であるか否かを判定する(ステップS310)。
圧縮部300aは、3バイト以上である場合には(ステップS311,Yes)、最長一致文字列の位置は「0」から始まるか否かを判定する(ステップS312)。圧縮部300aは、最長一致文字列の位置が「0」から始まる場合には(ステップS313,Yes)、最長一致文字列の0の連続数と拡張ハフマン木50とを比較して、0の連続数をハフマン符号化する(ステップS314)。
圧縮部300aは、最長一致文字列の長さと拡張ハフマン木50とを比較して、長さをハフマン符号化する(ステップS315)。圧縮部300aは、ハフマン符号化した0の連続数と、1以降のビット列と、ハフマン符号化した長さを圧縮データとして出力する(ステップS316)。
一方、圧縮部300aは、最長一致文字列の位置が「0」から始まらない場合には(ステップS313,No)、最長一致文字列の1の連続数と拡張ハフマン木50とを比較して、1の連続数をハフマン符号化する(ステップS317)。
圧縮部300aは、最長一致文字列の長さと拡張ハフマン木50とを比較して、長さをハフマン符号化する(ステップS318)。圧縮部300aは、ハフマン符号化した1の連続数と、0以降のビット列と、ハフマン符号化した長さを圧縮データとして出力する(ステップS319)。
ところで、圧縮部300aは、最長一致文字列のデータ量が3バイト未満の場合には(ステップS311,No)、文字コードと拡張ハフマン木50とを比較して、文字コードをハフマン符号化したものを圧縮データとして出力する(ステップS320)。
図34は、本実施例2に係る伸長部の処理手順を示すフローチャートである。図34に示すように、図34に示すように、伸長部300bは、前処理を実行する(ステップS401)。ステップS401の前処理において、伸長部300bは、記憶領域B1、記憶領域B2および記憶領域B3を記憶部300cに確保する。
伸長部300bは、ファイルF2とF3をオープンし(ステップS402)、圧縮ファイルF2のヘッダから頻度表60を読み出す(ステップS403)。伸長部300bは、拡張ハフマン木50を生成する(ステップS404)。
伸長部300bは、圧縮データと拡張ハフマン木50とを比較し(ステップS405)、拡張ハフマン木50の葉の識別情報が「0」であるか否かを判定する(ステップS406)。
伸長部300bは、識別情報が「0」である場合には(ステップS406,Yes)、葉に含まれる文字コードを記憶領域B2に格納し(ステップS407)、伸長データの書き込みを行う(ステップS408)。
伸長部300bは、圧縮ファイルF2の終点でない場合には(ステップS409,No)、ステップS405に移行する。一方、伸長部300bは、圧縮ファイルF2の終点である場合には(ステップS409,Yes)、ファイルF2とF3をクローズする。
一方、伸長部300bは、識別情報が「0」でない場合には(ステップS406,No)、識別情報が「10」であるか否かを判定する(ステップS411)。伸長部300bは、識別情報が「10」である場合には(ステップS411,Yes)、葉に含まれる0の連続数を基に、最長一致文字列の位置および長さを特定する(ステップS412)。伸長部300bは、最長一致文字列の位置および長さに対応するデータを記憶領域B2から取得する(ステップS413)。伸長部300bは、データを記憶領域B2に格納し(ステップS414)、ステップS409に移行する。
一方、伸長部300bは、識別情報が「11」である場合には(ステップS411,No)、葉に含まれる1の連続数を基に、最長一致文字列の位置および長さを特定する(ステップS415)。伸長部300bは、最長一致文字列の位置および長さに対応する文字列を記憶領域B2から取得する(ステップS416)。伸長部300bは、データを記憶領域B2に格納し(ステップS417)、ステップS409に移行する。
次に、本実施例2にかかる情報処理装置300の効果について説明する。情報処置装置300の圧縮部300aは、最長一致文字列検索部106と同様の処理を行って、ファイル1に対して最長一致文字列検索を実行し、各最長一致文字列の位置を特定する。情報処理装置は、位置を16ビットの2進数で表した場合に、先頭ビットが0の場合には、位置を0の連続数に変換し、0の連続数の出現頻度を集計する。また、圧縮部300aは、先頭ビットが1の場合には、一を1の連続数に変換し、1の連続数の出現頻度を集計する。圧縮部300aは、データの出現頻度、0の連続数の出現頻度、1の連続数の出現頻度をまとめた拡張ハフマン木を生成し、この拡張ハフマン木を用いて、圧縮処理を行う。圧縮部300aが利用する、この拡張ハフマン木は1種類あり、拡張ハフマン木の葉に識別情報が含まれているため、圧縮データに識別情報が付加されなくても伸長可能であり、圧縮率の低下を防止することができる。
下記に、本実施形態に用いられるハードウェア及びソフトウェアについて説明する。図35は、コンピュータ1のハードウェア構成例を示す。コンピュータ1は、例えば、プロセッサ301、RAM(Random Access Memory)302、ROM(Read Only Memory)303、ドライブ装置304、記憶媒体305、入力インターフェース(I/F)306、入力デバイス307、出力インターフェース(I/F)308、出力デバイス309、通信インターフェース(I/F)310、SAN(Storage Area Network)インターフェース(I/F)311およびバス312などを含む。それぞれのハードウェアはバス312を介して接続されている。
RAM302は読み書き可能なメモリ装置であって、例えば、SRAM(Static RAM)やDRAM(Dynamic RAM)などの半導体メモリ、またはRAMでなくてもフラッシュメモリなどが用いられる。ROM303は、PROM(Programmable ROM)なども含む。ドライブ装置304は、記憶媒体305に記録された情報の読み出しか書き込みかの少なくともいずれか一方を行なう装置である。記憶媒体305は、ドライブ装置304によって書き込まれた情報を記憶する。記憶媒体305は、例えば、ハードディスク、SSD(Solid State Drive)などのフラッシュメモリ、CD(Compact Disc)、DVD(Digital Versatile Disc)、ブルーレイディスクなどの記憶媒体である。また、例えば、コンピュータ1は、複数種類の記憶媒体それぞれについて、ドライブ装置304及び記憶媒体305を設ける。
入力インターフェース306は、入力デバイス307と接続されており、入力デバイス307から受信した入力信号をプロセッサ301に伝達する回路である。出力インターフェース308は、出力デバイス309と接続されており、出力デバイス309に、プロセッサ301の指示に応じた出力を実行させる回路である。通信インターフェース310はネットワーク3を介した通信の制御を行なう回路である。通信インターフェース310は、例えばネットワークインターフェースカード(NIC)などである。SANインターフェース311は、ストレージエリアネットワークによりコンピュータ1と接続された記憶装置との通信の制御を行なう回路である。SANインターフェース311は、例えばホストバスアダプタ(HBA)などである。
入力デバイス307は、操作に応じて入力信号を送信する装置である。入力信号は、例えば、キーボードやコンピュータ1の本体に取り付けられたボタンなどのキー装置や、マウスやタッチパネルなどのポインティングデバイスである。出力デバイス309は、コンピュータ1の制御に応じて情報を出力する装置である。出力デバイス309は、例えば、ディスプレイなどの画像出力装置(表示デバイス)や、スピーカーなどの音声出力装置などである。また、例えば、タッチスクリーンなどの入出力装置が、入力デバイス307及び出力デバイス309として用いられる。また、入力デバイス307及び出力デバイス309は、コンピュータ1と一体になっていてもよいし、コンピュータ1に含まれず、例えば、コンピュータ1に外部から接続する装置であってもよい。
例えば、プロセッサ301は、ROM303や記憶媒体305に記憶されたプログラムをRAM302に読み出し、読み出されたプログラムの手順に従って圧縮部200aの処理または伸張部200bの処理を行なう。その際にRAM302はプロセッサ301のワークエリアとして用いられる。記憶部200cの機能は、ROM303および記憶媒体305がプログラムファイル(後述のアプリケーションプログラム24、ミドルウェア23およびOS22など)やデータファイル(圧縮対象のファイルF1、圧縮されたファイルF2など)を記憶し、RAM302がプロセッサ301のワークエリアとして用いられることによって実現される。プロセッサ301が読み出すプログラムについては、図36を用いて説明する。
図36は、コンピュータ1で動作するプログラムの構成例を示す。コンピュータ1において、図35に示すハードウェア群21(301〜312)の制御を行なうOS(オペレーティング・システム)22が動作する。OS22に従った手順でプロセッサ301が動作して、ハードウェア群21の制御・管理が行なわれることにより、アプリケーションプログラム24やミドルウェア23に従った処理がハードウェア群21で実行される。さらに、コンピュータ1において、ミドルウェア23またはアプリケーションプログラム24が、RAM302に読み出されてプロセッサ301により実行される。
プロセッサ301が、圧縮機能が呼び出された場合に、ミドルウェア23またはアプリケーションプログラム24の少なくとも一部に基づく処理を行なうことにより、(それらの処理をOS22に基づいてハードウェア群21を制御して)圧縮部200aの機能が実現される。また、プロセッサ301が、伸張機能が呼び出された場合に、ミドルウェア23またはアプリケーションプログラム24の少なくとも一部に基づく処理を行なうことにより、(それらの処理をOS22に基づいてハードウェア群21を制御して)伸張部200bの機能が実現される。圧縮機能および伸張機能は、それぞれアプリケーションプログラム24自体に含まれてもよいし、アプリケーションプログラム24に従って呼び出されることで実行されるミドルウェア23の一部であってもよい。
アプリケーションプログラム24(またはミドルウェア23)の圧縮機能により得られる圧縮ファイルF2は、圧縮ファイルF2内の圧縮辞書D1に基づいて部分的に伸張可能である。圧縮ファイルF2の途中を伸張する場合には、伸張対象の部分までの圧縮データの伸張処理が抑制されるため、プロセッサ301の負荷が抑制される。また、伸張対象の圧縮データを部分的にRAM302上に展開するので、ワークエリアも削減される。
図37は、実施形態のシステムにおける装置の構成例を示す。図37のシステムは、コンピュータ1a、コンピュータ1b、基地局2およびネットワーク3を含む。コンピュータ1aは、無線または有線の少なくとも一方により、コンピュータ1bと接続されたネットワーク3に接続している。
図12に示す圧縮部200aと伸張部200bとは、図37に示すコンピュータ1aとコンピュータ1bとのいずれに含まれてもよい。コンピュータ1bが圧縮部200aを含み、コンピュータ1aが伸張部200bを含んでもよいし、コンピュータ1bが圧縮部200aを含み、コンピュータ1aが伸張部200bを含んでもよい。また、コンピュータ1aとコンピュータ1bとの双方が、圧縮部200aおよび伸張部200bを備えてもよい。
以下、上述の実施形態における変形例の一部を説明する。下記の変形例のみでなく、本発明の本旨を逸脱しない範囲の設計変更は適宜行われうる。圧縮処理の対象は、ファイル内のデータ以外にも、システムから出力される監視メッセージなどでもよい。例えば、バッファに順次格納される監視メッセージを上述の圧縮処理により圧縮し、ログファイルとして格納するなどの処理が行なわれる。また、例えば、データベース内のページ単位に圧縮が行なわれてもよいし、複数のページをまとめた単位で圧縮が行なわれてもよい。
また、上述の圧縮処理の対象となるデータは、上述の通り、文字情報に限定されるものでない。数値のみの情報であってもよいし、画像・音声などのデータに対して上述の圧縮処理を用いてもよい。例えば、音声合成により得られるデータを多量に含むファイルなどは、データ内に繰り返しを多く含むため動的辞書により圧縮率が向上することが見込まれる。当然その一部のみが利用される場合には、部分伸張により余分な伸張処理が抑制される。また、固定カメラにより撮影された動画像についても各フレームの画像が似たものになることから繰り返しが多く含まれる。そのため、上述の圧縮処理を適用することにより、文書データや音声データと同様の効果を得ることができる。
以上の各実施例を含む実施形態に関し、さらに以下の付記を開示する。
(付記1)コンピュータに、
あるデータに対して最長一致文字列検索をおこない、検索された最長一致文字列のうち所定長未満となる第1データそれぞれの出現頻度と、最長一致文字列のうち所定長以上となる第2データの位置情報それぞれの出現頻度とを基にして、圧縮符号、第1識別情報および前記第1データをそれぞれ対応付けた情報と、圧縮符号、第2識別情報および前記位置情報を対応付けた情報とを含む頻度情報を生成し、
圧縮対象のデータに対して最長一致文字列検索をおこない、最長一致文字列が所定長未満の場合には、前記頻度情報に含まれる第1データのうち、前記最長一致文字列の第1データに対応付けられた圧縮符号を出力し、
前記最長一致文字列が所定長以上の場合には、前記頻度情報に含まれる第2データの位置情報のうち、前記最長一致文字列の位置情報と一致する位置情報に対応付けられた圧縮符号、および、前記頻度情報に含まれる第1データのうち最長一致文字列の長さの情報に対応付けられた圧縮符号を出力する
各処理を実行させることを特徴とする圧縮プログラム。
(付記2)前記頻度情報を生成する処理は、前記第1データおよび該第1データの出現頻度と、スライド窓の先頭から前記第2データまでの位置情報を縮約した情報および前記位置情報の出現頻度とを含むハフマン木を生成することを特徴とする付記1に記載の圧縮プログラム。
(付記3)前記頻度情報を生成する処理は、前記スライド窓の先頭から前記第2データが出現するまでの位置をnビット固定長で表現した場合における先頭ビットから1または0が連続する数を示す連続数を、前記縮約した情報として前記ハフマン木の葉に格納することを特徴とする付記2に記載の圧縮プログラム。
(付記4)前記圧縮対象のデータから出力される圧縮ファイルの一部に、前記ハフマン木に対応した出現頻度情報を含むことを特徴とする付記2に記載の圧縮プログラム。
(付記5)コンピュータに、
入力した圧縮ファイルの一部から、所定長未満となる第1データの出現頻度と、各最長一致文字列のうち所定長以上となる第2データの位置情報の出現頻度とを基にして生成された、圧縮符号、第1識別情報および前記第1データを対応付けた情報と、圧縮符号、第2識別情報および前記位置情報を対応付けた情報とを含む頻度情報を取得し、
前記圧縮ファイルからデータを読み出し、読み出したデータと前記頻度情報とを基にして、伸長データを生成する、
処理を実行させることを特徴とする伸長プログラム。
(付記6)前記第1データおよび出現頻度と、前記位置情報の出現頻度とを構造に反映した、前記1データまたは前記位置情報を葉に含むハフマン木を、前記頻度情報より生成可能であり、
前記ハフマン木の前記第1データを含む葉には第1識別子が格納され、前記位置情報を含む葉には第2識別子が格納されており、
前記伸長する処理は、伸長対象のデータを読み出して前記ハフマン木を辿り、データに対応する前記ハフマン木の葉を特定し、特定したハフマン木の葉に第1識別情報が含まれているか第2識別情報が含まれているかを判定し、
第1識別子が含まれている場合には、葉に含まれるデータを出力し
第2識別子が含まれている場合には、葉に含まれる位置情報に基づいてデータを出力することを特徴とする付記5に記載の伸長プログラム。
(付記7)コンピュータが実行する圧縮方法であって、
あるデータに対して最長一致文字列検索をおこない、検索された最長一致文字列のうち所定長未満となる第1データそれぞれの出現頻度と、最長一致文字列のうち所定長以上となる第2データの位置情報それぞれの出現頻度とを基にして、圧縮符号、第1識別情報および前記第1データをそれぞれ対応付けた情報と、圧縮符号、第2識別情報および前記位置情報を対応付けた情報とを含む頻度情報を生成し、
圧縮対象のデータに対して最長一致文字列検索をおこない、最長一致文字列が所定長未満の場合には、前記頻度情報に含まれる第1データのうち、前記最長一致文字列の第1データに対応付けられた圧縮符号を出力し、
前記最長一致文字列が所定長以上の場合には、前記頻度情報に含まれる第2データの位置情報のうち、前記最長一致文字列の位置情報と一致する位置情報に対応付けられた圧縮符号、および、前記頻度情報に含まれる第1データのうち最長一致文字列の長さの情報に対応付けられた圧縮符号を出力する
各処理を実行させることを特徴とする圧縮方法。
(付記8)前記頻度情報を生成する処理は、前記第1データおよび該第1データの出現頻度と、スライド窓の先頭から前記第2データまでの位置情報を縮約した情報および前記位置情報の出現頻度とを含むハフマン木を生成することを特徴とする付記7に記載の圧縮方法。
(付記9)前記頻度情報を生成する処理は、前記スライド窓の先頭から前記第2データが出現するまでの位置をnビット固定長で表現した場合における先頭ビットから1または0が連続する数を示す連続数を、前記縮約した情報として前記ハフマン木の葉に格納することを特徴とする付記7に記載の圧縮方法。
(付記10)前記圧縮対象のデータから出力される圧縮ファイルの一部に、前記ハフマン木に対応した出現頻度情報を含むことを特徴とする付記8に記載の圧縮方法。
(付記11)コンピュータが実行する伸長方法であって、
入力した圧縮ファイルの一部から、所定長未満となる第1データの出現頻度と、各最長一致文字列のうち所定長以上となる第2データの位置情報の出現頻度とを基にして生成された、圧縮符号、第1識別情報および前記第1データを対応付けた情報と、圧縮符号、第2識別情報および前記位置情報を対応付けた情報とを含む頻度情報を取得し、
前記圧縮ファイルからデータを読み出し、読み出したデータと前記頻度情報とを基にして、伸長データを生成する、
各処理を実行することを特徴とする伸長方法。
(付記12)前記第1データおよび出現頻度と、前記位置情報の出現頻度とを構造に反映した、前記1データまたは前記位置情報を葉に含むハフマン木を、前記頻度情報より生成可能であり、
前記ハフマン木の前記第1データを含む葉には第1識別子が格納され、前記位置情報を含む葉には第2識別子が格納されており、
前記伸長する処理は、伸長対象のデータを読み出して前記ハフマン木を辿り、データに対応する前記ハフマン木の葉を特定し、特定したハフマン木の葉に第1識別情報が含まれているか第2識別情報が含まれているかを判定し、
第1識別子が含まれている場合には、葉に含まれるデータを出力し
第2識別子が含まれている場合には、葉に含まれる位置情報に基づいてデータを出力することを特徴とする付記11に記載の伸長方法。
(付記13)あるデータに対して最長一致文字列検索をおこない、検索された最長一致文字列のうち所定長未満となる第1データそれぞれの出現頻度と、最長一致文字列のうち所定長以上となる第2データの位置情報それぞれの出現頻度とを基にして、圧縮符号、第1識別情報および前記第1データをそれぞれ対応付けた情報と、圧縮符号、第2識別情報および前記位置情報を対応付けた情報とを含む頻度情報を生成する生成部と、
圧縮対象のデータに対して最長一致文字列検索をおこない、最長一致文字列が所定長未満の場合には、前記頻度情報に含まれる第1データのうち、前記最長一致文字列の第1データに対応付けられた圧縮符号を出力し、前記最長一致文字列が所定長以上の場合には、前記頻度情報に含まれる第2データの位置情報のうち、前記最長一致文字列の位置情報と一致する位置情報に対応付けられた圧縮符号、および、前記頻度情報に含まれる第1データのうち、最長一致文字列の長さの情報に対応付けられた圧縮符号を出力する符号化部と
を有することを特徴とする圧縮装置。
(付記14)前記生成部は、前記第1データおよび該第1データの出現頻度と、スライド窓の先頭から前記第2データまでの位置情報を縮約した情報および前記位置情報の出現頻度とを含むハフマン木を生成することを特徴とする付記13に記載の圧縮装置。
(付記15)符号化部は、前記スライド窓の先頭から前記第2データが出現するまでの位置をnビット固定長で表現した場合における先頭ビットから1または0が連続する数を示す連続数を、前記縮約した情報として前記ハフマン木の葉に格納することを特徴とする付記12に記載の圧縮装置。
(付記16)前記圧縮対象のデータから出力される圧縮ファイルの一部に、前記ハフマン木に対応した出現頻度情報を含むことを特徴とする付記14に記載の圧縮装置。
(付記17)入力した圧縮ファイルの一部から、所定長未満となる第1データの出現頻度と、各最長一致文字列のうち所定長以上となる第2データの位置情報の出現頻度とを基にして生成された、圧縮符号、第1識別情報および前記第1データを対応付けた情報と、圧縮符号、第2識別情報および前記位置情報を対応付けた情報とを含む頻度情報を取得し、前記圧縮ファイルからデータを読み出し、読み出したデータと前記頻度情報とを基にして、伸長データを生成する伸長部
を有することを特長とする伸長装置。
(付記18)前記第1データおよび出現頻度と、前記位置情報の出現頻度とを構造に反映した、前記1データまたは前記位置情報を葉に含むハフマン木を、前記頻度情報より生成可能であり、前記ハフマン木の前記第1データを含む葉には第1識別子が格納され、前記位置情報を含む葉には第2識別子が格納されており、
前記伸長部は、伸長対象のデータを読み出して前記ハフマン木を辿り、データに対応する前記ハフマン木の葉を特定し、特定したハフマン木の葉に第1識別情報が含まれているか第2識別情報が含まれているかを判定し、
第1識別子が含まれている場合には、葉に含まれるデータを出力し
第2識別子が含まれている場合には、葉に含まれる位置情報に基づいてデータを出力することを特徴とする付記17に記載の伸長装置。