(57)【特許請求の範囲】
【請求項１】
コンピュータに、
圧縮対象のデータ列から抽出されたデータのうち、処理対象となるデータと最も長く一致する一致データのデータ長が所定長未満の場合に、前記一致データに含まれる文字データおよび前記一致データのデータ長のうち前記一致データに含まれる文字データに対応するコードの出現頻度を取得し、前記一致データのデータ長が所定長以上の場合に、前記文字データおよび前記一致データのデータ長のうち前記一致データのデータ長に対応するコードの出現頻度を取得し、
前記文字データの出現頻度および前記一致データのデータ長の出現頻度を合算した頻度に基づいて生成された、木の葉のそれぞれに前記文字データおよび前記一致データのデータ長に対応するコードを割り当てた木を用いて前記圧縮対象のデータ列を圧縮する
処理を実行させることを特徴とする圧縮プログラム。
【請求項２】
圧縮対象のデータ列から抽出されたデータのうち、処理対象となるデータと最も長く一致する一致データのデータ長が所定長未満の場合に、前記一致データに含まれる文字データおよび前記一致データのデータ長のうち前記一致データに含まれる文字データに対応するコードの出現頻度を取得し、前記一致データのデータ長が所定長以上の場合に、前記文字データおよび前記一致データのデータ長のうち前記一致データのデータ長に対応するコードの出現頻度を取得し、
前記文字データの出現頻度および前記一致データのデータ長の出現頻度を合算した頻度に基づいて生成された、木の葉のそれぞれに前記文字データおよび前記一致データのデータ長に対応するコードを割り当てた木を用いて前記圧縮対象のデータ列を圧縮する
処理をコンピュータが実行することを特徴とする圧縮方法。
【請求項３】
圧縮対象のデータ列から抽出されたデータのうち、処理対象となるデータと最も長く一致する一致データのデータ長が所定長未満の場合に、前記一致データに含まれる文字データおよび前記一致データのデータ長のうち前記一致データに含まれる文字データに対応するコードの出現頻度を取得し、前記一致データのデータ長が所定長以上の場合に、前記文字データおよび前記一致データのデータ長のうち前記一致データのデータ長に対応するコードの出現頻度を取得する取得部と、
前記文字データの出現頻度および前記一致データのデータ長の出現頻度を合算した頻度に基づいて生成された、木の葉のそれぞれに前記文字データおよび前記一致データのデータ長に対応するコードを割り当てた木を用いて前記圧縮対象のデータ列を圧縮する圧縮部と、
を有することを特徴とする圧縮装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、圧縮プログラム、圧縮方法および圧縮装置に関する。
【背景技術】
【０００２】
データに対して、文字の出現頻度を集計した後、最長一致文字列検索をおこない、その結果に応じて、データを圧縮する技術がある。例えば、ＺＩＰは、１段目に文字の出現頻度の集計とハフマン木の生成を行い、２段目にＬＺ７７とハフマン圧縮を行う圧縮技術である。
【０００３】
ＬＺ７７系圧縮では、スライド窓で最長一致文字列探索を行い、その結果に応じて、圧縮符号に識別ビットを設け、文字、または、文字列の位置と長さに対し、前記のハフマンを利用して、ハフマン符号化を行う。以下の説明では、最長一致文字列検索によって得られる文字列を、最長一致データと表記する。
【０００４】
例えば、スライド窓で最長一致文字列検索を行った結果、最長一致データが３バイト未満の場合には、識別ビット「０」と、１バイト文字コードの２進数表現とを対応付けたものを、ハフマン木を用いて、可変長の圧縮符号として出力する。これに対して、最長一致データが３バイト以上の場合には、識別ビット「１」と、最長一致データの位置と長さとを対応付けたものを、それぞれ同様に、可変長の圧縮符号として出力する。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開平０５−２４１７７７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
従来、スライド窓を利用した文字の出現頻度集計とハフマン木の生成に関して、最長一致文字列の長さの出現頻度が集計されていない。したがって、最長一致文字列の長さに対して出現頻度に応じた最適な圧縮符号が割り当てられていないため、圧縮率が低下するという問題があった。
【０００７】
一つの側面では、ファイルの圧縮率を向上させる圧縮プログラム、圧縮方法および圧縮装置を提供することを目的とする。
【課題を解決するための手段】
【０００８】
第１の案では、圧縮プログラムはコンピュータに、下記の処理を実行させる。コンピュータに圧縮対象のデータに対して、スライド窓を利用し、最長一致文字列検索を行わせ、最長一致文字列の長さの頻度と文字の頻度を集計し、それぞれを合算した頻度をもとにハフマン木を生成させる。コンピュータに、ＬＺ７７系圧縮として、最長一致文字列検索を行い、圧縮符号となる文字、または、文字列の位置と長さの２進数を抽出し、ハフマン木を用いて、可変長の圧縮符号を割り当て、圧縮データを出力する。
【発明の効果】
【０００９】
本発明の１実施態様によれば、ファイルの圧縮率を改善できるという効果を奏する。
【図面の簡単な説明】
【００１０】
【図１】図１は、参考例１で集計される文字の出現回数と範囲を説明するための図である。
【図２】図２は、参考例１で生成されるハフマン木の一例を示す図である。
【図３】図３は、圧縮処理の流れを説明するための図である。
【図４】図４は、伸張処理の流れを説明するための図である。
【図５】図５は、参考例の情報処理装置の各処理部と記憶部との関係を説明するための図である。
【図６】図６は、参考例１の情報処理装置の圧縮に係るシステム構成の例を示す図である。
【図７】図７は、参考例１のハフマン符号の符号長を説明するための第１の図である。
【図８】図８は、参考例１のハフマン符号の符号長を説明するための第２の図である。
【図９】図９は、伸長部の構成の参考例を示す機能ブロック図である。
【図１０】図１０は、本実施例で集計される文字と長さの出現回数と範囲を説明するための図である。
【図１１】図１１は、実施例１で生成されるハフマン木の第１の例を示す図である。
【図１２】図１２は、実施例１の情報処理装置の各処理部と記憶部との関係を説明するための図である。
【図１３】図１３は、実施例１の情報処理装置の圧縮に係るシステム構成の例を示す図である。
【図１４】図１４は、圧縮処理全体の流れの例を示すフロー図である。
【図１５】図１５は、頻度計算の処理の流れの例を示すフロー図である。
【図１６】図１６は、コード変換表を作成する処理の流れの例を示す図である。
【図１７】図１７は、実施例１のハフマン符号の符号長を説明するための第１の図である。
【図１８】図１８は、実施例１のハフマン符号の符号長を説明するための第２の図である。
【図１９】図１９は、本実施例に係る伸長部の構成を示す機能ブロック図である。
【図２０】図２０は、伸長処理の流れの例を示すフロー図である。
【図２１】図２１は、実施例１の情報処理装置のハードウェア構成を示す図である。
【図２２】図２２は、コンピュータで動作するプログラムの構成例を示す図である。
【図２３】図２３は、実施形態のシステムにおける装置の構成例を示す図である。
【発明を実施するための形態】
【００１１】
以下に、本願の開示する圧縮プログラム、圧縮方法および圧縮装置の実施例を図面に基づいて詳細に説明する。なお、この実施例によりこの発明が限定されるものではない。
【実施例１】
【００１２】
本発明の実施例を説明する前に、ＬＺ７７を用いた圧縮技術、および伸長技術の参考例について説明する。
【００１３】
（参考例１における文字の出現頻度の集計）
図１は、参考例１で集計される文字の出現頻度とその範囲を説明するための図である。図１の例に示すように、参考例１に係る情報処理装置１００ａがソースファイルＦ１を記憶領域Ａ２にリードする。記憶領域Ａ２には、「１ｓｔ  ｈｏｒｓｅ」という文字列が含まれる。
【００１４】
記憶領域Ａ２は、例えば、スライド窓の参照部である。記憶領域Ａ２は、「１ｓｔ  ｈｏｒｓｅ」という文字列を含む。情報処理装置１００ａは、記憶領域Ａ２内に格納された１バイトの各文字の出現回数をカウントする。例えば、情報処理装置１００ａは、「１ｓｔ  ｈｏｒｓｅ」に含まれる文字「１」「ｓ」「ｔ」「（スペース）」「ｈ」「ｏ」「ｒ」「ｓ」「ｅ」の各文字の出現回数をカウントする。情報処理装置１００ａは、スライド窓Ａ２内の各文字の出現回数カウントが終了すると、処理の高速化のため、集計処理を打ち切る。なお、記憶領域Ａ２を繰返し使用してソースファイルF１の全ての文字の出現回数をカウントし、圧縮率の向上を図ることもできる。
【００１５】
情報処理装置１００ａは、各文字の出現回数に基づいて出現回数表Ｈ１を生成する。図１の例に示すように、出現回数表Ｈ１は、文字とそのコードと、出現回数とを対応付ける。例えば、文字の列の「００ｈ（ＮＵＬ）」は、コード「００ｈ」と制御文字「ＮＵＬ」とを表す。また、「６１ｈ（ａ）」は、コード「６１ｈ」と英小文字「ａ」を表す。出現回数の列は、各文字の出現回数を表す。
【００１６】
情報処理装置１００ａは、生成した文字回数表Ｈ１に基づいてハフマン木を生成する。図２は、参考例１で生成されるハフマン木の一例を示す図である。図２の例のように、参考例１で生成されたハフマン木１０は、根１１と、節点１２ａ〜１２ｆと、葉１３ａ〜１３ｄを有する。節点１２ａ〜１２ｆは、節点のデータ構造１０ａに示されるように上位節点へのポインタ、下位の左および右の節点または葉のポインタを有する。葉１３ａ〜１３ｄは、葉のデータ構造１０ｂに示されるように葉の識別子、予備情報、文字コードまたは最長一致文字列の長さとを有する。
【００１７】
頻度表Ｈ２ａは、葉１３ａ〜１３ｄのそれぞれのコードと文字と、その頻度（実際）と符号長と、を対応付ける。
【００１８】
情報処理装置１００ａは、文字の出現頻度に基づいて符号長を求める。具体的には、情報処理装置１００ａは、葉のテーブル２４においてコードと文字と、その頻度（実際）に基づいて符号長を算出する。頻度（実際）は、出現回数表Ｈ１に格納されている文字の出現回数を基に算出された各文字の頻度である。
【００１９】
例えば、情報処理装置１００ａは、葉２３ａにおいて文字「ｅ」の出現頻度「０．１１０４」に基づいて、コード「６５ｈ」に符号長「３」を割当てる。また、情報処理装置１００ａは、葉２３ｃにおいて文字「ＮＵＬ」の出現頻度「０．０００１２１」に基づいて、コード「００ｈ」に符号長「１２」を割当てる。このように、情報処理装置１００ａは、文字の出現頻度の高さに応じて短い符号長を割当てることで、圧縮率が向上する。
【００２０】
（圧縮処理に関して）
参考例１に係る情報処理装置１００ａは、生成したハフマン木１０を用いてファイルの圧縮処理を行う。図３は、圧縮処理の流れを説明するための図である。参考例１に係る情報処理装置１００ａによって、記憶領域Ａ１、記憶領域Ａ２および記憶領域Ａ３が例えばメモリ内に確保される。記憶領域Ａ１は、例えば、符号化部と呼ばれる。ファイルＦ１には、「・・・１ｓｔ  ｈｏｒｓｅ・・・２ｎｄ  ｈｏｒｓｅ・・・３ｒｄ  ｈｏｒｓｅ・・・」というコンテンツのデータを含んでおり、ファイルＦ１内のデータが順次、記憶領域Ａ１にロードされる。記憶領域Ａ１にロードされたデータに対して圧縮処理がおこなわれた後、記憶領域Ａ１にロードされたデータは記憶領域Ａ２にコピーされる。記憶領域Ａ２は、例えば、参照部と呼ばれる。
【００２１】
情報処理装置１００ａは、圧縮処理において記憶領域Ａ１のデータと記憶領域Ａ２のデータとを照合し、照合結果に応じて圧縮データを生成する。情報処理装置１００ａは、生成された圧縮データを、順次記憶領域Ａ３に格納する。情報処理装置１００ａは、記憶領域Ａ３に格納された圧縮データに基づいて圧縮ファイルＦ２を生成する。なお、ファイルＦ１に含まれる同一単語「ｈｏｒｓｅ」を区別するため、「１ｓｔ  ｈｏｒｓｅ」の「ｈｏｒｓｅ」上部に「△」、「２ｎｄ  ｈｏｒｓｅ」の「ｈｏｒｓｅ」上部に「○」、「３ｒｄ  ｈｏｒｓｅ」の「ｈｏｒｓｅ」上部に「□」を付す。また、ファイルＦ１に表した「・・・」は不特定な文字列である。また、記憶領域Ａ３に表した「＊」は、圧縮符号である。
【００２２】
図３の（i）の例に係る圧縮データｄ１の生成について説明する。まず、情報処理装置１００ａは、記憶領域Ａ１に含まれる「ｈｏｒｓｅ・・・」と一致する最長一致文字列を、記憶領域Ａ２内において検索する（図３に示す「照合」）。図３の（i）の例では、記憶領域Ａ１の先頭の「ｈ」と一致するデータが記憶領域Ａ２内に存在しないので、最長一致文字列の長さは０バイトである。情報処理装置１００ａは、最長一致文字列の長さが３バイト未満の場合、ハフマン木１０を参照し、記憶領域Ａ１の先頭の文字を、ハフマン符号に変換する。図３の（i）の例では、情報処理装置１００ａは、記憶領域Ａ１の「ｈ」をハフマン符号に変換し、圧縮データｄ１を生成する。なお、情報処理装置１００ａは、記憶領域Ａ１の先頭文字を圧縮したことを示す識別子「０」を圧縮データｄ１に含ませる。
【００２３】
図３の（ii）の例に係る圧縮データｄ２の生成について説明する。まず、情報処理装置１００ａは、記憶領域Ａ１に含まれる「ｈｏｒｓｅ・・・」と一致する最長一致文字列を、記憶領域Ａ２内において検索する（図３に示す「照合」）。図３の（ii）の例では、記憶領域Ａ１の△が付された「ｈｏｒｓｅ」と、記憶領域Ａ２の○が付された「ｈｏｒｓｅ」とが一致するので、５バイトの文字列「ｈｏｒｓｅ」が最長一致文字列となる。情報処理装置１００ａは、最長一致文字列の長さが３バイト以上の場合、識別子「１」と、記憶領域Ａ２における最長一致文字列の位置と、最長一致文字列の長さのハフマン符号とを有する圧縮データｄ２を生成する。識別子「１」は、圧縮データが最長一致文字列の位置および長さに基づく圧縮データであることを表す。情報処理装置１００ａは、ハフマン木１０を参照し、最長一致文字列の長さをハフマン符号に変換する。図３の（ii）の例では、情報処理装置１００ａは、識別子「１」と、「ｈｏｒｓｅ」の位置と、「ｈｏｒｓｅ」の長さ「５」のハフマン符号とを含む圧縮データｄ２を生成する。
【００２４】
図３の（iii）の例に係る圧縮データｄ３の生成について説明する。まず、情報処理装置１００ａは、記憶領域Ａ１に含まれる「ｈｏｒｓｅ・・・」と一致する最長一致文字列を記憶領域Ａ２内において検索する（図３に示す「照合」）。図３の（iii）の例では、記憶領域Ａ２の△または○が付された「ｈｏｒｓｅ」と、記憶領域Ａ１の□が付された「ｈｏｒｓｅ」とが一致するので、５バイトの文字列「ｈｏｒｓｅ」が最長一致文字列となる。情報処理装置１００ａは、最長一致文字列の長さが３バイト以上であるので、（ii）の例と同様に、識別子「１」と、「ｈｏｒｓｅ」の位置と、「ｈｏｒｓｅ」の長さ「５」のハフマン符号とを有する圧縮データｄ３を生成する。
【００２５】
情報処理装置１００ａは、スライド窓を利用して、文字の出現回数を集計し、その頻度をもとに符号長を算出する。最長一致文字列の長さが３バイト未満の場合は、１バイトの各文字に分解され、識別子「０」と文字の出現頻度に対応したハフマン符号が生成されるため、圧縮率の向上が図れる。
【００２６】
しかし、最長一致文字列の長さに対しては、その出現回数が集計されておらず、その頻度をもとに、符号長を算出することができない。このため、情報処理装置１００ａは、出現頻度の高い最長一致文字列の長さに対して、そのコードに該当する、出現頻度の低い文字に応じて、長い符号長を割当てる場合が発生し、ファイルの圧縮率が低下する。例えば、長さ「３」の頻度（仮想）は０．０８９１で、符号長は３に対して、そのコード「００ｈ」に該当する文字「ＮＵＬ」の頻度（実際）は０．０００１２１であり、符号長１２が割り当てられる。
【００２７】
（伸張処理に関して）
情報処理装置１００ａは、生成したハフマン木を基にしてファイルを伸長する処理を行う。図４は、伸張処理の流れを説明するための図である。情報処理装置１００ａは、圧縮ファイルＦ２内の圧縮データを順次記憶領域Ｂ１にロードする。記憶領域Ｂ１は、例えば符号化部と呼ばれる。情報処理装置１００ａは、圧縮データを含む圧縮ファイルＦ２の圧縮データに対して伸張処理を行い、伸長データを生成する。情報処理装置１００ａは、生成した伸長データを、記憶領域Ｂ２と記憶領域Ｂ３にコピーする。記憶領域Ｂ２は、例えば参照部と呼ばれる。そして、情報処理装置１００ａは、記憶領域Ｂ３に収集された伸長データに基づいて伸長ファイルＦ３を生成する。なお、図４の「＊」は、圧縮されたデータである。
【００２８】
例えば、図４の(iv)の例では、以下のようにして伸張処理がおこなわれる。図４の(iv)の例に示される記憶領域Ｂ１の圧縮データｄ１「＊＊＊＊」が伸張処理の対象である。圧縮データｄ１は、文字を圧縮した場合に付される識別子「０」と、「ｈ」のハフマン符号とを有する。情報処理装置１００ａは、識別子が「０」である場合、ハフマン木１０を参照し、ハフマン符号に対応する伸長文字（文字データ）を取得する。(iv)の例では、情報処理装置１００ａは、ハフマン木１０から伸長文字「ｈ」を取得する。そして、情報処理装置１００ａは、取得した伸長文字「ｈ」を、記憶領域Ｂ２と記憶領域Ｂ３とにコピーする。
【００２９】
図４の(v)の例では、以下のようにして伸張処理がおこなわれる。図４の(v)の例に示される記憶領域Ｂ１の圧縮データｄ１「＊＊＊＊」が伸張処理の対象である。圧縮データｄ２は、識別子「１」と、記憶領域Ｂ２における最長一致文字列の位置と、最長一致文字列の長さのハフマン符号とを有する。識別子「１」は、圧縮データが最長一致文字列の位置および長さに基づく圧縮データであることを表す。(v)の例では、情報処理装置１００ａは、ハフマン木１０から最長一致文字列の長さ「５」を取得する。そして、情報処理装置１００ａは、記憶領域Ｂ２における最長一致文字列の位置と、最長一致文字列の長さ「５」に基づいて記憶領域Ｂ２から最長一致文字列「ｈｏｒｓｅ」を取得し、記憶領域Ｂ１の圧縮データｄ１「＊＊＊＊」と置き換える。情報処理装置１００ａは、記憶領域Ｂ１で置き換えられた「ｈｏｒｓｅ」を、記憶領域Ｂ２と記憶領域Ｂ３とにコピーする。
【００３０】
図４の(vi)の例では、以下のようにして伸張処理がおこなわれる。図４の(vi)の例に示される記憶領域Ｂ１の圧縮データｄ１「＊＊＊＊」が伸張処理の対象である。圧縮データｄ３は、識別子「１」と、記憶領域Ｂ２における最長一致文字列の位置と、最長一致文字列の長さのハフマン符号とを有する。情報処理装置１００ａは、(v)の例と同様にして最長一致文字列「ｈｏｒｓｅ」を圧縮データｄ３と置き換え、記憶領域Ｂ１で置き換えられた「ｈｏｒｓｅ」を記憶領域Ｂ２と記憶領域Ｂ３とにコピーする。
【００３１】
（情報処理装置の各処理部と記憶部との関係）
図５は、情報処理装置の各処理部と記憶部との関係を説明するための図である。図５の例に示すように、情報処理装置１００ａの記憶部４００ａは、圧縮部２００ａと伸張部３００ａとに接続される。記憶部４００ａは例えば、ＲＡＭ（Random  Access  Memory）、ＲＯＭ（Read  Only  Memory）、フラッシュメモリなどの半導体メモリ素子、ハードディスクや光ディスクなどの記憶装置に対応する。記憶部４００ａは、例えば、後述する図６の第１記憶領域２１６および第２記憶領域２２９に対応する。
【００３２】
また、情報処理装置１００ａは、圧縮部２００ａと、伸張部３００ａとを有する。圧縮部２００ａおよび伸張部３００ａの機能は例えば、ＡＳＩＣ（Application  Specific  Integrated  Circuit）やＦＰＧＡ（Field  Programmable  Gate  Array）などの集積回路により実現することができる。また、圧縮部２００ａおよび伸張部３００ａの機能は例えば、ＣＰＵ（Central  Processing  Unit）が所定のプログラムを実行することで実現することができる。圧縮部２００ａは、例えば、後述する図６の第１段階処理部２１０および第２段階処理部２２０の各処理部に対応する。
【００３３】
（参考例１に係る圧縮部２００ａのシステム構成）
図６は、参考例１の情報処理装置の圧縮に係るシステム構成の例を示す図である。図６の例に示されるように、圧縮部２００ａは、第１段階処理部２１０と、第２段階処理部２２０とを有する。第１段階処理部２１０は、第１ファイルリード部２１１、文字頻度集計部２１２、頻度表生成部２１３、ハフマン木生成部２１４、頻度表格納部２１５、および第１記憶領域２１６を含む。一方、第２段階処理部２２０は、第２ファイルリード部２２１、最長一致文字列探索部２２２、第１符号化部２２３、第２符号化部２２４、識別ビット生成部２２５および参照部更新部２２６を含む。さらに、第２段階処理部２２０は、ファイルライト部２２７および第２記憶領域２２９を含む。なお、第１ファイルリード部２１１と第２ファイルリード部２２１とは、同じ構成であってもよい。
【００３４】
第１段階処理部２１０は、各文字の出現回数を集計して出現回数表Ｈ１を生成し、出現回数表Ｈ１に基づいてハフマン木を作成する処理部である。第１段階処理部２１０に含まれる各部について説明する。
【００３５】
第１ファイルリード部２１１は、所定の記憶領域に圧縮対象となるファイルＦ１のコンテンツ部分を読み出す処理部である。第１ファイルリード部２１１は、ファイルＦ１のコンテンツ部分を、スライド窓の参照部に対応する記憶領域Ａ２にリードする。ここでは、記憶領域Ａ２は、第１記憶領域２１６に存在するものとする。第１ファイルリード部２１１は、記憶領域Ａ２における集計処理が完了すると、リード処理を打ち切る。
【００３６】
出現回数集計部２１２は、第１ファイルリード部２１１によって記憶領域Ａ２に読み出されたコンテンツを参照し、文字毎に文字の出現回数を集計する処理部である。出現回数集計部２１２は、集計が完了すると、集計結果を頻度表生成部２１３に出力する。
【００３７】
頻度表生成部２１３は、出現回数集計部２１２から取得する各文字の出現回数の集計結果を基にして、頻度表Ｈ２ａを生成する処理部である。頻度表Ｈ２ａは、文字の出現回数の合計をもとに、各文字に文字の頻度を対応付ける。頻度表Ｈ２ａは、２５６のレコードを有する。頻度表生成部２１３は、頻度表Ｈ２ａの情報を、ハフマン木生成部２１４と頻度表格納部２１５に出力する。
【００３８】
ハフマン木生成部２１４は、頻度表Ｈ２ａに基づいてハフマン木を生成する処理部である。ハフマン木生成部２１４は、２５６個の葉の構造体を作成し、頻度表Ｈ２ａに基づいて、各葉のコードと文字、その頻度と符号長とを割り当てる。
【００３９】
ハフマン木生成部２１４は、文字の出現頻度の順にソートして配置し、各々の文字の出現頻度に応じて枝を生成する。例えば、ハフマン木は、図２に示したハフマン木１０に対応した根と節点、枝と葉を持つ。根と節点の構造体は、上位の節点へのポインタ、下位の左と右の節点へのポインタ、または、葉のデータが格納される。
【００４０】
頻度表格納部２１５は、頻度表Ｈ２ａの内容をファイルＦ２のヘッダ部に格納する。
【００４１】
第２段階処理部２２０は、第１段階処理部２１０によって生成されたハフマン木に基づいてファイルＦ１を圧縮する処理部である。第２段階処理部２２０に含まれる各部の処理について説明する。第２ファイルリード部２２１は、ファイルＦ１内のコンテンツ部分のデータを、符号化部に対応する記憶領域Ａ１に読み出す処理部である。第２ファイルリード部２２１は、記憶領域Ａ１に格納されたデータに対する処理が終了し、記憶領域Ａ１のデータが参照部である記憶領域Ａ２に移行し、圧縮符号が格納された記憶領域Ａ３のデータを圧縮ファイルＦ２へ書き込んだ後に、新たなデータをファイルＦ１から読み出し、記憶領域Ａ１に格納されたデータを更新する。
【００４２】
最長一致文字探索部２２２は、参照部となる記憶領域Ａ２に格納されたデータと、符号化部となる記憶領域Ａ１に格納されたデータとを比較して、最長一致文字列を検索する処理部である。最長一致文字列を検索する処理は、図３に示した処理と同様である。最長一致文字探索部１０６は、最長一致文字列の位置および長さを、第１符号化部２２３、第２符号化部２２４、識別ビット生成部２２５に出力する。
【００４３】
第１符号化部２２３は、最長一致文字列の長さが３バイト未満の場合に処理を行う。第１符号化部２２３は、最長一致文字列の長さが３バイト未満の場合に、それぞれ、１バイトの文字データと、ハフマン木１０とを比較して、文字データのハフマン符号を特定する。第１符号化部２２３は、ハフマン符号と、識別ビット生成部２２５から取得する識別ビットとを合わせた圧縮データを、記憶領域Ａ３に格納し、ファイルライト部２２７に出力する。
【００４４】
第２符号化部２２４は、最長一致文字列の長さが３バイト以上の場合に処理を行う。第２符号化部２２４は、最長一致文字列の長さが３バイト以上の場合に、最長一致文字列の記憶領域Ａ２での先頭からの位置と、最長一致文字列の長さとを特定する。第２符号化部２２４は、最長一致文字列の長さとハフマン木１０とを比較して、最長一致文字列の長さのハフマン符号を特定する。第２符号化部２２４は、最長一致文字列の位置と、最長一致文字列の長さのハフマン符号と、識別ビットとを合わせた圧縮データを、記憶領域Ａ３に格納し、ファイルライト部２２７に出力する。
【００４５】
識別ビット生成部２２５は、最長一致文字列の長さに基づいて、識別ビット「０」または識別ビット「１」を出力する処理部である。具体的に、識別ビット生成部２２５は、最長一致文字列の長さが３バイト未満である場合には、識別ビット「０」を第１符号化部２２３に出力する。これに対して、識別ビット生成部２２５は、最長一致文字列の長さが３バイト以上である場合には、識別ビット「１」を第２符号化部２２４に出力する。
【００４６】
参照部更新部２２６は、記憶領域Ａ１と記憶領域Ａ２との照合が完了した場合に、記憶領域Ａ１に格納されたデータを、記憶領域Ａ２に格納する処理部である。
【００４７】
ファイルライト部２２７は、最長一致文字列の長さが３バイト未満の場合に、識別ビット「０」と、第１符号化部２２３から出力されるハフマン符号とを合わせた圧縮データを、記憶領域Ａ３に書き込む。また、ファイルライト部２２７は、最長一致文字列の長さが３バイト以上の場合に、識別ビット「１」と、第２符号化部２２４から出力される最長一致文字列の位置および長さとを合わせた圧縮データを、記憶領域Ａ３に書き込む。
【００４８】
また、ファイルライト部２２７は、記憶領域Ａ１に対する処理が終了すると、記憶領域Ａ３のデータを圧縮ファイルＦ２に書き込む。
【００４９】
（文字および最長一致文字列の長さに割り当てられる符号長に関して）
図７を用いて、参考例１のハフマン木によって文字および最長一致文字列の長さに割り当てられる符号長について説明する。図７は、参考例１のハフマン符号の符号長を説明するための第１の図である。図７の例に示される頻度分布表１ａは、参考例１に係る情報処理装置１００ａによって集計されたコードの出現頻度を表す。頻度分布表１ａの縦軸は、各文字の出現頻度を表す。また、頻度分布表１ａの横軸には、出現頻度の高い文字から順に、英小字、数字、英大字、特殊文字、制御文字の文字が列挙される。
【００５０】
また、符号長分布表１ｂは、各文字に割り当てられる符号長を表す。符号長分布表１ｂの縦軸は、符号長を表す。符号長分布表１ｂの横軸は、頻度分布表１ａに対応する。
【００５１】
例えば、文字「ｅ」および最長一致文字列の長さ「１０４」に対応するコード「６５ｈ」には、文字の出現頻度に応じて、符号長分布表１ｂのように、符号長「３」が割り当てられる。また、文字「ＮＵＬ」および最長一致文字列の長さ「３」に対応するコード「００ｈ」には、符号長「１２」が割り当てられる。
【００５２】
頻度分布表２ａは、各文字の出現頻度と各最長一致文字列の長さの出現頻度とを表す。頻度分布表２ａの縦軸は、各文字または各最長一致文字列の長さの出現頻度を表す。また、頻度分布表２ａの横軸には、出現頻度の高い文字から順に、英小字、数字、英大字、特殊文字、制御文字の文字が列挙され、さらに最長一致文字列の長さが列挙される。頻度分布表２ａの実線は、各文字の出現頻度を表す。頻度分布表２ａの一点鎖線は、各最長一致文字列の長さの出現頻度を表す。なお、参考例１に係る圧縮部２００ａは、最長一致文字列の長さの出現頻度を集計しない。
【００５３】
符号長分布表２ｂは、各文字および各最長一致文字列の長さに割り当てられる符号長を表す。符号長分布表２ｂの縦軸は、符号長を表す。符号長分布表２ｂの横軸は、頻度分布表２ａに対応する。
【００５４】
上述したように圧縮部２００ａは、各コードに対して文字の出現頻度に応じた符号長を割り当てる。例えば、最長一致文字列の長さの中で出現頻度が最も高い「３」と制御文字「ＮＵＬ」とは、いずれもコード「００ｈ」に対応する。符号長分布表２ｂにおいて「３」および「ＮＵＬ」は、点Ｐｓに対応し、それぞれに割り当てられる符号長は「１２」となる。したがって、最長一致文字列の長さの出現頻度が高いにもかかわらず、符号長の長いハフマン符号が割当てられるのでファイルの圧縮率が低下する。
【００５５】
一方、符号長分布表１ｂに示される一点鎖線は、出現頻度が高い最長一致文字列の長さの出現頻度(仮想)に対して短い符号長を割り当てた場合の符号長を示す。本来、出現頻度が高いものに対して符号長の短い圧縮符号を割り当てることで圧縮率が向上する。例えば、参考例１においては、符号長分布表２ｂの実線のように出現頻度が高い最長一致文字列の長さに対して長い符号長が割り当てられるが、一点鎖線のように出現頻度(仮想)が高い最長一致文字列の長さに対して短い符号長を割り当てれば圧縮率が向上する。例えば、符号長分布表２ｂにおいて、実線では、最長一致文字列の長さ「３」の出現頻度(実際)に応じて、割り当てられる符号長が点Ｐｓの「１２」であるのに対して、一点鎖線では、出現頻度(仮想)に応じて、符号長が点Ｐｌの「３」に割り当てられる。
【００５６】
図８を用いて、参考例１のハフマン木によってＣＪＫ文字および最長一致文字列の長さに割り当てられる符号長について説明する。図８は、参考例１のハフマン符号の符号長を説明するための第２の図である。英数字は１バイト単位でコード化されるのに対し、ＵＴＦ−８のＣＪＫ文字は３バイト以上の単位でコード化される。１バイト単位に出現回数を集計するため、英数字に比べ、ＣＪＫ文字は頻度の偏りが無く、頻度分布もなだらかな曲線となる。図８の例に示される頻度分布表３ａは、参考例１に係る情報処理装置１００ａによって集計されたＣＪＫ文字（1byte）の出現頻度を表す。頻度分布表３ａの縦軸は、各々のＣＪＫ文字（1byte）の出現頻度を表す。ＣＪＫ文字（1byte）は、ＣＪＫ文字に含まれる１バイトのビット列である。また、頻度分布表３ａの横軸には、出現頻度の高いＣＪＫ文字（1byte）から順に列挙される。
【００５７】
また、符号長分布表３ｂは、各ＣＪＫ文字（1byte）に割り当てられる符号長を表す。符号長分布表３ｂの縦軸は、符号長を表す。符号長分布表３ｂの横軸には、出現頻度の高いＣＪＫ文字（1byte）から順に列挙される。
【００５８】
日本語テキストの場合、文字として、ひらがな、カタカナ、漢字が多く含まれる。例えば、ひらがなの「あ」文字は、ＵＴＦ−８コードでは、「ｅ３８１８２ｈ」にコード化されている。また、カタカナや漢字の多くも「ｅ３ｘｘｘｘｈ」にコード化されているため、１バイトのＣＪＫ文字としては、ｅ３ｈの出現頻度が比較的高い。具体的には、ＣＪＫ文字（1byte）Ａおよび最長一致文字列の長さ「２３０」に対応するコード「ｅ３ｈ」には、符号長分布表３ｂより符号長「６」が割り当てられる。
【００５９】
頻度分布表４ａは、各ＣＪＫ文字（1byte）の出現頻度と各最長一致文字列の長さの出現頻度とを表す。頻度分布表４ａの縦軸は、各々のＣＪＫ文字（1byte）の出現頻度を表す。また、頻度分布表４ａの横軸には、出現頻度の高いＣＪＫ文字（1byte）から順に列挙される。また、頻度分布表４ａの横軸には、最長一致文字列の長さが列挙される。頻度分布表４ａの実線は、各々のＣＪＫ文字（1byte）の出現頻度を表す。頻度分布表４ａの一点鎖線は、各々の最長一致文字列の長さの出現頻度を表す。なお、参考例１に係る圧縮部２００ａは、最長一致文字列の長さの出現頻度を集計しない。
【００６０】
符号長分布表４ｂは、各ＣＪＫ文字および各最長一致文字列の長さに割り当てられる符号長を表す。符号長分布表４ｂの縦軸は、符号長を表す。符号長分布表４ｂの横軸は、頻度分布表４ａに対応する。
【００６１】
上述したように圧縮部２００ａは、各コードに対してＣＪＫ文字の出現頻度に応じた符号長を割り当てる。このため、出現頻度の高い最長一致文字列の長さにも関わらず、長い符号長が割り当てられる場合がある。例えば、図８の例に示すように、最長一致文字列の長さの中で出現頻度が最も高い「３」と「ＣＪＫ文字（1byte）Ｂ」とは、いずれもコード「００ｈ」に対応する。「３」および「ＣＪＫ文字（1byte）Ｂ」は、点Ｑｓに対応し、符号長「１１」が割り当てられる。したがって、コードに対応する最長一致文字列の長さの出現頻度が高いにもかかわらず、コードに対して符号長の長いハフマン符号が割当てられるのでファイルの圧縮率が低下する。
【００６２】
一方、符号長分布表４ｂに示される一点鎖線は、出現頻度が高い最長一致文字列の長さの出現頻度(仮想)に対して、出現頻度に応じた短い符号長を割り当てた場合の符号長を示す。本来、出現頻度が高いものに対して符号長の短い圧縮符号を割り当てることで圧縮率が向上する。例えば、参考例１においては、符号長分布表４ｂの実線のように出現頻度が高い最長一致文字列の長さに対して長い符号長が割り当てられるが、一点鎖線のように出現頻度(仮想)が高い最長一致文字列の長さに対して短い符号長を割り当てれば圧縮率が向上する。例えば、符号長分布表４ｂにおいて、実線では、最長一致文字列の長さ「３」の出現頻度(実際)に応じて、割り当てられる符号長が点ＱＳの「１１」であるのに対して、一点鎖線では、現頻度(仮想)に応じて、符号長が点Ｑｌの「３」に割り当てられる。このように、出現頻度が高い最長一致文字列の長さに割り当てられる符号長が長くなるため、圧縮率が低下する。
【００６３】
（参考例１に係る伸長部３００ａのシステム構成）
次に伸長部３００ａの構成の一例について説明する。図９は、伸長部の構成の参考例を示す機能ブロック図である。図９に示すように、伸長部３００ａは、第１段階処理部３３０ａと第２段階処理部３４０ａとを有する。第１段階処理部３３０ａは、頻度表リード部３３１と、ハフマン木生成部３３２とを有する。第２段階処理部３４０ａは、ファイルリード部３４１と、圧縮符号識別部３４２と、第１伸長部３４３と、第２伸長部３４４と、参照部更新部３４５と、ファイルライト部３４６とを有する。
【００６４】
第１段階処理部３３０ａは、圧縮ファイルＦ２のヘッダ情報に含まれる頻度表を基にして、ハフマン木を生成する処理部である。第１段階処理部３３０ａに含まれる各処理部について説明する。
【００６５】
頻度表リード部３３１は、頻度表Ｈ２ａの情報を読み出して、ハフマン木生成部３３２に出力する処理部である。例えば、頻度表リード部３３１は、図６の頻度表生成部２１３によって生成された頻度表Ｈ２ａの情報を取得する。
【００６６】
ハフマン木生成部３３２は、頻度表Ｈ２ａを基にしてハフマン木を生成する処理部である。ハフマン木生成部３３２がハフマン木を生成する処理は、図６のハフマン木生成部２１４と同様である。
【００６７】
第２段階処理部３４０ａは、圧縮ファイルＦ２を伸長する処理部である。第２段階処理部３４０ａに含まれる各部の処理について説明する。
【００６８】
ファイルリード部３４１は、圧縮ファイルＦ２内の圧縮データを記憶領域Ｂ１に読み出す処理部である。ファイルリード部３４１は、記憶領域Ｂ１に格納された圧縮データに対する処理が終了した場合に、新たな圧縮データを圧縮ファイルＦ２から読み出し、記憶領域Ｂ１に格納された圧縮データを更新する。
【００６９】
圧縮符号識別部３４２は、記憶領域Ｂ１の圧縮データから、識別子を読み出し、識別子が「０」であるのか「１」であるのかを判定する処理部である。圧縮符号識別部３４２は、判定結果を、第１伸長部３４３および第２伸長部３４４に出力する。
【００７０】
第１伸長部３４３は、圧縮データの識別子が「０」である場合に処理を行う。第１伸長部３４３は、識別子が「０」である場合に、圧縮データの識別子以降のデータ列と、ハフマン木１０とを比較して、ハフマン木１０を辿り、到達した葉に含まれるデータを、伸長データとして復号する処理部である。第１伸長部３４３は、伸長データを、参照部である記憶領域Ｂ２、および記憶領域Ｂ３に格納し、参照部更新部３４５およびファイルライト部３４６に出力する。
【００７１】
第２伸長部３４４は、圧縮データの識別子が「１」である場合に処理を行う。第２伸長部３４４は、識別子が「１」である場合に、伸長データは、参照部である記憶領域Ｂ２内のデータが伸長データとなるため、記憶領域Ｂ２から伸長データを取り出す。
【００７２】
第２伸長部３４４は、伸長データを取り出すべく、最長一致文字列の格納された記憶領域Ｂ２の先頭からの位置と、最長一致文字列の長さを特定する。位置の情報は、圧縮データの識別子「１」以降の固定長（１６ｂｉｔ）の情報に対応する。また、長さの情報は、位置の情報以降の固定長（８ｂｉｔ）の情報に対応する。また、長さの情報は、ハフマン符号化されているため、第２伸長部３４４は、長さのハフマン符号と、ハフマン木１０とを比較して、ハフマン木１０を辿り、到達した葉に含まれる長さの情報を得る。
【００７３】
第２伸長部３４４は、位置と長さに対応するデータを参照部である記憶領域Ｂ２から取り出し、取り出したデータを伸長データとする。第２伸長部３４４は、伸長データを、参照部である記憶領域Ｂ２、および記憶領域Ｂ３に格納し、参照部更新部３４５およびファイルライト部３４６に出力する。
【００７４】
参照部更新部３４５は、第１伸長部３４３または第２伸長部３４４から伸長データを取得した場合に、伸長データによって、記憶領域Ｂ２を更新する処理部である。
【００７５】
ファイルライト部３４６は、第１伸長部３４３または第２伸長部３４４から伸長データを取得した場合に、伸長データを、記憶領域Ｂ３に格納し、ファイルＦ３に書き込む処理部である。
【００７６】
（実施例１における文字と最長一致文字列の長さの出現回数の集計）
図１０を用いて実施例１における出現回数表Ｈ１１ｂおよび出現回数表Ｈ１２ｂの生成について説明する。図１０は、本実施例で集計される文字と長さの出現回数と範囲を説明するための図である。図１０の例に示すように、実施例１に係る情報処理装置１００ｂがソースファイルＦ１を記憶領域Ａ１にリードする。ファイルＦ１は、「△ｈｏｒｓｅ△」という文字列を複数含む。
【００７７】
一方、情報処理装置１００ｂは、記憶領域Ａ１にデータをリードし、記憶領域Ａ２と最長一致文字列検索を行い、文字と最長一致文字列の長さの出現回数を集計する。記憶領域Ａ１は、例えば、スライド窓の符号化部である。また、記憶領域Ａ２は、例えば、スライド窓の参照部である。図１０の例において記憶領域Ａ１および記憶領域Ａ２には、いずれにも「△ｈｏｒｓｅ△」という文字列が含まれているとする。情報処理装置１００ｂは、例えば、最長一致文字列「△ｈｏｒｓｅ△」の長さ「７」に対応するコード「０４ｈ」の出現回数をカウントする。なお、情報処理装置１００ｂは、仮に最長一致文字列の長さが３バイト未満の場合、記憶領域Ａ１内の文字の出現回数をカウントする。
【００７８】
情報処理装置１００ｂは、文字の出現回数または最長一致文字列の長さの出現回数をカウントする度に、ファイルＦ１から続きの部分のデータを記憶領域Ａ１にリードする。情報処理装置１００ｂは、カウントした各文字の出現回数に基づいて出現回数表Ｈ１１ｂを更新する。出現回数表Ｈ１１ｂは、文字毎の出現回数を保持する。図１の例に示すように、出現回数表Ｈ１１ｂは、文字と出現回数とを対応付ける。
【００７９】
情報処理装置１００ｂは、カウントした各最長一致文字列の長さの出現回数に基づいて出現回数表Ｈ１２ｂを更新する。出現回数表Ｈ１２ｂは、最長一致文字列の長さ毎の出現回数を保持する。長さの列において、「００ｈ（３）」は、コード「００ｈ」に対応する最長一致文字列の長さ「３」を表す。「０１ｈ（４）」は、コード「０１ｈ」に対応する最長一致文字列の長さ「４」を表す。なお、以降の説明では、最長一致文字列の長さを、長さと呼ぶことがある。
【００８０】
（実施例１におけるハフマン木の生成に関して）
情報処理装置１００ｂは、出現回数表Ｈ１１ｂおよび出現回数表Ｈ１２ｂに基づいてハフマン木を生成する。図１１は、実施例１で生成されるハフマン木の第１の例を示す図である。図１１の例のように、実施例１で生成されたハフマン木２０は、根２１と、節点２２ａ〜２２ｆと、葉２３ａ〜２３ｅとを有する。節点２２ａ〜２２ｅは、節点のデータ構造２０ａに示されるように上位節点へのポインタ、下位の左および右の節点または葉のポインタを有する。葉２３ａ〜２３ｄは、葉のデータ構造１０ｂに示されるように葉の識別子、予備情報、文字コードまたは最長一致文字列の長さを有する。
【００８１】
また、頻度表Ｈ２ｂは、葉２２ａ〜２２ｅのそれぞれのコードとその頻度（実際）と符号長と、コードに対応する文字とその頻度（小計）と、コードに対応する最長一致文字列の長さとその頻度（小計）と、を対応付ける。例えば、葉２３ａは、コードが「６５ｈ」、該コードの頻度（合計）が「０．１１０４０３」、該コードの符号長が「３」であることを表す。また、葉２３ａは、コード「６５ｈ」に対応する文字が「ｅ」、該文字「ｅ」の頻度（小計）が「０．１１０４」であることを表す。また、葉２３ａは、コード「６５ｈ」に対応する長さが「１０４」、該長さ「１０４」の頻度（小計）が「０．０００００３」であることを表す。
【００８２】
ここで、１つのコードは、１つの文字を表すとともに、１つの最長一致文字列の長さを表す。例えば、コード「６５ｈ」は、文字「ｅ」と長さ「１０４」とを表す。また、コード「６１ｈ」は、文字「ａ」と長さ「１００」とを表す。
【００８３】
情報処理装置１００ｂは、文字の出現頻度（小計）と長さの出現頻度（小計）とを合算した出現頻度（実際）に基づいて、コードに符号長を割当てる。例えば、情報処理装置１００ｂは、文字「ｅ」の出現頻度（小計）「０．１１０４」と長さ「１０４」の出現頻度（小計）「０．０００００３」とを合算してコード「６５ｈ」の出現頻度（実際）「０．１１０４０３」を求める。情報処理装置１００ｂは、コード「６５ｈ」の出現頻度（実際）「０．１１０４０３」に基づいて、コード「６５ｈ」に符号長「３」を割当てる。また、情報処理装置１００ｂは、文字「ＮＵＬ」の出現頻度（小計）「０．０００１２１」と長さ「３」の出現頻度（小計）「０．０８９１」とを合算してコード「００ｈ」の出現頻度（実際）「０．０８９２２１」を求める。情報処理装置１００ｂは、コード「００ｈ」の出現頻度（実際）「０．０８９２２１」に基づいて、コード「００ｈ」に符号長「３」を割当てる。このように、葉１３ｂにおいては、最長一致文字列の長さ「３」の出現頻度（小計）がコード「００ｈ」の出現頻度（実際）に反映されるので、出現頻度が高いコード「００ｈ」に対して短い符号長が割当てられる。
【００８４】
このように、情報処理装置１００ｂは、コードに対応する文字および長さの出現頻度（小計）を合算したコードの出現頻度（実際）に応じて符号長を割当てる。情報処理装置１００ｂは、最長一致文字列の長さの出現頻度（小計）をコードの出現頻度（実際）に反映するので、出現頻度が高いコードに割当てられる符号長が短くなり、圧縮率が向上する。
【００８５】
（情報処理装置の各処理部と記憶部との関係）
図１２は、実施例１の情報処理装置の各処理部と記憶部との関係を説明するための図である。図１２の例に示すように、情報処理装置１００ｂの記憶部４００ｂは、圧縮部２００ｂと伸張部３００ｂとに接続される。記憶部４００ｂは例えば、ＲＡＭ、ＲＯＭ、フラッシュメモリなどの半導体メモリ素子、ハードディスクや光ディスクなどの記憶装置に対応する。記憶部４００ｂは、例えば、後述する図１３の第１記憶領域２５８および第２記憶領域２６９に対応する。
【００８６】
また、情報処理装置１００ｂは、圧縮部２００ｂと、伸張部３００ｂとを有する。圧縮部２００ｂおよび伸張部３００ｂの機能は例えば、ＡＳＩＣやＦＰＧＡなどの集積回路により実現することができる。また、圧縮部２００ｂおよび伸張部３００ｂの機能は例えば、ＣＰＵが所定のプログラムを実行することで実現することができる。圧縮部２００ｂは、例えば、後述する図１３の第１段階処理部２５０および第２段階処理部２６０の各処理部に対応する。
【００８７】
（実施例１に係る圧縮部２００ｂのシステム構成）
図１３は、実施例１の情報処理装置の圧縮に係るシステム構成の例を示す図である。圧縮部２００ｂは、第１段階処理部２５０と、第２段階処理部２６０とを有する。第１段階処理部２５０は、第１ファイルリード部２５１、第１最長一致文字列探索部２５２、文字出現回数集計部２５３、長さ出現回数集計部２５４、頻度表生成部２５５、ハフマン木生成部２５６、頻度表格納部２５７および第１記憶領域２５８を含む。一方、第２段階処理部２６０は、第２ファイルリード部２６１、最長一致文字列探索部２６２、第１符号化部２６３、第２符号化部２６４、識別ビット生成部２６５および参照部更新部２６６を含む。さらに、第２段階処理部２６０は、ファイルライト部２６７および第２記憶領域２６９を含む。なお、第１ファイルリード部２５１と第２ファイルリード部２６１とは、同じ構成であってもよい。
【００８８】
第１ファイルリード部２５１は、所定の記憶領域に圧縮対象となるファイルＦ１のコンテンツ部分を読み出す処理部である。第１ファイルリード部２５１は、ファイルＦ１のコンテンツ部分を、スライド窓の参照部に対応する記憶領域Ａ１にリードする。記憶領域Ａ１にリードされたコンテンツは、後述する集計処理が完了する度に、記憶領域Ａ２に格納される。ここでは、記憶領域Ａ１および記憶領域Ａ２は、第１記憶領域２５８に存在するものとする。第１ファイルリード部２５１は、記憶領域Ａ１および記憶領域Ａ２における集計処理が完了すると、リード処理を打ち切る。
【００８９】
文字出現回数集計部２５３は、記憶領域Ａ１に格納されたコンテンツを参照し、記憶領域Ａ１に含まれる文字の出現回数を集計する処理部である。文字出現回数集計部２５３は、例えば、最長一致文字列の長さが３バイト未満の場合に処理を実行する。文字出現回数集計部２５３は、記憶領域Ａ１のデータが更新される度に、文字の出現回数を計数する。文字出現回数集計部２５３は、集計が完了すると、集計結果を頻度表生成部２５５に出力する。
【００９０】
第１最長一致文字列探索部２５２は、参照部となる記憶領域Ａ２に格納されたデータと、符号化部となる記憶領域Ａ１に格納されたデータとを比較して、最長一致文字列を探索する処理部である。第１最長一致文字列探索部２５２は、例えば、最長一致文字列の長さが３バイト以上の場合に処理を実行する。第１最長一致文字列検索部２５２は、記憶領域Ａ１のデータが更新される度に、最長一致文字列の長さを長さ出現回数集計部２５４に出力する。
【００９１】
長さ出現回数集計部２５４は、第１最長一致文字列探索部２５２によって出力された最長一致文字列の長さの出現回数を集計する処理部である。長さ出現回数集計部２５４は、第１最長一致文字列探索部２５２から出力された最長一致文字列の長さを基にして、各最長一致文字列の長さの出現回数を集計する。長さ出現回数集計部２５４は、集計が完了すると、集計結果を頻度表生成部２５５に出力する。
【００９２】
頻度表生成部２５５は、文字出現回数集計部２５３から取得する各文字の出現回数の集計結果を基にして、頻度表Ｈ１１ｂを生成する。また、頻度表生成部２５５は、長さ出現回数集計部２５４から取得する各長さの出現回数の集計結果を基にして、頻度表Ｈ１２ｂを生成する。頻度表生成部２５５は、文字の出現回数の合計をもとに、各文字に文字の頻度を対応付ける。また、頻度表生成部２５５は、長さの出現回数の合計をもとに、各長さに長さの頻度を対応付ける。頻度表Ｈ１１ｂおよびＨ１２ｂは、２５６のレコードを有する。頻度表生成部２５５は、頻度表Ｈ１１ｂおよび頻度表Ｈ１２ｂの情報を、ハフマン木生成部２５６と頻度表格納部２５７に出力する。
【００９３】
ハフマン木生成部２５６は、頻度表Ｈ１１ｂおよび頻度表Ｈ１２ｂに基づいて、ハフマン木２０を生成する処理部である。ハフマン木生成部２５６は、コードと、予備情報とを対応付けた葉の構造体を２５６個生成する。また、ハフマン木生成部２５６は、２５６個の葉の構造体を作成し、頻度表Ｈ１１ｂおよびＨ１２ｂに基づいて、各葉にコード、その頻度（合計）と符号長とを割り当てる。コードの出現頻度（合計）は、文字の出現頻度（小計）と長さの出現頻度（小計）を合算した値である。
【００９４】
ハフマン木生成部２５６は、コードの出現頻度（合計）の順にソートして葉を配置し、各々のコードの出現頻度に応じて枝を生成する。例えば、ハフマン木は、図１１に示したハフマン木２０に対応した根と節点、枝と葉を持つ。根と節点の構造体は、上位の節点へのポインタ、下位の左と右の節点へのポインタ、または、葉のデータが格納される。
【００９５】
頻度表格納部２５７は、頻度表１１ｂおよび頻度表Ｈ１２ｂの内容をファイルＦ２のヘッダ部に格納する。
【００９６】
第２段階処理部２６０は、ファイルＦ１を圧縮する処理部である。第２段階処理部２６０に含まれる各部の処理について説明する。第２ファイルリード部２６１は、ファイルＦ１内のコンテンツ部分のデータを、符号化部に対応する記憶領域Ａ１に読み出す処理部である。第２ファイルリード部２６１は、記憶領域Ａ１に格納されたデータに対する処理が終了し、記憶領域Ａ１のデータが参照部Ａ２に移行し、圧縮符号が格納された記憶領域Ａ３のデータをＦ２へ書き込んだ後に、新たなデータをファイルＦ１から読み出し、記憶領域Ａ１に格納されたデータを更新する。
【００９７】
第２最長一致文字探索部２６２は、参照部となる記憶領域Ａ２に格納された圧縮データと、記憶領域Ａ１に格納されたデータとを比較して、最長一致文字列を検索する処理部である。最長一致文字列を検索する処理は、図３に示した処理と同様である。第二最長一致文字探索部２６２は、最長一致文字列の位置および長さを、第１符号化部２６３、第２符号化部２６４、識別ビット生成部２６５に出力する。
【００９８】
第１符号化部２６３は、最長一致文字列の長さが３バイト未満の場合に処理を行う。第１符号化部２６３は、最長一致文字列の長さが３バイト未満の場合に、それぞれ、１バイトの文字データと、ハフマン木２０とを比較して、文字データのハフマン符号を特定する。第１符号化部２６３は、ハフマン符号を記憶領域Ａ３に格納し、ファイルライト部２６７に出力する。このハフマン符号そのものが、圧縮データとなる。
【００９９】
第２符号化部２６４は、最長一致文字列の長さが３バイト以上の場合に、処理を行う。第２符号化部２６４は、最長一致文字列の長さが３バイト以上の場合に、最長一致文字列の記憶領域Ａ２での先頭からの位置と、最長一致文字列の長さとを特定する。さらに、第２符号化部２６４は、最長一致文字列の長さと、ハフマン木２０とを比較して最長一致文字列の長さのハフマン符号を特定する。第２符号化部２６４は、最長一致文字列の位置と、最長一致文字列の長さのハフマン符号と、識別ビットとを合わせた圧縮データを、記憶領域Ａ３に格納し、ファイルライト部２６７に出力する。
【０１００】
識別ビット生成部２６５は、最長一致文字列の長さに基づいて、識別ビット「０」または識別ビット「１」を出力する処理部である。具体的に、識別ビット生成部２６５は、最長一致文字列の長さが３バイト未満である場合には、識別ビット「０」を第１符号化部２６３に出力する。これに対して、識別ビット生成部２６５は、最長一致文字列の長さが３バイト以上である場合には、識別ビット「１」を第２符号化部２６４に出力する。
【０１０１】
参照部更新部２６６は、記憶領域Ａ１と記憶領域Ａ２との照合が完了した場合に、記憶領域Ａ１に格納されたデータを、記憶領域Ａ２に格納する処理部である。
【０１０２】
ファイルライト部２６７は、最長一致文字列の長さが３バイト未満の場合に、識別ビット「０」と、第１符号化部２６３から出力されるハフマン符号とを合わせた圧縮データを、記憶領域Ａ３に書き込む。また、ファイルライト部２６７は、最長一致文字列の長さが３バイト以上の場合に、識別ビット「１」と、第２符号化部２６４から出力される最長一致文字列の位置および長さとを合わせた圧縮データを、記憶領域Ａ３に書き込む。
【０１０３】
また、ファイルライト部２６７は、記憶領域Ａ１に対する処理が終了すると、記憶領域Ａ３のデータを圧縮ファイルＦ２に書き込む。
【０１０４】
（圧縮処理全体の流れ）
図１４は、圧縮処理全体の流れの例を示すフロー図である。なお、ステップＳ１２の詳細なフローに関しては、後述のサブフローで示す。図１４の例のように、情報処理装置１００ｂは、ステップＳ１０〜ステップＳ１５の前半部においてハフマン木２０を生成し、ステップＳ１６〜ステップＳ２４の後半部においてハフマン木２０を用いて圧縮処理をおこなう。
【０１０５】
まず、前半部のハフマン木２０を生成する処理に関して説明する。情報処理装置１００ｂは、前処理を行う（ステップＳ１０）。例えば、情報処理装置１００ｂは、記憶領域Ａ１〜Ａ３を第１記憶領域２５８に確保する。
【０１０６】
情報処理装置１００ｂは、ファイルＦ１のコンテンツ部分をリードして記憶領域Ａ１に展開する（ステップＳ１１）。記憶領域Ａ１にリードされたコンテンツは、集計処理が完了する度に、記憶領域Ａ２に格納される。
【０１０７】
頻度表生成部２５５は、文字出現回数集計部２５３および長さ出現回数集計部２５４からの出力に基づいて、頻度表Ｈ１１ｂおよび頻度表Ｈ１２ｂを生成する（ステップＳ１２）。ハフマン木生成部２５６は、頻度表Ｈ１１ｂおよび頻度表Ｈ１２ｂに基づいて、各コードの出現頻度（合計）を算出し、出現頻度の高いコードから順に各コードの順番をソートする（ステップＳ１２）。
【０１０８】
ハフマン木生成部２５６は、各々の葉の構造体を生成する（ステップＳ１３）。ハフマン木生成部２５６は、ステップＳ１２におけるソート結果に基づいて、コードの出現頻度（合計）の高い葉の構造体から順に並ぶように葉の構造体を配置する（ステップＳ１４）。ハフマン木生成部２５６は、コードの出現頻度に応じて枝および節点を生成することで、ハフマン木を生成する（ステップＳ１５）。
【０１０９】
次に、後半部のハフマン木を用いた圧縮処理に関して説明する。まず、第２最長一致文字列探索部２６２は、記憶領域Ａ１と記憶領域Ａ２とを比較することで最長一致文字列を探索する（ステップＳ１６）。
【０１１０】
第１符号化部２６３は、最長一致文字列の長さiが所定長Ｌmin未満の場合（ステップＳ１７No）、記憶領域Ａ１に含まれる文字を取得する（ステップＳ２１）。次いで、第１符号化部２６３は、取得した文字と、ハフマン木とを比較して、文字をハフマン符号に変換する（ステップＳ２２）。参照部更新部２６６は、記憶領域Ａ１から取得された文字を記憶領域Ａ２にコピーすることで記憶領域Ａ２を更新し、ファイルライト部２６７は、文字のハフマン符号を含む圧縮データを記憶領域Ａ３にコピーすることで記憶領域Ａ３を更新する（ステップＳ２３）。そして、情報処理装置１００ｂは、ステップＳ２４の処理に移る。
【０１１１】
一方、第２符号化部２６４は、第２最長一致文字列探索部２６２によって取得された最長一致文字列の長さiが所定長Ｌmin以上の場合（ステップＳ１７Yes）、最長一致文字列の長さiを取得する（ステップＳ１８）。さらに、第２符号化部２６４は、取得された最長一致文字列の長さiとハフマン木とを比較して、最長一致文字列の長さiをハフマン符号に変換する（ステップＳ１９）。参照部更新部２６６は、記憶領域Ａ１から取得された最長一致文字列を記憶領域Ａ２にコピーすることで記憶領域Ａ２を更新する（ステップＳ２０）。また、ファイルライト部２６７は、最長一致文字列の位置および長さのハフマン符号を含む圧縮データを記憶領域Ａ３にコピーすることで記憶領域Ａ３を更新する（ステップＳ２０）。そして、情報処理装置１００ｂは、ステップＳ２４の処理に移る。
【０１１２】
情報処理装置１００ｂは、ファイルＦ１の終点に至った場合（ステップＳ２４Yes）、処理を終了する。一方、情報処理装置１００ｂは、ファイルＦ１の途中であった場合（ステップＳ２４No）、ステップＳ１６の処理に戻り、次の文字列の圧縮処理をおこなう。
【０１１３】
（頻度計算処理の流れ）
図１５は、頻度計算処理の流れの例を示すフロー図である。図１５のフローは、図１４におけるステップＳ１２に対応する。
【０１１４】
第１ファイルリード部２５１は、ファイルＦ１のデータを、記憶領域Ａ１にリードする（ステップＳ３０）。なお、第１ファイルリード部２５１は、次回、ファイルＦ１のデータを、記憶領域Ａ１にリードする場合、集計処理がなされたファイルＦ１部分の続きから新たにデータを記憶領域Ａ１にリードする。
【０１１５】
第１最長一致文字列探索部２５２は、記憶領域Ａ１および記憶領域Ａ２を比較して、最長一致文字列を探索する（ステップＳ３１）。
【０１１６】
頻度表生成部２５５は、探索された最長一致文字列の長さiが所定長Ｌmin未満である場合（ステップＳ３２No）、頻度表Ｈ１１ｂにおいて記憶領域Ａ１に含まれる文字ｊの出現回数をインクリメントする（ステップＳ３５）。第１ファイルリード部２５１は、記憶領域Ａ１に格納されているデータを記憶領域Ａ２にコピーして記憶領域Ａ２を更新する（ステップＳ３６）。そして、情報処理装置１００ｂは、ステップＳ３７の処理に移る。
【０１１７】
一方、頻度表生成部２５５は、探索された最長一致文字列の長さｉが所定長Ｌmin未満である場合（ステップＳ３２Yes）、頻度表Ｈ１２ｂにおいて長さｉの出現回数をインクリメントする（ステップＳ３３）。第１ファイルリード部２５１は、記憶領域Ａ１に格納されているデータを記憶領域Ａ２にコピーして記憶領域Ａ２を更新する（ステップＳ３４）。そして、情報処理装置１００ｂは、ステップＳ３７の処理に移る。
【０１１８】
ハフマン木生成部２５６は、ファイルＦ１の終点に到達した場合（ステップＳ３７Yes）、コードに対応する文字および長さの出現頻度（小計）を合算することで、コードの出現頻度（合計）を算出する（ステップＳ３８）。ハフマン木生成部２５６は、算出した各コードの出現頻度（合計）に応じてコードの並び順をソートする（ステップＳ３９）。情報処理装置１００ｂは、ファイルＦ１をクローズする（ステップＳ４０）。一方、情報処理装置１００ｂは、頻度計算処理をファイルＦ１の途中まで行っていた場合（ステップＳ３７No）、ステップＳ３０の処理に戻り、頻度計算の処理をおこなう。
【０１１９】
（コードの頻度表を作成する処理）
図１６は、コードの頻度表を作成する処理の流れの例を示す図である。ハフマン木生成部２５６は、文字の頻度表Ｈ２０ｂからコードに対応する文字の出現頻度（小計）を取得し、長さの頻度表Ｈ２１ｂからコードに対応する長さの出現頻度（小計）を取得する。ハフマン木生成部２５６は、コードに対応する文字の出現頻度（小計）と長さの出現頻度（小計）とを合算し、コードの出現頻度（合計）を求める。ハフマン木生成部２５６は、コードの出現頻度（合計）に基づきコードに符号長を割当てる。ハフマン木生成部２５６は、コードに割当てられた頻度（合計）および符号長を、コードの頻度表２２ｂに格納する。
【０１２０】
例えば、ハフマン木生成部２５６は、コード「００ｈ」に対応する「ＮＵＬ」の出現頻度（小計）「０．０００１２１」と長さ「３」の出現頻度（小計）「０．０８９１」とを合算し、コード「００ｈ」の出現頻度（合計）「０．０８９２２１」を求める。ハフマン木生成部２５６は、コードの出現頻度（合計）「０．０８９２２１」に基づいて、コード「００ｈ」に符号長「３」を割当てる。ハフマン木生成部２５６は、コード「００ｈ」の出現頻度（合計）「０．０８９２２１」および符号長「３」をコード頻度表２２ｂに格納する。また、ハフマン木生成部２５６は、コード「０１ｈ」に対応する「ＳＯＨ」の出現頻度（小計）「０．０００００３」と長さ「４」の出現頻度（小計）「０．０５３２」とを合成し、コード「０１ｈ」の出現頻度（合計）「０．０５３２０３」を求める。ハフマン木生成部２５６は、コードの出現頻度（合計）「０．０５３２０３」に基づいて、コード「０１ｈ」に符号長「４」を割当てる。ハフマン木生成部２５６は、コード「０１ｈ」の出現頻度（合計）「０．０５３２０３」および符号長「４」をコードの頻度表２２ｂに格納する。
【０１２１】
ハフマン木生成部２５６は、出現頻度の高いコードから順に並ぶようにコードの頻度表２２ｂをソートして頻度表２３ｂを生成する。例えば、ハフマン木生成部２５６は、出現頻度が高いコードを左から順に「６５ｈ，００ｈ，６１ｈ，・・・０１ｈ，０２ｈ，・・・」のように頻度表２２ｂの列を並び替えて頻度表２３ｂを生成する。なお、コード頻度表Ｈ３の配列は、ハフマン木の葉の構造体の配列に対応する。
【０１２２】
（文字および最長一致文字列の長さに割り当てられる符号長に関して）
図１７は、実施例１のハフマン符号の符号長を説明するための第１の図である。図１７の例に示される頻度分布表５ａは、実施例１に係る情報処理装置１００ｂによって集計された文字と、長さとの出現頻度（小計）を表す。頻度分布表５ａの横軸は、出現頻度の高い文字から順に、英小字、数字、英大字、特殊文字、制御文字を列挙したものである。制御文字の近傍に出現頻度が高いものから順に最長一致文字列の長さが列挙される。頻度分布表５ａの縦軸は、各文字および各長さの出現頻度（小計）を示す。
【０１２３】
符号長分布表５ｂは、各文字および各最長一致文字列の長さに割当てられた符号長を表す。符号長分布表５ｂの横軸は、頻度分布表５ａの横軸に対応する。一方、符号長分布表５ｂの縦軸は、各文字および長さに割り当てられる符号長を示す。
【０１２４】
頻度分布表６ａは、符号長分布表５ａの文字の出現頻度（小計）と長さの出現頻度（小計）とを合成してコードの出現頻度（合計）とし、コードを出現頻度（合計）の順にソートした場合のコードの出現頻度の分布を表す。頻度分布表６ａの縦軸は、コードの出現頻度（合計）を示す。頻度分布表６ａの横軸には、出現頻度順にソートされたコードが列挙される。例えば、頻度分布表６ａにおいて、文字「ｅ」および長さ「１０４」に対応するコード「６５ｈ」の出現頻度（合計）は「０．１１０４０３」である。また、文字「ＮＵＬ」および長さ「３」に対応するコード「００ｈ」の出現頻度（合計）は「０．０８９２２１」である。
【０１２５】
符号長分布表６ｂは、コードを出現頻度順にソートした場合のコードの符号長の分布を表す。符号長分布表６ｂの横軸は、頻度分布表６ａの横軸に対応する。符号長分布表６ｂの縦軸は、各コードに割り当てられる符号長を示す。例えば、コード「６５ｈ」に符号長「３」が割当てられる。また、コード「７ｆｈ」に符号長「１２」が割り当てられる。
【０１２６】
以上説明したように、実施例１の情報処理装置１００ｂは、文字および長さの出現頻度（小計）を集計し、各コードに対応する文字の出現頻度（小計）および長さの出現頻度（小計）を合算することで各コードの出現頻度（合計）を求める。このように、コードに対応する長さの出現頻度（小計）がコードの出現頻度（合計）に反映される。このため、コードに対応する文字の出現頻度（小計）が低くても、コードに対応する長さの出現頻度（小計）が高ければ、コードに対して短い符号長が割当てられる。すなわち、出現頻度が高い長さに対応するコードに対して短い符号長が割当てられるので、ファイルの圧縮率が向上する。
【０１２７】
図１８は、実施例１のハフマン符号の符号長を説明するための第２の図である。図１８の例に示される頻度分布表７ａは、実施例１に係る情報処理装置１００ｂによって集計されたＣＪＫ文字（1byte）と長さの出現頻度（小計）を表す。頻度分布表７ａの横軸は、出現頻度の高いＣＪＫ文字（1byte）から順に、ＣＪＫ文字（1byte）を列挙したものである。出現頻度が低いＣＪＫ文字（1byte）の近傍に、出現頻度が高いものから順に最長一致文字列の長さが列挙される。頻度分布表７ａの縦軸は、各ＣＪＫ文字（1byte）および各長さの出現頻度（小計）を示す。頻度分布表７ａに表されるように、ＣＪＫ文字同士で出現頻度に差異が生じにくく、各ＣＪＫ文字の出現頻度（小計）は概ね均一である。
【０１２８】
符号長分布表７ｂは、各コードに割当てられる符号長を表す。符号長分布表７ｂの横軸は、頻度分布表７ａの横軸に対応する。符号長分布表７ｂの縦軸は、各コードに割り当てられる符号長を示す。
【０１２９】
頻度分布表８ａは、コードを出現頻度（合計）の順にソートした場合のコードの出現頻度（合計）の分布を表す。情報処理装置１００ｂは、符号長分布表７ａのＣＪＫ文字（1byte）の出現頻度（小計）と長さの出現頻度（小計）とを合算することでコードの出現頻度（合計）を算出する。頻度分布表８ａの縦軸は、コードの出現頻度（合計）を示す。頻度分布表８ａの横軸には、出現頻度順にソートされたコードが列挙される。頻度分布表８ａの例に示されるように、最長一致文字列の長さの出現頻度（小計）がコードの出現頻度（合計）に反映されることで、出現頻度が高いコードと出現頻度が低いコードとの間の出現頻度の差異が大きくなる。
【０１３０】
符号長分布表８ｂは、コードを出現頻度（合計）の順にソートした場合の符号長の分布を表す。符号長分布表８ｂの横軸は、頻度分布表８ａの横軸に対応する。符号長分布表８ｂの縦軸は、各コードに割り当てられる符号長を示す。符号長分布表８ｂに示されるように、出現頻度が高いコードと出現頻度が低いコードとの間の出現頻度の差異が大きくなった結果、出現頻度が高いコードに短い符号長が割当てられる。
【０１３１】
以上説明したように、実施例１の情報処理装置１００ｂは、各コードに対応するＣＪＫ文字（1byte）の出現頻度（小計）および長さの出現頻度（小計）を合算することでコードの出現頻度（合計）を求める。ＣＪＫ文字（1byte）の出現頻度（小計）のみをコードの出現頻度（合計）に反映する場合、コード同士の出現頻度に差異があまり生じないが、最長一致文字列の長さの出現頻度をコードの出現頻度に反映すれば、コード同士の出現頻度の差異が大きくなる。このため、出現頻度の高い最長一致文字列の長さに対応するコードに対してより短い符号長が割当てられるようになるので、ファイルの圧縮率が向上する。
【０１３２】
（伸長部の構成）
図１９は、本実施例に係る伸長部の構成を示す機能ブロック図である。図１９に示すように、この伸長部３００ｂは、第１段階処理部３７０ｂと、第２段階処理部３８０ｂとを有する。第１段階処理部３７０ｂは、頻度表リード部３７１と、ハフマン木生成部３７２とを有する。
【０１３３】
第１段階処理部３７０ｂは、圧縮ファイルＦ２のヘッダ情報に含まれる頻度表Ｈ１１ｂおよび頻度表Ｈ１２ｂの情報を基にして、ハフマン木２０を生成する処理部である。第１段階処理部３７０ｂに含まれる各処理部について説明する。
【０１３４】
頻度表リード部３７１は、頻度表Ｈ１１ｂおよび頻度表Ｈ１２ｂの情報を読み出して、ハフマン木生成部３７２に出力する処理部である。例えば、頻度表リード部３７１が読み出す頻度表Ｈ１１ｂおよび頻度表Ｈ１２ｂは、図１３の頻度表生成部２５５によって生成された頻度表Ｈ１１ｂおよび頻度表Ｈ１２ｂに対応する。
【０１３５】
ハフマン木生成部３７２は、頻度表Ｈ１１Ｂおよび頻度表Ｈ１２Ｂを基にしてハフマン木２０を生成する処理部である。ハフマン木生成部３７２がハフマン木２０を生成する処理は、図１３のハフマン木生成部２５６がハフマン木２０を生成する処理と同じである。
【０１３６】
第２段階処理部３８０ｂは、圧縮ファイルＦ２を伸長する処理部である。第２段階処理部３８０ｂに含まれる各部の処理について説明する。
【０１３７】
ファイルリード部３８１は、圧縮ファイルＦ２内の圧縮データを記憶領域Ｂ１に読み出す処理部である。ファイルリード部３８１は、記憶領域Ｂ１に格納された圧縮データに対する処理が終了した場合に、新たな圧縮データを圧縮ファイルＦ２から読み出し、記憶領域Ｂ１に格納された圧縮データを更新する。
【０１３８】
葉識別部３８２は、記憶領域Ｂ１に格納された圧縮データと、ハフマン木２０とを比較して、ハフマン木２０を辿り、葉を特定する処理部である。葉識別部３８２は、特定した葉の情報を、第１伸長部３８３および第２伸長部３８４に出力する。
【０１３９】
第１伸長部３８３は、識別情報が「０」の場合に処理を行う。図４で説明したように、識別情報が「０」の場合には、第１伸長部３８３は、ハフマン木２０を辿り、葉から文字の情報を抽出する。第１伸長部３８３は、抽出した文字の情報を、伸長データとして、参照部である記憶領域Ｂ２、および記憶領域Ｂ３に格納し、ファイルライト部３８６に出力する。
【０１４０】
第２伸長部３８４は、識別情報が「１」の場合に処理を行う。図４で説明したように、識別情報が「１」の場合には、第２伸長部２２６は、ハフマン木２０を辿り、葉から最長一致文字列の長さを特定する。また、第２伸長部３８４は、圧縮データに基に最長一致文字列の位置を特定し、特定した最長一致文字列の位置および長さに基づいて、記憶領域Ｂ２において最長一致文字列（データ）を特定する。第２伸長部３８４は、最長一致文字列（データ）を、参照部である記憶領域Ｂ２、およびＢ３に格納し、参照部更新部３８５およびファイルライト部３８６に出力する。
【０１４１】
参照部更新部３８５は、第１伸長部３８３または第２伸長部３８４から伸長データを取得した場合に、伸長データによって、記憶領域Ｂ２を更新する処理部である。
【０１４２】
ファイルライト部３８６は、第１伸長部３８３または第２伸長部３８４から伸長データを取得した場合に、伸長データを記憶領域Ｂ３に格納し、ファイルＦ３に書き込む処理部である。
【０１４３】
（伸張処理全体の流れ）
図２０は、伸張処理の流れの例を示すフロー図である。まず、情報処理装置１００ｂは、前処理をおこなう（ステップＳ３０）。例えば、伸長処理する際の作業領域として記憶領域Ｂ１、記憶領域Ｂ２および記憶領域Ｂ３を確保する。情報処理装置１００ｂは、圧縮ファイルＦ２をリードして記憶領域Ｂ１に展開する（ステップＳ３１）。頻度表リード部３７１は、圧縮ファイルＦ２のヘッダ部に含まれる頻度表Ｈ１１Ｂおよび頻度表Ｈ１２Ｂを読み出してハフマン木生成部３７２に出力する。ハフマン木生成部３７２は、各コードの出現頻度を算出し、各コードの出現頻度に基づいてハフマン木２０を生成する（ステップＳ３２）。ファイルリード部３８１は、ファイルＦ２から圧縮データを読み出す（ステップＳ３３）。
【０１４４】
第１伸長部３８３は、葉に含まれる識別ビットが「０」の場合（ステップＳ３４Yes）に処理を行う。葉識別部３８２は、記憶領域Ｂ１に格納された圧縮データと、ハフマン木２０とを比較して、ハフマン木２０を探索し、葉を特定する（ステップＳ３５）。第１伸長部３８３は、特定した葉に含まれるコードに基づいて文字を取得する（ステップＳ３６）。ファイルライト部３８６は、ファイルＦ３に伸長文字を書き込む（ステップＳ３７）。参照部更新部３８５は、参照部である記憶領域Ｂ２に文字を格納する（ステップＳ３８）。
【０１４５】
第２伸長部３８４は、葉に含まれる識別ビットが「１」の場合（ステップＳ３４No）に処理を行う。葉識別部３８２は、記憶領域Ｂ１に格納された圧縮データと、ハフマン木２０とを比較して、ハフマン木２０を探索し、葉を特定する（ステップＳ３９）。第２伸長部３８４は、特定した葉に含まれるコードに基づいて最長一致文字列の長さを取得する（ステップＳ４０）。第２伸長部３８４は、取得された最長一致文字列の長さを用いて記憶領域Ｂ２から最長一致文字列を取得し、取得した最長一致文字列をファイルライト部３８６に出力する。ファイルライト部３８６は、出力された最長一致文字列をファイルＦ３に書き込む（ステップＳ４１）。参照部更新部３８５は、参照部である記憶領域Ｂ２に最長一致文字列を格納する（ステップＳ４２）。
【０１４６】
情報処理装置１００ｂは、圧縮ファイルＦ２の終点に至った場合（ステップＳ４３Yes）、ファイルＦ２をクローズして（ステップＳ４４）処理を終了する。一方、情報処理装置１００ｂは、圧縮ファイルＦ２の終点に至っていない場合（ステップＳ４３No）、ステップＳ３３の処理に戻り、次の圧縮データの伸張処理をおこなう。
【０１４７】
（効果）
情報処理装置１００ｂは、圧縮対象のデータ列から抽出されたデータのうち、処理対象となるデータと最も長く一致する一致データのデータ長が所定長未満の場合に、一致データに含まれる文字データに対応するコードの出現頻度を取得し、一致データのデータ長が所定長以上の場合に、一致データに対応するコードの出現頻度を取得する取得部を有する。情報処理装置１００ｂは、取得されたコードの出現頻度に基づき生成された圧縮符号を用いて圧縮対象のデータ列を圧縮する圧縮部を有する。なお、取得部は、第１段階処理部の一例である。圧縮部は、第２段階処理部の一例である。これにより、ファイルの圧縮率を改善できる。
【０１４８】
圧縮部２００ｂは、同じコードに対応する文字データの出現頻度および長さデータの出現頻度を合算した頻度に基づいて木を生成する。これにより、文字データの出現頻度と長さデータの出現頻度とをコードの出現頻度に反映できる。
【０１４９】
圧縮部２００ｂは、木の葉のそれぞれに文字データおよび長さデータを割り当てた木を用いて、圧縮対象のデータ列を圧縮する。これにより、出現頻度の高いコードに短い圧縮符号を割当てることができ、ファイルの圧縮率を改善できる。
【０１５０】
（実施例１に関連する他の態様）
以下、上述の実施形態における変形例の一部を説明する。下記の変形例のみでなく、本発明の本旨を逸脱しない範囲の設計変更は適宜行われうる。
【０１５１】
実施例１において、情報処理装置１００ｂは、最長一致文字列の長さが３バイト以上の場合に最長一致文字列の長さを圧縮する旨を説明したが、最長一致文字列の長さを圧縮するか否かを判定する際の長さのバイト数を、任意のバイト数に変更してもよい。
【０１５２】
また、圧縮処理の対象は、ファイル内のデータ以外にも、システムから出力される監視メッセージなどでもよい。例えば、バッファに順次格納される監視メッセージを上述の圧縮処理により圧縮し、ログファイルとして格納するなどの処理が行なわれる。また、例えば、データベース内のページ単位に圧縮が行なわれてもよいし、複数のページをまとめた単位で圧縮が行なわれてもよい。
【０１５３】
また、実施例１に示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
【０１５４】
（情報処理装置のハードウェア構成）
図２１は、実施例１の情報処理装置のハードウェア構成を示す図である。図２１が示すように、コンピュータ５００は、各種演算処理を実行するＣＰＵ５０１と、ユーザからのデータ入力を受け付ける入力装置５０２と、モニタ５０３とを有する。また、コンピュータ５００は、記憶媒体からプログラム等を読み取る媒体読取装置５０４と、他の装置と接続するためのインターフェース装置５０５と、他の装置と無線により接続するための無線通信装置５０６とを有する。また、コンピュータ５００は、各種情報を一時記憶するＲＡＭ（Random  Access  Memory）５０７と、ハードディスク装置５０８とを有する。また、各装置５０１〜５０８は、バス５０９に接続される。
【０１５５】
ハードディスク装置５０８には、図１３に示した第１段階処理部２５０および第２段階処理部２６０の各処理部と同様の機能を有する情報処理プログラムが記憶される。また、ハードディスク装置５０８には、情報処理プログラムを実現するための各種データが記憶される。
【０１５６】
ＣＰＵ５０１は、ハードディスク装置５０８に記憶された各プログラムを読み出して、ＲＡＭ５０７に展開して実行することで、各種の処理を行う。これらのプログラムは、コンピュータ５００を図１３に示した第１段階処理部２５０および第２段階処理部２６０として機能させることができる。
【０１５７】
なお、上記の情報処理プログラムは、必ずしもハードディスク装置５０８に記憶されている必要はない。例えば、コンピュータ５００が読み取り可能な記憶媒体に記憶されたプログラムを、コンピュータ５００が読み出して実行するようにしてもよい。コンピュータ５００が読み取り可能な記憶媒体は、例えば、ＣＤ−ＲＯＭやＤＶＤディスク、ＵＳＢ（Universal  Serial  Bus）メモリ等の可搬型記録媒体、フラッシュメモリ等の半導体メモリ、ハードディスクドライブ等が対応する。また、公衆回線、インターネット、ＬＡＮ（Local  Area  Network）等に接続された装置にこのプログラムを記憶させておき、コンピュータ５００がこれらからプログラムを読み出して実行するようにしてもよい。
【０１５８】
図２２は、コンピュータで動作するプログラムの構成例を示す図である。コンピュータ５００において、図２２に示すハードウェア群２１（５０１〜５０９）の制御を行なうＯＳ（オペレーティング・システム）２２が動作する。ＯＳ２２に従った手順でＣＰＵ５０１が動作して、ハードウェア群２１の制御・管理が行なわれることにより、アプリケーションプログラム２４やミドルウェア２３に従った処理がハードウェア群２１で実行される。さらに、コンピュータ５００において、ミドルウェア２３またはアプリケーションプログラム２４が、ＲＡＭ５０７に読み出されてＣＰＵ５０１により実行される。
【０１５９】
ＣＰＵ５０１が、圧縮機能が呼び出された場合に、ミドルウェア２３またはアプリケーションプログラム２４の少なくとも一部に基づく処理を行なうことにより、（それらの処理をＯＳ２２に基づいてハードウェア群２１を制御して）圧縮部２００の機能が実現される。圧縮機能は、それぞれアプリケーションプログラム２４自体に含まれてもよいし、アプリケーションプログラム２４に従って呼び出されることで実行されるミドルウェア２３の一部であってもよい。
【０１６０】
アプリケーションプログラム２４（またはミドルウェア２３）の圧縮機能により得られる圧縮ファイルＦ２は、部分的に伸張することも可能である。圧縮ファイルＦ２の途中を伸張する場合には、伸張対象の部分までの圧縮データの伸張処理が抑制されるため、ＣＰＵ５０１の負荷が抑制される。また、伸張対象の圧縮データを部分的にＲＡＭ５０７上に展開するので、ワークエリアも削減される。
【０１６１】
図２３は、実施形態のシステムにおける装置の構成例を示す図である。図２３のシステムは、コンピュータ５００ａ、コンピュータ５００ｂ、基地局５０およびネットワーク６０を含む。コンピュータ５００ａは、無線または有線の少なくとも一方により、コンピュータ５００ｂと接続されたネットワーク６０に接続している。
【符号の説明】
【０１６２】
１００ｂ    情報処理装置
２００ｂ    圧縮部
２５０      第１段階処理部
２５１      第１ファイルリード部
２５２      第１最長一致文字列探索部
２５３      文字出現回数集計部
２５４      長さ出現回数集計部
２５５      頻度表生成部
２５６      ハフマン木生成部
２５８      第１記憶領域
２６０      第２段階処理部
２６１      第２ファイルリード部
２６２      第２最長一致文字列探索部
２６３      第１符号化部
２６４      第２符号化部
２６５      識別ビット生成部
２６６      参照部更新部
２６７      ファイルライト部
２６９      第２記憶領域
【図１】
0006609404.tif 000002
【図２】
0006609404.tif 000003
【図３】
0006609404.tif 000004
【図４】
0006609404.tif 000005
【図５】
0006609404.tif 000006
【図６】
0006609404.tif 000007
【図７】
0006609404.tif 000008
【図８】
0006609404.tif 000009
【図９】
0006609404.tif 000010
【図１０】
0006609404.tif 000011
【図１１】
0006609404.tif 000012
【図１２】
0006609404.tif 000013
【図１３】
0006609404.tif 000014
【図１４】
0006609404.tif 000015
【図１５】
0006609404.tif 000016
【図１６】
0006609404.tif 000017
【図１７】
0006609404.tif 000018
【図１８】
0006609404.tif 000019
【図１９】
0006609404.tif 000020
【図２０】
0006609404.tif 000021
【図２１】
0006609404.tif 000022
【図２２】
0006609404.tif 000023
【図２３】
0006609404.tif 000024