(57)【特許請求の範囲】
【請求項１】
コンピュータを、
文字コード列が記述されている対象ファイル群を記憶する記憶手段、
前記対象ファイル群の中から選ばれた一の対象ファイル内の連続する２グラムの文字コード列を構成する先行文字コードおよび後続文字コードの各識別情報のうち、少なくともいずれか一方の識別情報を２分割して前記他方の識別情報と組み合わせ、複数種類の組み合わせ識別情報を生成する生成手段、
前記生成手段によって生成された複数種類の組み合わせ識別情報に対して、前記対象ファイル群のファイル数分のビット列をそれぞれ割り当てて、複数種類の連続グラム分割マップとし、前記記憶手段に記憶するマップ特定手段、
前記マップ特定手段によって特定された複数種類の連続グラム分割マップにおいて、前記連続する２グラムの文字コード列の前記一の対象ファイルでの存否をあらわすビットを更新する更新手段、
として機能させることを特徴とする情報処理プログラム。
【請求項２】
前記生成手段は、
前記一方の識別情報を２分割して前記他方の識別情報と結合して、２種類の組み合わせ識別情報を生成することを特徴とする請求項１に記載の情報処理プログラム。
【請求項３】
前記生成手段は、
前記先行文字コードの識別情報と前記後続文字コードの識別情報とをそれぞれ２分割して得られた４個の分割識別情報から２つ選んで結合した４種類の組み合わせ識別情報を生成することを特徴とする請求項１に記載の情報処理プログラム。
【請求項４】
前記生成手段は、
さらに、前記一の対象ファイル内の連続する複数グラムの文字コード列を構成する先頭文字コードおよび末尾文字コードの各識別情報のうち、少なくともいずれか一方の識別情報を２分割して組み合わせ、複数種類の組み合わせ識別情報を生成し、
前記マップ特定手段は、
前記生成手段によって生成された前記先頭文字コードおよび末尾文字コードの識別情報に基づく複数種類の組み合わせ識別情報に対して、前記対象ファイル群のファイル数分のビット列をそれぞれ割り当てて、複数種類の頭尾分割マップとして、前記記憶手段に記憶し、
前記更新手段は、
さらに、前記マップ特定手段によって特定された複数種類の頭尾分割マップにおいて、前記複数グラムの文字コード列における前記先頭文字コードおよび前記末尾文字コードの組み合わせの前記一の対象ファイル群での存否をあらわすビットを更新することを特徴とする請求項１に記載の情報処理プログラム。
【請求項５】
コンピュータを、
文字コード列が記述されている対象ファイル群と、連続する２グラムの文字コード列ごとに設定された複数種類の組み合わせ識別情報に対して前記対象ファイル群のファイル数分のビット列がそれぞれ割り当てられた複数種類の連続グラム分割マップ群と、を記憶する記憶手段、
検索キーワードの入力を受け付ける入力手段、
前記入力手段によって入力された検索キーワードにおいて連続する２グラムの文字コード列を構成する先行文字コードおよび後続文字コードの各識別情報のうち、少なくともいずれか一方の識別情報を２分割して前記他方の識別情報と組み合わせ、複数種類の組み合わせ識別情報を生成する生成手段、
前記複数種類の連続グラム分割マップ群の中から、前記生成手段によって生成された複数種類の組み合わせ識別情報が割り当てられている複数種類の連続グラム分割マップを、前記検索キーワードにおいて連続する２グラムの文字コード列を構成する先行文字コードおよび後続文字コードごとに特定するマップ特定手段、
前記マップ特定手段によって前記検索キーワードにおいて連続する２グラムの文字コード列を構成する先行文字コードおよび後続文字コードごとに特定された複数種類の連続グラム分割マップ群に基づいて、前記検索キーワードにおいて連続する２グラムの文字コード列を構成する先行文字コードおよび後続文字コードがすべて存在する対象ファイルを前記対象ファイル群の中から特定するファイル特定手段、
として機能させることを特徴とする情報検索プログラム。
【請求項６】
前記記憶手段は、
さらに、連続する複数グラムの文字コード列を構成する先頭文字コードおよび末尾文字コードの組み合わせごとに設定された複数種類の組み合わせ識別情報に対して前記対象ファイル群のファイル数分のビット列がそれぞれ割り当てられた複数種類の頭尾分割マップ群を記憶しており、
前記生成手段は、
さらに、前記検索キーワード内の先頭文字コードおよび末尾文字コードの各識別情報のうち、少なくともいずれか一方の識別情報を２分割して前記他方の識別情報と組み合わせ、前記先頭文字コードおよび前記末尾文字コードに基づく複数種類の組み合わせ識別情報を生成し、
前記マップ特定手段は、
さらに、前記複数種類の頭尾分割マップ群の中から、前記生成手段によって生成された前記先頭文字コードおよび前記末尾文字コードに基づく複数種類の組み合わせ識別情報が割り当てられている複数種類の頭尾分割マップを特定し、
前記ファイル特定手段は、
前記マップ特定手段によって特定された複数種類の連続グラム分割マップ群および複数種類の頭尾分割マップ群に基づいて、前記検索キーワードにおいて連続する２グラムの文字コード列を構成する先行文字コードおよび後続文字コードがすべて存在するとともに、前記検索キーワードと同一グラム数であり、かつ、先頭文字コードおよび末尾文字コードが一致する文字コード列が存在する対象ファイルを前記対象ファイル群の中から特定することを特徴とする請求項５に記載の情報検索プログラム。
【請求項７】
文字コード列が記述されている対象ファイル群を記憶する記憶手段と、
前記対象ファイル群の中から選ばれた一の対象ファイル内の連続する２グラムの文字コード列を構成する先行文字コードおよび後続文字コードの各識別情報のうち、少なくともいずれか一方の識別情報を２分割して前記他方の識別情報と組み合わせ、複数種類の組み合わせ識別情報を生成する生成手段と、
前記生成手段によって生成された複数種類の組み合わせ識別情報に対して、前記対象ファイル群のファイル数分のビット列をそれぞれ割り当てて、複数種類の連続グラム分割マップとし、前記記憶手段に記憶するマップ特定手段と、
前記マップ特定手段によって特定された複数種類の連続グラム分割マップにおいて、前記連続する２グラムの文字コード列の前記一の対象ファイルでの存否をあらわすビットを更新する更新手段と、
を備えることを特徴とする情報処理装置。
【請求項８】
文字コード列が記述されている対象ファイル群と、連続する２グラムの文字コード列ごとに設定された複数種類の組み合わせ識別情報に対して前記対象ファイル群のファイル数分のビット列がそれぞれ割り当てられた複数種類の連続グラム分割マップ群と、を記憶する記憶手段と、
検索キーワードの入力を受け付ける入力手段と、
前記入力手段によって入力された検索キーワードにおいて連続する２グラムの文字コード列を構成する先行文字コードおよび後続文字コードの各識別情報のうち、少なくともいずれか一方の識別情報を２分割して前記他方の識別情報と組み合わせ、複数種類の組み合わせ識別情報を生成する生成手段と、
前記複数種類の連続グラム分割マップ群の中から、前記生成手段によって生成された複数種類の組み合わせ識別情報が割り当てられている複数種類の連続グラム分割マップを、前記検索キーワードにおいて連続する２グラムの文字コード列を構成する先行文字コードおよび後続文字コードごとに特定するマップ特定手段と、
前記マップ特定手段によって前記検索キーワードにおいて連続する２グラムの文字コード列を構成する先行文字コードおよび後続文字コードごとに特定された複数種類の連続グラム分割マップ群に基づいて、前記検索キーワードにおいて連続する２グラムの文字コード列を構成する先行文字コードおよび後続文字コードがすべて存在する対象ファイルを前記対象ファイル群の中から特定するファイル特定手段と、
を備えることを特徴とする情報検索装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ハフマン木を用いた情報の圧縮、伸長をおこなう情報処理プログラム、情報検索プログラム、情報処理装置、および情報検索装置に関する。
【背景技術】
【０００２】
従来において、文字と該文字を含む文書との対応付けを示す文字成分表と、文書から付属語を除いて作成した凝縮本文と文書とを対応付けて格納した凝縮本文ファイルとを備える検索技術がある。当該検索技術では、文字成分表を参照し、検索キーワードに含まれる文字に対応する文書を特定し、文字成分表を参照するステップの実行結果に応じて、凝縮本文ファイル中の凝縮本文から検索キーワードを含む文書を特定する（たとえば、下記特許文献１を参照）。
【０００３】
また、テキストデータを，ある長さｎの文字列単位で読み出し，各文字列に対応する文字成分表のエントリに文字列が存在したことを表す情報を記録する技術が開示されている。そして、検索タームを長さｎの文字列に分割し，各文字列に対応する連接文字成分表のエントリに全て存在情報が記録されている文書を出力し、テキストそのものを検索する以前に階層的に文字成分表サーチを行うことにより検索対象を絞り込み、フルテキストサーチを高速に行っている（たとえば、下記特許文献２を参照）。
【０００４】
また、英語などの文字種が少ない表音文字によって構成される文書を対象とした場合に、与えられた検索タームから十分な絞り込みを行うことのできる連接文字成分表サーチ手段により等価的に高速なフルテキストサーチを実現する技術が開示されている（たとえば、下記特許文献３を参照）。
【０００５】
また、登録する各文書について、テキストデータにおける文字の出現状況を記述した文字成分表を作成し、予め定められた文書構造名に従って文書構造を認識し、構造毎にテキストデータを分割し、出現する文字毎に各文字が出現する文書構造に対応する特定のビット位置に１を立て、文字毎の出現文書構造位置を記述した構造ビット列を格納しておく技術が開示されている。そして、ユーザより検索文字列として“極限作業”、文書構造として“発明の名称”ＯＲ“請求の範囲”ＯＲ“効果”が指定されたとき、“極限作業”で文字成分表サーチを行ない、結果として文書１，７，１５，３８・・・を得、指定文書構造に基づく指定文書構造ビット列１００１００００１と検索された文書の構造ビット列とのビットＡＮＤをとり、検索結果として文書１，７，３８・・・を得る（たとえば、下記特許文献４を参照）。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特許第２９８６８６５号公報
【特許文献２】特許第３２６３９６３号公報
【特許文献３】特許第３４９７２４３号公報
【特許文献４】特許第３５１８９３３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかしながら、上述した従来技術では、膨大な数（たとえば、１万個）の文書ファイルで構成されたコンテンツについて、６４Ｋ種の１６ビット文字コードの文字コードで文字成分表を作成している。検索ノイズ削減のため、文字成分表を単字のほか、２連字用、３連字用、４連字用、…と増加させると、サイズ爆発を引き起こし、データのファイルサイズが激増し、省資源のハード環境では処理が困難になるという問題があった。一方、ハッシュ関数などにより、ファイルサイズの縮小を行うと、検索ノイズが増加し、検索速度が低下するという問題があった。さらに、２連字用、３連字用、４連字用、…の文字成分表を生成する処理時間も増大するという問題があった。
【０００８】
この発明は、上述した従来技術による問題点を解消するため、省メモリ化と検索ノイズの低減化とを図ることができる情報処理プログラム、情報検索プログラム、情報処理装置、および情報検索装置を提供することを目的とする。
【課題を解決するための手段】
【０００９】
本発明の一観点によれば、文字コード列が記述されている対象ファイル群を記憶しておき、前記対象ファイル群の中から選ばれた一の対象ファイル内の連続する２グラムの文字コード列を構成する先行文字コードおよび後続文字コードの各識別情報のうち、少なくともいずれか一方の識別情報を２分割して前記他方の識別情報と組み合わせ、複数種類の組み合わせ識別情報を生成し、生成された複数種類の組み合わせ識別情報に対して、前記対象ファイル群のファイル数分のビット列をそれぞれ割り当てて、複数種類の連続グラム分割マップとし、特定された複数種類の連続グラム分割マップにおいて、前記連続する２グラムの文字コード列の前記一の対象ファイルでの存否をあらわすビットを更新する情報処理プログラムおよび情報処理装置が提供される。
【００１０】
本発明の他の観点によれば、文字コード列が記述されている対象ファイル群と、連続する２グラムの文字コード列ごとに設定された複数種類の組み合わせ識別情報に対して前記対象ファイル群のファイル数分のビット列がそれぞれ割り当てられた複数種類の連続グラム分割マップ群と、を記憶しておき、検索キーワードの入力を受け付け、入力された検索キーワードにおいて連続する２グラムの文字コード列を構成する先行文字コードおよび後続文字コードの各識別情報のうち、少なくともいずれか一方の識別情報を２分割して前記他方の識別情報と組み合わせ、複数種類の組み合わせ識別情報を生成し、前記複数種類の連続グラム分割マップ群の中から、生成された複数種類の組み合わせ識別情報が割り当てられている複数種類の連続グラム分割マップを、前記検索キーワードにおいて連続する２グラムの文字コード列を構成する先行文字コードおよび後続文字コードごとに特定し、前記検索キーワードにおいて連続する２グラムの文字コード列を構成する先行文字コードおよび後続文字コードごとに特定された複数種類の連続グラム分割マップ群に基づいて、前記検索キーワードにおいて連続する２グラムの文字コード列を構成する先行文字コードおよび後続文字コードがすべて存在する対象ファイルを前記対象ファイル群の中から特定する情報検索プログラムおよび情報検索装置が提供される。
【発明の効果】
【００１１】
開示の情報処理プログラム、情報検索プログラム、情報処理装置、および情報検索装置によれば、データのファイルサイズの縮小、かつ、検索ノイズの低減化とを図ることができるという効果を奏する。
【図面の簡単な説明】
【００１２】
【図１】対象ファイルの圧縮までの処理の流れを示す説明図である。
【図２−１】２ｎ分枝ハフマン木の生成元となる節点集合体を示す説明図である。
【図２−２】２ｎ分枝ハフマン木を示す説明図である。
【図３】圧縮前処理を示す説明図である。
【図４】実施の形態にかかる情報処理装置のハードウェア構成を示すブロック図である。
【図５】実施の形態にかかる情報処理装置の機能的構成１を示すブロック図である。
【図６】文字出現頻度集計テーブルを示す説明図である。
【図７】予約語出現頻度集計テーブルを示す説明図である。
【図８】文字コードおよび予約語の出現頻度を統合した集計結果テーブルを示す説明図である。
【図９−１】分割文字出現頻度集計テーブルを示す説明図である。
【図９−２】上位８ビットに関する分割文字出現頻度集計テーブルを示す説明図である。
【図９−３】下位８ビットに関する分割文字出現頻度集計テーブルを示す説明図である。
【図１０】算出部による算出結果テーブルを示す説明図である。
【図１１】２ｎ分枝ハフマン木の構造体を示す説明図である。
【図１２】２ｎ分枝ハフマン木の構造体を示す説明図である。
【図１３−１】第４階層から第３階層へ最適化する場合の算出結果テーブルの更新例を示す説明図である。
【図１３−２】第３階層から第２階層へ最適化する場合の算出結果テーブルの更新例を示す説明図である。
【図１３−３】第２階層から第１階層へ最適化する場合の算出結果テーブルの更新例を示す説明図である。
【図１４】最適化後の２ｎ分枝ハフマン木の構造体を示す説明図である。
【図１５】最適化後の２ｎ分枝ハフマン木における葉の構造体が格納する情報を示す説明図である。
【図１６】予約語の構造体を示す説明図である。
【図１７】高位文字コードの構造体を示す説明図である。
【図１８】分割文字コードの構造体を示す説明図である。
【図１９】情報処理装置が自動実行する２ｎ分枝ハフマン木生成処理手順を示すフローチャートである。
【図２０】図１９に示した葉数削減処理（ステップＳ１９０３）の詳細な処理手順を示すフローチャートである。
【図２１】図１９に示したパラメータ算出処理（ステップＳ１９０５）の詳細な処理手順を示すフローチャートである。
【図２２】図１９に示した構造体セル構築処理（ステップＳ１９０６）の詳細な処理手順を示すフローチャートである。
【図２３】図２２に示した第ｉ階層の構造体セルＣ（ｉ，ｊ）の構築処理（ステップＳ２２０４）の詳細な処理手順を示すフローチャート（前半）である。
【図２４】図２２に示した第ｉ階層の構造体セルＣ（ｉ，ｊ）の構築処理（ステップＳ２２０４）の詳細な処理手順を示すフローチャート（後半）である。
【図２５】図１９に示した最適化処理（ステップＳ１９０７）の詳細な処理手順を示すフローチャートである。
【図２６】２ｍ分枝の無節点ハフマン木を示す説明図である。
【図２７】２ｍ分枝の無節点ハフマン木の節点（根）の構造体を示す説明図である。
【図２８】無節点ハフマン木の葉の構造体を示す説明図である。
【図２９】葉の構造体に格納される情報を示す説明図である。
【図３０】実施の形態にかかる情報処理装置の機能的構成２を示すブロック図である。
【図３１−１】情報処理装置が自動実行する２ｎ分枝ハフマン木→２ｍ分枝無節点ハフマン木変換処理手順を示すフローチャートである。
【図３１−２】図３１−１に示した圧縮符号マップへのポインタ設定処理（ステップＳ３１１０）の詳細な処理手順を示すフローチャートである。
【図３２】実施の形態にかかる情報処理装置の機能的構成３を示すブロック図である。
【図３３−１】圧縮対象文字コード列の一例を示す説明図である。
【図３３−２】圧縮符号列の一例を示す説明図である。
【図３４】２ｍ分枝の無節点ハフマン木を用いた圧縮処理の具体例を示す説明図である。
【図３５】情報処理装置が自動実行する２ｍ分枝の無節点ハフマン木Ｈ２を用いたファイル圧縮処理手順を示すフローチャートである。
【図３６】図３５に示した圧縮処理（ステップＳ３５０３）の詳細な処理手順を示すフローチャート（その１）である。
【図３７】図３５に示した圧縮処理（ステップＳ３５０３）の詳細な処理手順を示すフローチャート（その２）である。
【図３８】図３５に示した圧縮処理（ステップＳ３５０３）の詳細な処理手順を示すフローチャート（その３）である。
【図３９−１】圧縮符号マップ群の初期状態を示す説明図である。
【図３９−２】圧縮符号マップ更新部による更新後の圧縮符号マップ群を示す説明図である。
【図４０】２グラムの圧縮符号マップのサイズ縮小を示す説明図である。
【図４１】２グラムの圧縮符号マップの分割時のサイズを示す図表である。
【図４２−１】２グラムの圧縮符号マップへのポインタの分割例（その１）を示す説明図である。
【図４２−２】２グラムの圧縮符号マップへのポインタの分割例（その２）を示す説明図である。
【図４２−３】２グラムの圧縮符号マップへのポインタの分割例（その３）を示す説明図である。
【図４２−４】２グラムの圧縮符号マップへのポインタの分割例（その４）を示す説明図である。
【図４２−５】２グラムの圧縮符号マップへのポインタの分割例（その５）を示す説明図である。
【図４２−６】２グラムの圧縮符号マップへのポインタの分割例（その６）を示す説明図である。
【図４２−７】２グラムの圧縮符号マップへのポインタの分割例（その７）を示す説明図である。
【図４２−８】２グラムの圧縮符号マップへのポインタの分割例（その８）を示す説明図である。
【図４２−９】２グラムの圧縮符号マップへのポインタの分割例（その９）を示す説明図である。
【図４２−１０】２グラムの圧縮符号マップへのポインタの分割例（その１０）を示す説明図である。
【図４２−１１】２グラムの圧縮符号マップへのポインタの分割例（その１１）を示す説明図である。
【図４２−１２】２グラムの圧縮符号マップへのポインタの分割例（その１２）を示す説明図である。
【図４２−１３】２グラムの圧縮符号マップへのポインタの分割例（その１３）を示す説明図である。
【図４２−１４】２グラムの圧縮符号マップへのポインタの分割例（その１４）を示す説明図である。
【図４２−１５】２グラムの圧縮符号マップへのポインタの分割例（その１５）を示す説明図である。
【図４３−１】連続グラム分割マップの具体例（その１）を示す説明図である。
【図４３−２】連続グラム分割マップの具体例（その２）を示す説明図である。
【図４３−３】連続グラム分割マップの具体例（その３）を示す説明図である。
【図４３−４】連続グラム分割マップの具体例（その４）を示す説明図である。
【図４３−５】連続グラム分割マップの具体例（その５）を示す説明図である。
【図４３−６】連続グラム分割マップの具体例（その６）を示す説明図である。
【図４３−７】連続グラム分割マップの具体例（その７）を示す説明図である。
【図４３−８】連続グラム分割マップの具体例（その８）を示す説明図である。
【図４３−９】連続グラム分割マップの具体例（その９）を示す説明図である。
【図４３−１０】連続グラム分割マップの具体例（その１０）を示す説明図である。
【図４３−１１】連続グラム分割マップの具体例（その１１）を示す説明図である。
【図４３−１２】連続グラム分割マップの具体例（その１２）を示す説明図である。
【図４３−１３】連続グラム分割マップの具体例（その１３）を示す説明図である。
【図４３−１４】連続グラム分割マップの具体例（その１４）を示す説明図である。
【図４３−１５】連続グラム分割マップの具体例（その１５）を示す説明図である。
【図４３−１６】連続グラム分割マップの具体例（その１６）を示す説明図である。
【図４３−１７】連続グラム分割マップの具体例（その１７）を示す説明図である。
【図４３−１８】連続グラム分割マップの具体例（その１８）を示す説明図である。
【図４３−１９】連続グラム分割マップの具体例（その１９）を示す説明図である。
【図４３−２０】連続グラム分割マップの具体例（その２０）を示す説明図である。
【図４３−２１】連続グラム分割マップの具体例（その２１）を示す説明図である。
【図４３−２２】連続グラム分割マップの具体例（その２２）を示す説明図である。
【図４３−２３】連続グラム分割マップの具体例（その２３）を示す説明図である。
【図４３−２４】連続グラム分割マップの具体例（その２４）を示す説明図である。
【図４３−２５】連続グラム分割マップの具体例（その２５）を示す説明図である。
【図４３−２６】連続グラム分割マップの具体例（その２６）を示す説明図である。
【図４３−２７】連続グラム分割マップの具体例（その２７）を示す説明図である。
【図４３−２８】連続グラム分割マップの具体例（その２８）を示す説明図である。
【図４３−２９】連続グラム分割マップの具体例（その２９）を示す説明図である。
【図４３−３０】連続グラム分割マップの具体例（その３０）を示す説明図である。
【図４３−３１】連続グラム分割マップの具体例（その３１）を示す説明図である。
【図４３−３２】連続グラム分割マップの具体例（その３２）を示す説明図である。
【図４４−１】連続グラム分割マップおよびｘグラム頭尾分割マップの生成例（その１）を示す説明図である。
【図４４−２】連続グラム分割マップおよびｘグラム頭尾分割マップの生成例（その２）を示す説明図である。
【図４４−３】連続グラム分割マップおよびｘグラム頭尾分割マップの生成例（その３）を示す説明図である。
【図４４−４】連続グラム分割マップおよびｘグラム頭尾分割マップの生成例（その４）を示す説明図である。
【図４４−５】連続グラム分割マップおよびｘグラム頭尾分割マップの生成例（その５）を示す説明図である。
【図４４−６】連続グラム分割マップおよびｘグラム頭尾分割マップの生成例（その６）を示す説明図である。
【図４４−７】連続グラム分割マップおよびｘグラム頭尾分割マップの生成例（その７）を示す説明図である。
【図４４−８】連続グラム分割マップおよびｘグラム頭尾分割マップの生成例（その８）を示す説明図である。
【図４４−９】連続グラム分割マップおよびｘグラム頭尾分割マップの生成例（その９）を示す説明図である。
【図４４−１０】図４４−１〜図４４−９におけるマップ生成用レジスタのポインタ格納状態を示す説明図である。
【図４５−１】高位文字コードどうしの連続グラム分割マップへのポインタの生成例を示す説明図である。
【図４５−２】高位文字コードと上位分割文字コードとの連続グラム分割マップへのポインタの生成例を示す説明図である。
【図４５−３】上位分割文字コードと下位分割文字コードとの連続グラム分割マップへのポインタの生成例を示す説明図である。
【図４５−４】下位分割文字コードと高位文字コードとの連続グラム分割マップへのポインタの生成例を示す説明図である。
【図４６−１】図３２に示した圧縮符号マップ特定部３２０６および圧縮符号マップ更新部３２０７による圧縮符号マップ生成処理手順を示すフローチャートである。
【図４６−２】図４６−１に示した１グラムの圧縮符号マップ生成処理（ステップＳ４６０２）の詳細な処理手順を示すフローチャートである。
【図４６−３】図４６−１に示した２グラムの分割マップ生成処理（ステップＳ４６０３）の詳細な処理手順を示すフローチャートである。
【図４６−４】図４６−３に示したポインタ分割処理（ステップＳ４６３５、Ｓ４６３７、Ｓ４６４２、Ｓ４６４４）の詳細な処理手順を示すフローチャートである。
【図４６−５】グラム数ｘの変動処理を示すフローチャートである。
【図４７−１】出現率と出現率領域との関係を示す説明図である。
【図４７−２】出現率領域別の圧縮パターンを有する圧縮パターンテーブルを示す説明図である。
【図４８−１】Ｂ領域およびＢ´領域の場合の圧縮パターンを示す説明図である。
【図４８−２】Ｃ領域およびＣ´領域の場合の圧縮パターンを示す説明図である。
【図４８−３】Ｄ領域およびＤ´領域の場合の圧縮パターンを示す説明図である。
【図４８−４】Ｅ領域およびＥ´領域の場合の圧縮パターンを示す説明図である。
【図４９】圧縮された圧縮符号マップ群ｍｓを示す説明図である。
【図５０】圧縮された圧縮符号マップ群ｍｓへのビット列追加を示す説明図である。
【図５１】削除マップを示す説明図である。
【図５２】圧縮符号マップ圧縮処理手順を示すフローチャートである。
【図５３】追加ファイル圧縮処理手順を示すフローチャートである。
【図５４】削除マップ更新処理手順を示すフローチャートである。
【図５５】圧縮ファイルｆの検索と対象ファイルＦへの伸長までの処理の流れを示す説明図である。
【図５６】実施の形態にかかる情報検索装置の機能的構成を示すブロック図である。
【図５７】対象ファイルＦｐ内の記述例を示す説明図である。
【図５８】検索条件が指定されたときの検索キーワードへの特殊文字の自動付与結果を示す説明図である。
【図５９】圧縮ファイル特定部による特定例を示す説明図である。
【図６０−１】５グラムの検索キーワード「人形芝居」について、連続グラム分割マップ群と５グラム頭尾分割マップ群とを用いた圧縮ファイルｆの特定例（その１）を示す説明図である。
【図６０−２】５グラムの検索キーワード「人形芝居」について、連続グラム分割マップ群と５グラム頭尾分割マップ群とを用いた圧縮ファイルｆの特定例（その２）を示す説明図である。
【図６０−３】５グラムの検索キーワード「人形芝居」について、連続グラム分割マップ群と５グラム頭尾分割マップ群とを用いた圧縮ファイルｆの特定例（その３）を示す説明図である。
【図６１−１】抽出部、葉特定部および伸長コード格納部による２ｍ分枝の無節点ハフマン木Ｈ２を用いた伸長処理の具体例（その１）を示す説明図である。
【図６１−２】抽出部、葉特定部および伸長コード格納部による２ｍ分枝の無節点ハフマン木Ｈ２を用いた伸長処理の具体例（その２）を示す説明図である。
【図６１−３】抽出部、葉特定部および伸長コード格納部による２ｍ分枝の無節点ハフマン木Ｈ２を用いた伸長処理の具体例（その３）を示す説明図である。
【図６１−４】抽出部、葉特定部および伸長コード格納部による２ｍ分枝の無節点ハフマン木Ｈ２を用いた伸長処理の具体例（その４）を示す説明図である。
【図６１−５】抽出部、葉特定部および伸長コード格納部による２ｍ分枝の無節点ハフマン木Ｈ２を用いた伸長処理の具体例（その５）を示す説明図である。
【図６２−１】照合処理の具体例（その１）を示す説明図である。
【図６２−２】照合処理の具体例（その２）を示す説明図である。
【図６２−３】照合処理の具体例（その３）を示す説明図である。
【図６３】検索キーワード圧縮処理手順を示すフローチャートである。
【図６４−１】圧縮ファイル特定部によるファイル絞込み処理手順を示すフローチャートである。
【図６４−２】図６４−１に示した１グラムでのファイル絞込み処理（ステップＳ６４１２）の詳細な処理手順を示すフローチャートである。
【図６４−３】図６４−２に示したアクセス先の圧縮符号マップ伸長処理（ステップＳ６４２５）の詳細な処理手順を示すフローチャートである。
【図６４−４】図６４−１に示した複数グラムでのファイル絞込み処理（ステップＳ６４１３）の詳細な処理手順を示すフローチャート（その１）である。
【図６４−５】図６４−１に示した複数グラムでのファイル絞込み処理（ステップＳ６４１３）の詳細な処理手順を示すフローチャート（その２）である。
【図６４−６】図６４−１に示した複数グラムでのファイル絞込み処理（ステップＳ６４１３）の詳細な処理手順を示すフローチャート（その３）である。
【図６５】特定圧縮ファイル伸長処理手順を示すフローチャートである。
【図６６−１】無節点ハフマン木Ｈ２を用いた伸長処理手順を示すフローチャート（その１）である。
【図６６−２】無節点ハフマン木Ｈ２を用いた伸長処理手順を示すフローチャート（その２）である。
【図６７−１】照合処理手順を示すフローチャート（その１）である。
【図６７−２】照合処理手順を示すフローチャート（その２）である。
【図６８】間引き処理を示す説明図である。
【図６９】間引き分割マップ群を用いた圧縮ファイル特定例を示す説明図である。
【発明を実施するための形態】
【００１３】
以下に添付図面を参照して、情報処理プログラム、情報検索プログラム、情報処理装置、および情報検索装置の好適な実施の形態を詳細に説明する。まず、本実施の形態にかかる２ｎ分枝ハフマン木について説明する。
【００１４】
＜対象ファイルの圧縮までの処理の流れ＞
図１は、対象ファイルの圧縮までの処理の流れを示す説明図である。本実施の形態では、まず、（１）情報処理装置が、対象ファイル群Ｆｓを読み込んで対象ファイル群Ｆｓ内に出現する文字の出現頻度を集計する。対象ファイル群Ｆｓは、数千〜数万種の文字（厳密には文字コード）が記述されている電子文書である。
【００１５】
対象ファイル群Ｆｓは文字コードが含まれていれば、テキスト形式でもよく、ＨＴＭＬ（ＨｙｐｅｒＴｅｘｔ  Ｍａｒｋｕｐ  Ｌａｎｇｕａｇｅ）やＸＭＬ（Ｅｘｔｅｎｓｉｂｌｅ  Ｍａｒｋｕｐ  Ｌａｎｇｕａｇｅ）で記述されていてもよい。対象ファイル群Ｆｓとしては、たとえば、国語辞典、外国語辞典（英和や和英など）、専門用語辞典などの辞書データやＷｅｂページを適用することができる。
【００１６】
出現頻度とは、文字が出現する回数である。たとえば、対象ファイル群Ｆｓのファイル数が３個（Ｆ１〜Ｆ３）であり、ある文字Ｘの出現回数が対象ファイルＦ１で２回、対象ファイルＦ２で３回、対象ファイルＦ３で０回の場合、文字Ｘの出現頻度は５である。文字ごとに集計された出現頻度を集計結果１０とする。
【００１７】
つぎに、（２）情報処理装置が、集計結果１０を用いて２ｎ分枝ハフマン木Ｈ１を生成する。２ｎ分枝ハフマン木Ｈ１とは、節点からその下位節点への枝数が２ｎ本のハフマン木である。ｎはｎ≧２の自然数である。節点の階層数はｋ（ｋはｋ≧２の自然数）である。また、第ｉ階層（ｉは１≦ｉ≦ｋの自然数）の節点数は２ｎ（ｉ−１）である。各節点が上位節点へのポインタを格納している。
【００１８】
また、各節点は、２ｎ個の葉または下位節点への２ｎ個のポインタを格納可能である。本実施の形態では、日本語の漢字等は１６ビットコードで表現されるため、１６ビットの文字コードを圧縮／伸長の対象とする場合はｎ＝４とし、ｋ＝４として説明する。２ｎ分枝ハフマン木Ｈ１の詳細については、図２−１および図２−２において後述する。
【００１９】
つぎに、（３）情報処理装置は、２ｎ分枝ハフマン木Ｈ１を２ｍ分枝の無節点ハフマン木Ｈ２に変換する。無節点ハフマン木Ｈ２とは、根と葉のみからなる内部節点のないハフマン木である。無節点ハフマン木Ｈ２は、枝の本数が多くなるが、根から１パスで葉にアクセスすることができるハフマン木である。無節点ハフマン木Ｈ２の詳細については、図２６において後述する。
【００２０】
このあと、（４）情報処理装置は、対象ファイル群Ｆｓを１ファイルずつ読み込んで無節点ハフマン木により圧縮符号を探索する。そして、（５）探索された圧縮符号を並べてファイル化することで対象ファイル群Ｆｓを圧縮する。これにより、圧縮ファイル群ｆｓが得られることとなる。
【００２１】
また、（６）上記（５）の処理と並行して、圧縮符号マップ群Ｍｓを生成する。圧縮符号マップ群Ｍｓとは、圧縮符号マップＭの集合であり、圧縮符号マップＭとは、対象ファイル群Ｆｓでの各文字の存否を文字ごとに示すテーブルである。圧縮符号マップ群Ｍｓを用いることにより、検索キーワードを構成する文字を含む圧縮ファイル群ｆｓを伸長せずに絞り込むことができる。圧縮符号マップ群Ｍｓは、具体的には、たとえば、ＲＡＭ、磁気ディスク、光ディスクなどの記憶媒体に記憶されており、ＣＰＵがアクセス可能である。
【００２２】
圧縮符号マップ群Ｍｓは、具体的には、文字ごとの対象ファイル数分のビット列により構成されている。たとえば、文字Ｘについてファイル番号＃に対応するビットの値が「１」であれば、文字ＸはファイルＦ♯に存在することを示す。一方、文字Ｘについてファイル番号＃に対応するビットの値が「０」であれば、文字ＸはファイルＦ♯に存在しないことを示す。圧縮符号マップ群Ｍｓの詳細については、図３９−１および図３９−２において後述する。
【００２３】
＜２ｎ分枝ハフマン木の内容＞
図２−１は、２ｎ（ｎ＝４により２ｎ＝１６）分枝ハフマン木の生成元となる節点集合体を示す説明図である。図２−１の節点集合体１００において、第１階層では１個の節点の構造体セル、第２階層では１６個の節点の構造体セル、第３階層では２５６個の節点の構造体セル、第４階層では４０９６個の節点の構造体セルを有する。各構造体セルＣ（ｉ，ｊ）は、リンク元となる上位節点のポインタを格納している。最上位となる第１階層の節点の構造体Ｃ（１，１）は、根の構造体であるため、上位節点のポインタはない。
【００２４】
図２−２は、２ｎ分枝ハフマン木を示す説明図である。図２−２では、ｎ＝４、すなわち、１６分枝ハフマン木である。２ｎ分枝ハフマン木は、具体的には、たとえば、ＲＡＭ、磁気ディスク、光ディスクなどの記憶媒体に記憶されており、ＣＰＵがアクセス可能である。
【００２５】
２ｎ分枝ハフマン木Ｈ１において、根は図２−１の第１階層の節点の構造体セルＣ（１，１）に相当する。また、（Ａ）〜（Ｃ）は節点または葉を示している。図２−２中、□は葉を示しており、■は節点を示している。下位節点／葉に枝が出ていない■は、使用されない節点である。また、葉の直下の数字は、葉の番号を示している。以降、葉をＬ♯（♯は葉の番号）と表記する。
【００２６】
すなわち、（Ａ）の□は第１階層の根からリンクする葉Ｌ１〜Ｌ３である。また、■は根からリンクする第２階層の節点であり、節点の構造体セルＣ（２，４）〜Ｃ（２，１６）に相当する。（Ｂ）の□は第２階層の節点からリンクする葉Ｌ４〜Ｌ１３４である。また、■は根からリンクする第３階層の節点であり、節点の構造体セルＣ（３，１３５）〜Ｃ（３，２５６）に相当する。（Ｃ）の□は第３階層の節点からリンクする葉Ｌ１３５〜Ｌ１２９５である。また、■は根からリンクする第４階層の節点であり、節点の構造体セルＣ（４，１２９６）〜Ｃ（４，４０９６）に相当する。つぎに、圧縮の前処理について説明する。
【００２７】
＜圧縮前処理＞
図３は、圧縮前処理を示す説明図である。対象ファイル群Ｆｓには数千〜数万種の文字が記述されており、本プログラムでは、対象ファイル群Ｆｓ内の文字コードについて出現頻度を集計して降順にソートする。そして、高位（たとえば、１〜１０２４位まで）の文字コードと低位（１０２５位以下）の文字コードに分ける。
【００２８】
高位の文字コードは出現頻度が高いため、１６ビットコードとして圧縮符号を割り当てる。低位の文字コードは、上位８ビットと下位８ビットに分割する。１６ビットコードでは最大で６５５３６（２５６×２５６）種の文字を扱えるが、低位の文字コードを、８ビットで分割することにより、６万種以上ある低位の文字コードを２５６種の分割文字コードに抑えることができる。
【００２９】
たとえば、漢字の「兎」の１６ビットの文字コードは“０ｘ５１４Ｅ”であるため、上位８ビット“０ｘ５１”と下位８ビット“０ｘ４Ｅ”に分割する。同様に、漢字の「兆」の１６ビットの文字コードは“０ｘ５１４６”であるため、上位８ビット“０ｘ５１”と下位８ビット“０ｘ４６”に分割する。そして、分割された８ビットの分割文字コードの出現頻度を集計する。この「兎」および「兆」の例では、分割文字コード“０ｘ５１”の出現頻度は２回、分割文字コード“０ｘ４Ｅ”，“０ｘ４６”は１回となる。
【００３０】
また、＜ｐ＞や＜ｐ／＞といったタグなどを予約語とする。予約語は数十種決めておく。そして、高位文字コード群、分割文字コード群および予約語群を混在させて出現頻度を再集計し、出現頻度の降順に再ソートする。これにより、出現頻度の降順にソートされた約１３００種の文字コードが得られる。文字コード種をこの程度の数に抑えることで、１６ビットの文字コードを１２ビット以下の圧縮符号に圧縮し、圧縮符号を１６ビットの文字コードに伸長することが可能となる。
【００３１】
＜情報処理装置のハードウェア構成＞
図４は、実施の形態にかかる情報処理装置のハードウェア構成を示すブロック図である。図４において、情報処理装置は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）４０１と、ＲＯＭ（Ｒｅａｄ‐Ｏｎｌｙ  Ｍｅｍｏｒｙ）４０２と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）４０３と、磁気ディスクドライブ４０４と、磁気ディスク４０５と、光ディスクドライブ４０６と、光ディスク４０７と、ディスプレイ４０８と、Ｉ／Ｆ（Ｉｎｔｅｒｆａｃｅ）４０９と、キーボード４１０と、マウス４１１と、スキャナ４１２と、プリンタ４１３と、を備えている。また、各構成部はバス４００によってそれぞれ接続されている。
【００３２】
ここで、ＣＰＵ４０１は、情報処理装置の全体の制御を司る。ＲＯＭ４０２は、ブートプログラムなどのプログラムを記憶している。ＲＡＭ４０３は、ＣＰＵ４０１のワークエリアとして使用される。磁気ディスクドライブ４０４は、ＣＰＵ４０１の制御にしたがって磁気ディスク４０５に対するデータのリード／ライトを制御する。磁気ディスク４０５は、磁気ディスクドライブ４０４の制御で書き込まれたデータを記憶する。
【００３３】
光ディスクドライブ４０６は、ＣＰＵ４０１の制御にしたがって光ディスク４０７に対するデータのリード／ライトを制御する。光ディスク４０７は、光ディスクドライブ４０６の制御で書き込まれたデータを記憶したり、光ディスク４０７に記憶されたデータをコンピュータに読み取らせたりする。
【００３４】
ディスプレイ４０８は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。このディスプレイ４０８は、たとえば、ＣＲＴ、ＴＦＴ液晶ディスプレイ、プラズマディスプレイなどを採用することができる。
【００３５】
インターフェース（以下、「Ｉ／Ｆ」と略する。）４０９は、通信回線を通じてＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどのネットワーク４１４に接続され、このネットワーク４１４を介して他の装置に接続される。そして、Ｉ／Ｆ４０９は、ネットワーク４１４と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。Ｉ／Ｆ４０９には、たとえばモデムやＬＡＮアダプタなどを採用することができる。
【００３６】
キーボード４１０は、文字、数字、各種指示などの入力のためのキーを備え、データの入力をおこなう。また、タッチパネル式の入力パッドやテンキーなどであってもよい。マウス４１１は、カーソルの移動や範囲選択、あるいはウィンドウの移動やサイズの変更などをおこなう。ポインティングデバイスとして同様に機能を備えるものであれば、トラックボールやジョイスティックなどであってもよい。
【００３７】
スキャナ４１２は、画像を光学的に読み取り、情報処理装置内に画像データを取り込む。なお、スキャナ４１２は、ＯＣＲ（Ｏｐｔｉｃａｌ  Ｃｈａｒａｃｔｅｒ  Ｒｅａｄｅｒ）機能を持たせてもよい。また、プリンタ４１３は、画像データや文書データを印刷する。プリンタ４１３には、たとえば、レーザプリンタやインクジェットプリンタを採用することができる。
【００３８】
＜情報処理装置の機能的構成１＞
図５は、実施の形態にかかる情報処理装置の機能的構成１を示すブロック図である。図５では、図１に示した処理の流れ（１）〜（６）のうち、（１）および（２）の処理を実行する機能的構成を示している。図５において、情報処理装置５００は、入力部５０１と、取得部５０２と、分類部５０６と、算出部５０７と、２ｎ分枝ハフマン木生成部（ポインタ生成部５０８、ポインタ格納部５０９、葉生成部５１０、文字コード格納部５１１）と、検出部５１２と、特定部５１３と、最適化部５１４と、文字構造体生成部５１５と、を備えている。
【００３９】
入力部５０１〜文字構造体生成部５１５は、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶されたプログラムをＣＰＵ４０１に実行させることにより、または、Ｉ／Ｆ４０９により、その機能を実現する。
【００４０】
入力部５０１は、対象ファイル群Ｆｓから文字コードを入力する機能を有する。具体的には、たとえば、ＣＰＵ４０１が対象ファイル群Ｆｓを走査して２ｎビットの文字コードを順次対象ファイル群Ｆｓから読み出す。読み出された文字コードはＣＰＵ４０１内のレジスタに保持される。
【００４１】
取得部５０２は、対象ファイル群Ｆｓに記述されている２ｎビットの文字コードの出現頻度の集計結果を取得する機能を有する。集計結果さえ取得できれば、集計結果自体を直接読み込んでもよく、また、入力部５０１によりレジスタにセットされる文字コードを順次集計してもよい。後者の場合、取得部５０２は、具体的には、たとえば、集計部５０３とソート部５０４とを有する。集計部５０３は、レジスタにセットされる文字コードの数を集計する。たとえば、ＣＰＵ４０１がレジスタにセットされる文字コードと一致する文字コードについて文字出現頻度集計テーブルの計数値をインクリメントする。
【００４２】
図６は、文字出現頻度集計テーブルを示す説明図である。文字出現頻度集計テーブル６００は、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶されており、ＣＰＵ４０１がアクセス可能である。文字出現頻度集計テーブル６００は、文字ごとに計数値を記憶する。文字項目は実際には説明の便宜上、各種文字が割り当てられているが、実際には入力文字コードと比較するため文字コードが割り当てられている。すなわち、ＣＰＵ４０１は、入力文字コードを文字項目で走査することで一致する文字コードを検出する。そして、検出された場合に計数値を１ポイントインクリメントする。
【００４３】
図７は、予約語出現頻度集計テーブルを示す説明図である。予約語出現頻度集計テーブル７００も、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶されており、ＣＰＵ４０１がアクセス可能である。予約語出現頻度集計テーブル７００は、予約語ごとに計数値を記憶する。予約語項目は説明の便宜上、各種文字が割り当てられているが、実際には入力文字コードと比較するため文字コード列が割り当てられている。すなわち、図６に示した文字出現頻度集計テーブル６００との照合に先立って、ＣＰＵ４０１は、入力文字コードを予約語項目で走査することで一致する文字コードを検出する。
【００４４】
一致する場合は、次の入力文字コードを予約語項目で走査する。これを繰り返し、一致する文字コード列が検出された場合、その予約語の文字コード列の計数値を１ポイントインクリメントする。不一致の文字コードが出現した場合は、文字出現頻度集計テーブル６００にアクセスして、これまで一致した文字コード列の各文字コードの計数値を１ポイントインクリメントする。そして、不一致となった文字コードについては、上述したように、文字出現頻度集計テーブル６００を用いて集計する。
【００４５】
図５に戻って、ソート部５０４は、集計結果をソートする機能を有する。具体的には、たとえば、ＣＰＵ４０１は、文字出現頻度集計テーブル６００の文字（文字コード）や予約語出現頻度集計テーブル７００の予約語を計数値の降順にソートする。
【００４６】
図８は、文字コードおよび予約語の出現頻度を統合した集計結果テーブルを示す説明図である。集計結果テーブル８００では、出現頻度（計数値）の降順に文字コードまたは予約語がソートされている。集計結果テーブル８００も、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶されており、ＣＰＵ４０１がアクセス可能である。
【００４７】
取得部５０２では、さらに、文字コードまたは予約語ごとに出現率を計算し、出現率に応じた出現率領域を特定する。出現率とは、対象ファイル群Ｆｓ内の全ファイル数を母集団（分母）とし、当該文字コードまたは予約語が存在するファイル数を分子とした値である。出現率領域とは、出現率の範囲をあらわす情報であり、圧縮符号マップ群Ｍｓの圧縮に用いられるハフマン木（以下、「圧縮符号マップ用ハフマン木」）を特定する。出現率領域および圧縮符号マップ用ハフマン木については後述する（図４２−１〜図４２−４を参照。）。
【００４８】
分割部５０５は、ソート部５０４によってソートされた結果、文字コードのうち出現頻度の高位の文字コードと低位の文字コードとに分け、低位の文字コードを上位ビットコードと下位ビットコードに分割する機能を有する。具体的には、たとえば、文字出現頻度集計テーブル６００の文字（コード）を計数値の降順にソートした結果、たとえば、１位〜１０２４位までの文字コードを高位文字コードとし、１０２５位以降の文字コードを低位文字コードとする。ＣＰＵ４０１は、この低位文字コードを、図３の例１）や例２）に示したように、上位８ビットコードと下位８ビットコードに分割する。
【００４９】
上位８ビットコードや下位８ビットコードといった分割文字コードは、最大２５６種となる。１６ビットコードでは最大６万種以上の文字が割り当てられ、同数の葉が必要となるが、出現順位の低い低位文字コードを分割することで、１０２５位以降の最大約６万種の文字コードを、たかだか２５６種の分割文字コードで表現できる。したがって、文字コードに割り当てる葉の数を大幅に削減（１０２４＋２５６＋予約語数十種）することができる。この場合、集計部５０３は、分割文字コードの出現頻度を再集計する。さらに、分割文字コードが上位８ビットに出現した出現頻度と下位８ビットに出現した出現頻度に分けて再集計する。
【００５０】
図９−１は、分割文字出現頻度集計テーブルを示す説明図である。分割文字出現頻度集計テーブル９０１も、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶されており、ＣＰＵ４０１がアクセス可能である。そして、ソート部５０４では、１６ビットである高位文字コード、予約語、分割文字コード（以下、「文字コード等」という）を統合して、図８に示した集計結果テーブル８００を更新する。
【００５１】
図９−２は、上位８ビットに関する分割文字出現頻度集計テーブルを示す説明図である。分割文字出現頻度集計テーブル９０２も、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶されており、ＣＰＵ４０１がアクセス可能である。分割文字出現頻度集計テーブル９０２は、圧縮符号マップ群Ｍｓの生成に用いられる。
【００５２】
図９−３は、下位８ビットに関する分割文字出現頻度集計テーブルを示す説明図である。分割文字出現頻度集計テーブル９０３も、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶されており、ＣＰＵ４０１がアクセス可能である。分割文字出現頻度集計テーブル９０３は、圧縮符号マップ群Ｍｓの生成に用いられる。
【００５３】
分類部５０６は、取得部５０２によって取得された集計結果に基づいて、文字コード等を出現確率Ｐに応じて階層別に分類する機能を有する。具体的には、たとえば、文字出現頻度集計テーブル６００を参照して、文字コード等を出現確率Ｐに応じて階層別に分類する。
【００５４】
ここで、出現確率Ｐとは、文字コード等の総数を、対象となる文字コード等の出現数（文字出現頻度集計テーブル６００の計数値）で除算した値である。ＣＰＵ４０１は、各文字コード等の出現確率Ｐを算出する。そして、算出された出現確率Ｐを階層別に分類する。たとえば、第ｉ階層の場合、１／２ｎｉ≦Ｐ＜１／２ｎ（ｉ−１）となる文字コードでグループ化する。ただし、第１階層（ｉ＝１）のときは１／２ｎｉ≦Ｐ＜１、第ｎ階層（ｉ＝ｎ）のときはＰ＜１／２ｎ（ｉ−１）でグループ化する。
【００５５】
たとえば、ｎ＝４の場合、第１階層の文字コード等は、出現確率Ｐが１／１６≦Ｐ＜１となる文字コードである。また、第２階層の文字コード等は、１／３２≦Ｐ＜１／１６となる文字コードである。また、第３階層の文字コード等は、１／４０９６≦Ｐ＜１／３２となる文字コードである。また、第４階層の文字コード等は、Ｐ＜１／４０９６となる文字コードである。分類結果である階層番号ｉや集計結果テーブル８００における順位は、文字コード等ごとに付与される。集計結果テーブル８００における順位は、その文字コード等の葉の番号となる。
【００５６】
算出部５０７は、分類部５０６によって分類された第ｉ階層の文字コード数に基づいて、第ｉ階層の葉へのポインタ数を算出する機能を有する。また、当該第ｉ階層の葉へのポインタ数に基づいて、（ｉ＋１）階層の節点をリンク先とする第ｉ階層の下位節点へのポインタ数と第ｉ階層の節点の使用数とを算出する機能を有する。
【００５７】
具体的には、たとえば、ＣＰＵ４０１は、節点集合体１００と分類結果から、第ｉ階層について、構造体セル数Ｎ（ｉ）、葉の数Ｎｌ（ｉ）、葉へのポインタ数Ｎｌｐ（ｉ）、下位節点へのポインタ数Ｎｎｐ（ｉ）、構造体セル使用数Ｎｃｕ（ｉ）、葉へのポインタ数の累計値ΣＮｌｐ（ｉ）、先頭からの空きセル数Ｎｃｓｔ（ｉ）、末尾までの空きポインタ数Ｎｐｓｅ（ｉ）、末尾までの空きセル数Ｎｃｓｅ（ｉ）を算出する。
【００５８】
図１０は、算出部５０７による算出結果テーブルを示す説明図である。算出結果テーブル５２０も、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶されており、ＣＰＵ４０１がアクセス可能である。算出結果テーブル５２０には、階層ごとに算出された各項目の値がＣＰＵ４０１により書き込まれる。図１０では、ｎ＝４の場合の算出結果を示している。
【００５９】
構造体セル数Ｎ（ｉ）とは、第ｉ階層の節点の構造体セルＣ（ｉ，ｊ）の個数である。構造体セル数Ｎ（ｉ）は、ＣＰＵ４０１が節点集合体１００の各階層の節点の構造体セルＣ（ｉ，ｊ）の個数を計数することで得られる。ｎ＝４の場合、第１階層は１個（根）、第２階層は１６個、第３階層は２５６個、第４階層は４０９６個である。
【００６０】
葉の数Ｎｌ（ｉ）とは、第ｉ階層の葉の構造体の個数である。葉の数Ｎｌ（ｉ）は、分類結果である階層ごとの文字コード数となる。図１０の例では、第１階層は３個、第２階層は５４個、第３階層は３５３個、第４階層は８８５個である。
【００６１】
葉へのポインタ数Ｎｌｐ（ｉ）とは、第ｉ階層の節点の構造体セルＣ（ｉ，ｊ）に格納する葉へのポインタの総数である。葉へのポインタ数Ｎｌｐ（ｉ）は葉の数Ｎｌ（ｉ）と同数である。
【００６２】
下位節点へのポインタ数Ｎｎｐ（ｉ）とは、第ｉ階層の節点の構造体セルＣ（ｉ，ｊ）に格納する下位節点へのポインタの総数である。下位節点をポイントするため、第（ｉ＋１）階層の葉へのポインタ数Ｎｌｐ（ｉ＋１）と下位節点へのポインタ数Ｎｎｐ（ｉ＋１）に依存する。たとえば、ＣＰＵ４０１は、下記式（１）により、下位節点へのポインタ数Ｎｎｐ（ｉ）を算出する。
【００６３】
Ｎｎｐ（ｉ）＝｛Ｎｌｐ（ｉ＋１）＋Ｎｎｐ（ｉ＋１）｝／２ｎ＋１・・・（１）
ただし、端数は切り捨て。また、ｉ＝ｎのときは、下位節点が存在しないため、Ｎｎｐ（ｉ）＝０。
【００６４】
構造体セル使用数Ｎｃｕ（ｉ）とは、第ｉ階層において、構造体セルＣ（ｉ，ｊ）のうち、葉へのポインタおよび下位節点へのポインタが格納される構造体セルＣ（ｉ，ｊ）の総数である。たとえば、ＣＰＵ４０１は、下記式（２）により、構造体セル使用数Ｎｃｕ（ｉ）を算出する。
【００６５】
Ｎｃｕ（ｉ）＝｛Ｎｌｐ（ｉ）＋Ｎｎｐ（ｉ）｝／２ｎ＋１・・・（２）
ただし、端数は切り捨て。
【００６６】
葉へのポインタ数の累計値ΣＮｌｐ（ｉ）とは、第１階層から第ｉ階層までの葉へのポインタ数Ｎｌｐ（ｉ）の総和である。
【００６７】
先頭からの空きセル数Ｎｃｓｔ（ｉ）とは、第ｉ階層の先頭となる構造体セルＣ（ｉ、１）からの不使用セル数である。もともと節点集合体１００を構成する構造体セルＣ（ｉ，ｊ）には、それぞれ上位節点へのポインタが格納されているが、その上位節点の構造体セルＣ（ｉ−１，ｊ）が葉Ｌｊの構造体とリンクすると、葉Ｌｊの構造体には、構造体セルＣ（ｉ，ｊ）と同一の上位節点へのポインタが格納されることとなる。
【００６８】
このように、ポインタが重複するため、葉Ｌｊの構造体に格納される上位節点へのポインタを優先するために、先頭からの空きセル数Ｎｃｓｔ（ｉ）を計算する。具体的には、たとえば、ＣＰＵ４０１は、下記式（３）により、先頭からの空きセル数Ｎｃｓｔ（ｉ）を算出する。
【００６９】
Ｎｃｓｔ（ｉ）＝ΣＮｌｐ（ｉ−１）・・・（３）
ただし、ｉ＝１のときは、Ｎｃｓｔ（ｉ）＝０。
【００７０】
したがって、図１０の例では、第２階層では、構造体セルＣ（２，１）〜Ｃ（２，３）が先頭からの空きセル（不使用セル）となる。また、第３階層では、構造体セルＣ（３，１）〜Ｃ（３，５７）が先頭からの空きセル（不使用セル）となる。同様に、第４階層では、構造体セルＣ（４，１）〜Ｃ（４，４１０）が先頭からの空きセル（不使用セル）となる。
【００７１】
末尾までの空きポインタ数Ｎｐｓｅ（ｉ）とは、第ｉ階層において、先頭からの空きセルの次の構造体セルＣ（ｉ，ｊ）から葉へのポインタおよび下位節点へのポインタが格納された場合の空きポインタの総数である。なお、先頭からの空きセルの空きポインタは除かれる。具体的には、たとえば、ＣＰＵ４０１は、下記式（４）により、末尾までの空きポインタ数Ｎｐｓｅ（ｉ）を算出する。
【００７２】
Ｎｐｓｅ（ｉ）
＝Ｎ（ｉ）×２ｎ−Ｎｌｐ（ｉ）−Ｎｎｐ（ｉ）−Ｎｃｓｔ（ｉ）×２ｎ・・・（４）
【００７３】
末尾までの空きセル数Ｎｃｓｅ（ｉ）とは、第ｉ階層の構造体セル群のうち、先頭からの空きセルと葉へのポインタや下位節点へのポインタが格納された構造体セルＣ（ｉ，ｊ）を除いた残余の構造体セルＣ（ｉ，ｊ）の個数である。具体的には、たとえば、ＣＰＵ４０１は、下記式（５）により、末尾までの空きセル数Ｎｃｓｅ（ｉ）を算出する。
【００７４】
Ｎｃｓｅ（ｉ）＝Ｎ（ｉ）−Ｎｃｕ（ｉ）−Ｎｃｓｔ（ｉ）・・・（５）
【００７５】
ポインタ生成部５０８は、算出部５０７によって算出された算出結果に基づいて、第ｉ階層の葉へのポインタと第ｉ階層の下位節点へのポインタを生成する機能を有する。具体的には、たとえば、ＣＰＵ４０１が算出結果テーブル５２０にアクセスして、第ｉ階層の葉へのポインタ数と下位節点へのポインタ数を取得する。
【００７６】
２ｎ分枝ハフマン木Ｈ１では、節点からの枝本数は２ｎ本なので、ｎ＝４の場合、枝番号となる下位節点へのポインタは４ビットコードとなる。たとえば、第１階層の根Ｃ（１，１）においては、葉Ｌ１へのポインタは“００００”、葉Ｌ２へのポインタは“０００１”、葉Ｌ３へのポインタは“００１０”となる。また、下位節点Ｃ（２，４）へのポインタは“００１１”、下位節点Ｃ（２，５）へのポインタは“０１００”、…、下位節点Ｃ（２，８）へのポインタは“０１１１”となる。生成されたポインタは、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に一時的に保持される。
【００７７】
ポインタ格納部５０９は、第ｉ階層の使用数分の節点に、ポインタ生成部５０８によって生成された第ｉ階層の葉へのポインタと第ｉ階層の下位節点へのポインタとを格納する機能を有する。具体的には、たとえば、ＣＰＵ４０１は、第ｉ階層の構造体セルＣ（ｉ，ｊ）のうち、ポインタの格納可能な先頭の構造体セルを特定する。
【００７８】
具体的には、たとえば、ＣＰＵ４０１が算出結果テーブル５２０にアクセスして、先頭からの空きセル数Ｎｃｓｔ（ｉ）を取得する。そして、ポインタの格納可能な先頭の構造体セルＣ（ｉ，ｊ）を、構造体セルＣ（ｉ，Ｎｃｓｔ（ｉ）＋１）に決定する。この構造体セルＣ（ｉ，Ｎｃｓｔ（ｉ）＋１）以降の構造体セルに、まず葉へのポインタを葉の番号順に格納し、ついで、下位節点へのポインタを格納する。葉へのポインタおよび下位節点へのポインタが格納された構造体セルの総数は、算出結果テーブル５２０の構造体セル使用数Ｎｃｕ（ｉ）に一致する。
【００７９】
葉生成部５１０は、分類部５０６によって分類された第ｉ階層の文字ごとに、ポインタ格納部５０９によって第ｉ階層の節点に格納された葉へのポインタにより第ｉ階層の節点のリンク先となる葉を、文字コードごとに生成する機能を有する。具体的には、たとえば、階層ごとに、葉の数Ｎｌ（ｉ）分の葉Ｌ♯の構造体を生成する。葉Ｌ♯の構造体は、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶される。
【００８０】
図１１は、２ｎ（１６）分枝ハフマン木の構造体を示す説明図である。ｎ＝４の１６分枝の場合、ハフマン木は１個の第１階層の節点（根）の構造体１１０１、１６個の第２階層の節点の構造体１１０２、２５６個の第３階層の節点の構造体１１０３、４０９６個の第４階層の節点の構造体１１０４、および１２９５個の葉Ｌ＃の構造体１１０５で構成される。
【００８１】
節点の構造体は、上位節点へのポインタ１１１０と下位第１節点へのポインタ１１１１〜第１６節点へのポインタ１１２６の１７種のポインタで構成される。葉Ｌ♯の構造体は、第１領域１１３１〜第４領域１１３４を有する。第１領域１１３１には、上位節点へのポインタが格納される。具体的には、たとえば、第ｉ階層のｊ番目の節点の構造体の下位第１２節点へのポインタがｌ番目の葉Ｌ♯の構造体をポイントしていた場合、第１領域１１３１には、第ｉ階層のｊ番目の節点の構造体への先頭アドレス（ポインタ）が格納される。
【００８２】
また、第２領域１１３２には、葉の標識および伸長種別などが格納される。葉の標識とは、圧縮や伸長の際に参照されるフラグであり、「０」（ＯＦＦを示す）の場合は一般の節点を、「１」（ＯＮを示す）の場合は葉を意味する。伸長種別は、伸長対象の出現頻度が高位の１６ビットの文字コードか、低位文字コードから分割された上位８ビットの分割文字コードか、低位文字コードから分割された下位８ビットの分割文字コードか、または予約語かを示す識別子である。第３領域１１３３には、伸長種別に対応して、高位の１６ビット文字コード、８ビットの分割文字コード、または予約語へのポインタが格納される。第４領域１１３４には、図８に示した出現率領域が格納される。
【００８３】
文字コード格納部５１１は、葉生成部５１０によって生成された葉に、当該葉の番号に対応付けられた文字コードを格納することにより、２ｎ分枝ハフマン木Ｈ１を生成する機能を有する。具体的には、たとえば、文字コードの出現頻度の順位（図８を参照）と一致する葉Ｌ♯の番号♯を格納する葉Ｌ♯の構造体の第３領域１１３３にその文字コードを格納する。予約語の場合は、予約語へのポインタを格納する。なお、第３領域１１３３の大きさによっては予約語の文字コード列を格納してもよい。また、文字コード格納部５１１は、文字コードの格納とともに、格納する文字コードの出現率領域も、集計結果テーブル８００から読み出して、第４領域１１３４に格納する。
【００８４】
このように、葉生成部５１０によって生成された葉Ｌ♯の構造体を図１に示した節点集合体１００の該当する節点の構造体セルＣ（ｉ，ｊ）にリンクさせ、ポインタ格納部５０９により節点集合体１００の構造体セルＣ（ｉ，ｊ）に葉Ｌ♯へのポインタを格納し、文字コード格納部５１１により葉Ｌ♯の構造体に文字コードや予約語のポインタを格納することで、節点集合体１００から２ｎ分枝ハフマン木Ｈ１が生成される。
【００８５】
図１２は、２ｎ分枝ハフマン木Ｈ１の構造体を示す説明図である。２ｎ分枝ハフマン木Ｈ１は、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶される。図１２では、ｎ＝４、すなわち、１６分枝ハフマン木を示している。
【００８６】
検出部５１２は、第ｉ階層の葉へのポインタ数と第（ｉ−１）階層の空き節点内の空きポインタ数とを検出する機能を有する。具体的には、たとえば、ＣＰＵ４０１が、算出結果テーブル５２０から第ｉ階層の葉へのポインタ数Ｎｌｐ（ｉ）と第（ｉ−１）階層の末尾までの空きポインタ数Ｎｐｓｅ（ｉ−１）とを読み出す。
【００８７】
特定部５１３は、検出部５１２によって検出された第ｉ階層の葉へのポインタ数と第（ｉ−１）階層の空き節点内の空きポインタ数とに基づいて、第ｉ階層から第（ｉ−１）階層の空き節点への移動対象となる第ｉ階層の葉Ｌ♯へのポインタ（以下、「移動対象ポインタ」という）を特定する機能を有する。具体的には、たとえば、ＣＰＵ４０１が、読み出された第ｉ階層の葉へのポインタ数Ｎｌｐ（ｉ）と第（ｉ−１）階層の末尾までの空きポインタ数Ｎｐｓｅ（ｉ−１）と第（ｉ−１）階層の下位節点へのポインタ数Ｎｎｐ（ｉ−１）を用いて、下記式（６）により判断する。
【００８８】
Ｎｐｓｅ（ｉ−１）＋Ｎｎｐ（ｉ−１）＞Ｎｌｐ（ｉ）・・・（６）
【００８９】
（６）式を満たす場合、第ｉ階層の葉Ｌ♯へのポインタはすべて第（ｉ＋１）階層に移動可能である。（６）式を満たさない場合、第（ｉ−１）階層の末尾までの空きポインタ数Ｎｐｓｅ（ｉ−１）と同数の第ｉ階層の葉へのポインタを移動対象ポインタとする。たとえば、図１１の２ｎ分枝ハフマン木Ｈ１を最適化する場合、算出結果テーブル５２０を参照すると、ｉ＝４の場合、第４階層の葉へのポインタ数Ｎｌｐ（４）＝８８５、第３階層の末尾までの空きポインタ数Ｎｐｓｅ（３）＝２７７５、第３階層の下位節点へのポインタ数Ｎｎｐ（３）＝５６であるため、（６）式を満たすこととなる。したがって、第４階層の葉Ｌ４１１へのポインタ〜葉Ｌ１２９５へのポインタはすべて第３階層の空きセル内に移動可能となる。
【００９０】
最適化部５１４は、特定部５１３によって特定された移動対象ポインタを格納する節点へのポインタを第（ｉ−１）階層の節点から削除し、移動対象ポインタを第（ｉ−１）階層の節点に移動させる機能を有する。具体的には、たとえば、上記の例では、移動対象ポインタ（第４階層の葉Ｌ４１１へのポインタ〜葉Ｌ１２９５へのポインタ）を格納する節点Ｃ（４，４１１）〜Ｃ（４，４６６）へのポインタを第３階層から削除する。そして、第３階層の構造体セルＣ（３，８０）から順次、移動対象ポインタを移動させる。すなわち、葉Ｌ４１１の構造体〜葉Ｌ１２９５の構造体は、第４階層から第３階層に昇格する。
【００９１】
これにより、第４階層の場合は圧縮符号長が１６ビットであったが、第３階層に昇格することで、圧縮符号長が１２ビットに短縮され、圧縮率の向上を図ることができる。このように、第ｉ階層から第（ｉ−１）階層に昇格することで、圧縮符号長がｎ×ｉビットからｎ×（ｉ−１）ビットに短縮され、圧縮率の向上を図ることができる。
【００９２】
また、最適化部５１４は、最適化する都度、算出結果テーブル５２０を更新する。図１３−１〜図１３−３は、最適化する場合の算出結果テーブル５２０の更新例である。このように、最適化は、最下位の階層から実行することとなる。
【００９３】
図１３−１は、第４階層から第３階層へ最適化する場合の算出結果テーブル５２０の更新例を示す説明図である。図１３−１は、図１０に示した状態からの更新例を示している。
【００９４】
図１３−２は、第３階層から第２階層へ最適化する場合の算出結果テーブル５２０の更新例を示す説明図である。図１３−２は、図１３−１に示した状態からの更新例を示している。
【００９５】
図１３−３は、第２階層から第１階層へ最適化する場合の算出結果テーブル５２０の更新例を示す説明図である。図１３−３は、図１３−２に示した状態からの更新例を示している。
【００９６】
図１４は、最適化後の２ｎ分枝ハフマン木Ｈ１の構造体を示す説明図である。図１２と比較すると、最適化後の２ｎ分枝ハフマン木Ｈ１では、第４階層の葉Ｌ♯の構造体が存在しない。このように、上位階層の空きポインタに下位階層の葉Ｌ♯へのポインタを移動させているため、圧縮符号の短縮化を図ることができる。
【００９７】
図１５は、最適化後の２ｎ分枝ハフマン木Ｈ１における葉Ｌ♯の構造体が格納する情報を示す説明図である。図１５の各レコードがそれぞれの葉Ｌ♯の構造体が格納する情報に相当する。なお、圧縮符号は２ｎ分枝ハフマン木Ｈ１の根から該当する葉Ｌ♯までの枝番号となる下位節点へのポインタ〜葉へのポインタのコード列である。
【００９８】
図５に戻って、文字構造体生成部５１５は、文字構造体５３０を生成する機能を有する。具体的には、たとえば、ＣＰＵ４０１が、予約語出現頻度集計テーブル７００、文字出現頻度集計テーブル６００、分割文字出現頻度集計テーブル９０１、２ｎ分枝ハフマン木Ｈ１にアクセスし、指定された情報を抽出することで、予約語の構造体、高位文字コードの構造体、および分割上位文字コードの構造体を生成する。
【００９９】
図１６は、予約語の構造体を示す説明図である。予約語の構造体１６００は、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶され、ＣＰＵ４０１がアクセス可能である。予約語の構造体１６００は、予約語総数（図１６の例では１５個）、予約語の最大ビット長Ｌｒｍａｘ、各予約語ｒ１〜ｒ１５とそのビット長および葉Ｌ♯へのポインタを格納する。
【０１００】
ＣＰＵ４０１は、予約語出現頻度集計テーブル７００から予約語総数、各予約語、予約語の最大ビット長、各予約語のビット長を読み出す。また、２ｎ分枝ハフマン木Ｈ１における予約語の葉Ｌ♯の構造体から上位節点を特定し、その上位節点の構造体セル内の予約語の葉Ｌ♯へのポインタを読み出す。これにより、予約語の構造体１６００が生成される。
【０１０１】
図１７は、高位文字コードの構造体を示す説明図である。高位文字コードの構造体１７００は、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶され、ＣＰＵ４０１がアクセス可能である。高位文字コードの構造体１７００は、文字コードｅ♯とその葉Ｌ♯へのポインタを格納する。
【０１０２】
ＣＰＵ４０１は、文字出現頻度集計テーブル６００から文字コードｅ♯を読み出す。また、２ｎ分枝ハフマン木Ｈ１においてその文字コードｅ♯に対応する葉Ｌ♯の構造体から上位節点を特定し、その上位節点の構造体セル内の文字コードｅ♯に対応する葉Ｌ♯へのポインタを読み出す。これにより、高位文字コードの構造体１７００が生成される。
【０１０３】
図１８は、分割文字コードの構造体を示す説明図である。分割文字コードの構造体１８００は、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶され、ＣＰＵ４０１がアクセス可能である。分割文字コードの構造体１８００は、分割文字コードとその葉Ｌ♯へのポインタを格納する。
【０１０４】
ＣＰＵ４０１は、分割文字出現頻度集計テーブル９０１から分割文字コードを読み出す。また、２ｎ分枝ハフマン木Ｈ１においてその分割文字コードに対応する葉Ｌ♯の構造体から上位節点を特定し、その上位節点の構造体セル内の分割文字コードに対応する葉Ｌ♯へのポインタを読み出す。これにより、分割文字コードの構造体１８００が生成される。
【０１０５】
＜２ｎ分枝ハフマン木生成処理手順＞
図１９は、情報処理装置５００が自動実行する２ｎ分枝ハフマン木生成処理手順を示すフローチャートである。図１９において、まず、入力部５０１により対象ファイル群Ｆｓを読み込む（ステップＳ１９０１）。つぎに、集計部５０３により文字コードと予約語の出現頻度を集計する（ステップＳ１９０２）。そして、葉数削減処理を実行する（ステップＳ１９０３）。つぎに、分類部５０６により、文字コード等をその出現確率Ｐに応じて階層別に分類する（ステップＳ１９０４）。
【０１０６】
このあと、算出部５０７によるパラメータ算出処理（ステップＳ１９０５）、ポインタ生成部５０８、ポインタ格納部５０９、葉生成部５１０、文字コード格納部５１１による構造体セル構築処理（ステップＳ１９０６）、最適化処理（ステップＳ１９０７）を実行する。これにより、２n分枝ハフマン木Ｈ１が自動生成される。
【０１０７】
図２０は、図１９に示した葉数削減処理（ステップＳ１９０３）の詳細な処理手順を示すフローチャートである。まず、ソート部５０４により、１６ビットの文字コードおよび予約語を出現頻度の降順にソートする（ステップＳ２００１）。その順位を参照して、低位文字コードを抽出し（ステップＳ２００２）、低位文字コードを前後８ビットの分割文字コードに分割する（ステップＳ２００３）。そして、分割文字コードの出現頻度を集計する（ステップＳ２００４）。最後に、１６ビットの文字コード、分割文字コード、予約語の出現頻度をすべて含めて出現頻度の降順にソートする（ステップＳ２００５）。このあと、ステップＳ１９０４に移行する。
【０１０８】
図２１は、図１９に示したパラメータ算出処理（ステップＳ１９０５）の詳細な処理手順を示すフローチャートである。まず、階層番号ｉをｉ＝１にセットし（ステップＳ２１０１）、ｉ＞ｋであるか否かを判断する（ステップＳ２１０２）。
【０１０９】
ｉ＞ｋでない場合（ステップＳ２１０２：Ｎｏ）、第ｉ階層における葉Ｌ♯へのポインタ数Ｎｌｐ（ｉ）、第ｉ階層における下位節点へのポインタ数Ｎｎｐ（ｉ）、第ｉ階層における構造体セルＣ（ｉ，ｊ）の使用数Ｎｃｕ（ｉ）、葉へのポインタ数の累計値ΣＮｌｐ（ｉ）、第ｉ階層における先頭からの空きセル数Ｎｃｓｔ（ｉ）、第ｉ階層における末尾までの空きポインタ数Ｎｐｓｅ（ｉ）、第ｉ階層における末尾までの空きセル数Ｎｃｓｅ（ｉ）を算出する（ステップＳ２１０３〜Ｓ２１０９）。
【０１１０】
そして、階層番号ｉを１ポイントインクリメントし（ステップＳ２１１０）、ステップＳ２１０２に戻る。ステップＳ２１０２において、ｉ＞ｋである場合（ステップＳ２１０２：Ｙｅｓ）、ステップＳ１９０６に移行する。
【０１１１】
図２２は、図１９に示した構造体セル構築処理（ステップＳ１９０６）の詳細な処理手順を示すフローチャートである。まず、節点集合体１００を読み込み（ステップＳ２２０１）、階層番号ｉをｉ＝１にセットし（ステップＳ２２０２）、セル番号ｊをｊ＝１にセットする（ステップＳ２２０３）。そして、第ｉ階層の構造体セルＣ（ｉ，ｊ）の構築処理を実行する（ステップＳ２２０４）。
【０１１２】
このあと、ｊが第ｉ階層の節点数２ｎ（ｉ−１）に対して、ｊ＞２ｎ（ｉ−１）であるか否かを判断する（ステップＳ２２０５）。ｊ＞２ｎ（ｉ−１）でない場合（ステップＳ２２０５：Ｎｏ）、ｊを１ポイントインクリメントし（ステップＳ２２０６）、ステップＳ２２０４に戻る。一方、ｊ＞２ｎ（ｉ−１）である場合（ステップＳ２２０５：Ｙｅｓ）、ｉ＞ｋであるか否かを判断する（ステップＳ２２０７）。ｉ＞ｋでない場合（ステップＳ２２０７：Ｎｏ）、ｉを１ポイントインクリメントし（ステップＳ２２０８）、ステップＳ２２０３に戻る。一方、ｉ＞ｋである場合（ステップＳ２２０７：Ｙｅｓ）、ステップＳ１９０７に移行する。
【０１１３】
図２３は、図２２に示した第ｉ階層の構造体セルＣ（ｉ，ｊ）の構築処理（ステップＳ２２０４）の詳細な処理手順を示すフローチャート（前半）である。まず、Ｎｌｐ（ｉ）個の葉Ｌ♯へのポインタを生成し（ステップＳ２３０１）、第ｉ階層に関する葉Ｌ♯の構造体を生成する（ステップＳ２３０２）。そして、Ｎｎｐ（ｉ）個の下位節点へのポインタを生成する（ステップＳ２３０３）。このあと、セル番号ｊが先頭からの空きセル数Ｎｃｓｔ（ｉ）に対して、ｊ＞Ｎｃｓｔ（ｉ）であるか否かを判断する（ステップＳ２３０４）。
【０１１４】
ｊ＞Ｎｃｓｔ（ｉ）でない場合（ステップＳ２３０４：Ｎｏ）、構造体セルＣ（ｉ，ｊ）を空きセルに決定する（ステップＳ２３０５）。そして、ｊを１ポイントインクリメントし（ステップＳ２３０６）、ステップＳ２３０４に戻る。一方、ｊ＞Ｎｃｓｔ（ｉ）である場合（ステップＳ２３０４：Ｙｅｓ）、ｊ＞Ｎｃｓｔ（ｉ）＋Ｎｃｕ（ｉ）であるか否かを判断する（ステップＳ２３０７）。Ｎｃｕ（ｉ）は第ｉ階層における構造体セル使用数である。
【０１１５】
ｊ＞Ｎｃｓｔ（ｉ）＋Ｎｃｕ（ｉ）である場合（ステップＳ２３０７：Ｙｅｓ）、ステップＳ２２０５に移行する。一方、ｊ＞Ｎｃｓｔ（ｉ）＋Ｎｃｕ（ｉ）でない場合（ステップＳ２３０７：Ｎｏ）、ステップＳ２４０１に移行する。
【０１１６】
図２４は、図２２に示した第ｉ階層の構造体セルＣ（ｉ，ｊ）の構築処理（ステップＳ２２０４）の詳細な処理手順を示すフローチャート（後半）である。ステップＳ２４０１において、構造体セルＣ（ｉ，ｊ）に空きがあるか否かを判断する（ステップＳ２４０１）。空きがない場合（ステップＳ２４０１：Ｎｏ）、ｊを１ポイントインクリメントして（ステップＳ２４０２）、ステップＳ２４０１に戻る。
【０１１７】
一方、空きがある場合（ステップＳ２４０１：Ｙｅｓ）、葉Ｌ♯へのポインタを葉の番号♯の若い順に構造体セルＣ（ｉ，ｊ）に格納する（ステップＳ２４０３）。そして、格納した葉Ｌ♯のポインタによりリンク先となる葉Ｌ♯の構造体に上位節点Ｃ（ｉ−１，ｊ）へのポインタを生成・格納する（ステップＳ２４０４）。
【０１１８】
そして、未保存の葉Ｌ♯へのポインタがあるか否かを判断する（ステップＳ２４０５）。未保存の葉Ｌ♯へのポインタがある場合（ステップＳ２４０５：Ｙｅｓ）、ステップＳ２４０１に戻る。一方、未保存の葉Ｌ♯へのポインタがない場合（ステップＳ２４０５：Ｎｏ）、構造体セルＣ（ｉ，ｊ）に空きがあるか否かを判断する（ステップＳ２４０６）。空きがない場合（ステップＳ２４０６：Ｎｏ）、ｊを１ポイントインクリメントして（ステップＳ２４０７）、ステップＳ２４０６に戻る。
【０１１９】
一方、構造体セルＣ（ｉ，ｊ）に空きがある場合（ステップＳ２４０６：Ｙｅｓ）、下位節点へのポインタを節点番号の若い順に構造体セルＣ（ｉ，ｊ）に格納する（ステップＳ２４０８）。そして、未格納の下位節点へのポインタがあるか否かを判断する（ステップＳ２４０９）。未格納の下位節点へのポインタがある場合（ステップＳ２４０９：Ｙｅｓ）、ステップＳ２４０６に戻る。一方、未格納の下位節点へのポインタがない場合（ステップＳ２４０９：Ｎｏ）、図２３のステップＳ２３０４に戻る。
【０１２０】
図２５は、図１９に示した最適化処理（ステップＳ１９０７）の詳細な処理手順を示すフローチャートである。まず、階層番号ｉをｉ＝ｋとし（ステップＳ２５０１）、ｉ＝１であるか否かを判断する（ステップＳ２５０２）。ｉ＝１でない場合（ステップＳ２５０２：Ｎｏ）、検出部５１２により、第ｉ階層の葉Ｌ♯へのポインタ数Ｎｌｐ（ｉ）、第（ｉ−１）階層の下位節点へのポインタ数Ｎｎｐ（ｉ−１）、および第（ｉ−１）階層の末尾までの空きポインタ数Ｎｐｓｅ（ｉ−１）を算出結果テーブル５２０から検出する（ステップＳ２５０３）。
【０１２１】
そして、Ｎｌｐ（ｉ）＝０であるか否かを判断する（ステップＳ２５０４）。Ｎｌｐ（ｉ）＝０である場合（ステップＳ２５０４：Ｙｅｓ）、移動させる葉Ｌ♯へのポインタがないため、ステップＳ２５０９に移行する。一方、Ｎｌｐ（ｉ）＝０でない場合（ステップＳ２５０４：Ｎｏ）、Ｎｐｓｅ（ｉ−１）＝０であるか否かを判断する（ステップＳ２５０５）。Ｎｐｓｅ（ｉ−１）＝０である場合（ステップＳ２５０５：Ｙｅｓ）、空きがないこととなり、ステップＳ２５０９に移行する。
【０１２２】
一方、Ｎｐｓｅ（ｉ−１）＝０でない場合（ステップＳ２５０５：Ｎｏ）、特定部５１３により、上記（６）式を用いて、第ｉ階層から第（ｉ−１）階層へ移動させる葉Ｌ♯へのポインタ（移動対象ポインタ）およびその数を特定する（ステップＳ２５０６）。
【０１２３】
つぎに、移動対象ポインタを格納している構造体セルＣ（ｉ，ｊ）をポイントする第（ｉ−１）階層の下位節点Ｃ（ｉ，ｊ）へのポインタを第（ｉ−１）階層から削除する（ステップＳ２５０７）。そして、移動対象ポインタを第（ｉ−１）階層に移動させ、葉Ｌ♯の番号♯が連続するように格納する（ステップＳ２５０８）。この後、ステップＳ２５０９において、階層番号ｉを１ポイントデクリメントし（ステップＳ２５０９）、ステップＳ２５０２に戻る。ステップＳ２５０２において、階層番号ｉ＝１の場合（ステップＳ２５０２：Ｙｅｓ）、一連の処理を終了する。これにより、情報処理装置５００が自動実行する２ｎ分枝ハフマン木生成処理手順の一連の説明を終了する。
【０１２４】
つぎに、２ｎ分枝ハフマン木Ｈ１を用いた圧縮処理と伸長処理について説明する。ここでは、上述した生成処理により自動生成された２ｎ分枝ハフマン木Ｈ１を用いてもよく、あらかじめ与えられた２ｎ分枝ハフマン木Ｈ１であってもよい。具体的には、２ｎ分枝ハフマン木Ｈ１を無節点ハフマン木Ｈ２に変換し、無節点ハフマン木Ｈ２を用いて圧縮処理と伸長処理を実行する。
【０１２５】
＜無節点ハフマン木＞
ここで、無節点ハフマン木Ｈ２について説明する。無節点ハフマン木Ｈ２とは、根と葉のみからなる内部節点のないハフマン木である。無節点ハフマン木Ｈ２は、枝の本数が多くなるが、根から１パスで葉にアクセスすることができる。無節点ハフマン木Ｈ２は、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶されており、ＣＰＵ４０１がアクセス可能である。
【０１２６】
図２６は、２ｍ分枝の無節点ハフマン木を示す説明図である。２ｍ（ｍ＝１２）分枝の無節点ハフマン木Ｈ２では、根から葉へのポインタとなる枝番号はｍビットコードのアドレスとなる。すなわち、葉の番号１〜４０９６の葉へのポインタは、“００００００００００００”〜“１１１１１１１１１１１１”となる。１６ビットの文字コードの場合、１２ビットコード以下に圧縮されることとなる。なお、ｍは、ｍ＜２ｎとなる値であり、たとえば、この不等式を満たす値のうち４の倍数で最大のものを用いる。ｍはｎに応じてあらかじめ設定される。たとえば、ｎ＝４の場合、ｍ＝１２とする。
【０１２７】
図２７は、２ｍ分枝の無節点ハフマン木Ｈ２の節点（根）の構造体を示す説明図である。上述の２n分枝ハフマン木Ｈ１の場合と同様、葉の総数が１２９５個であるとすると、葉の数が余ることとなる。したがって、出現頻度の高い文字コード等を格納する葉に対して複数（たとえば、２５６個）のポインタを用意する。
【０１２８】
図２７では、出現頻度が高い２ｎ分枝ハフマン木Ｈ１の第１階層の葉Ｌ１〜Ｌ３に対して、それぞれ２５６個の葉へのポインタを割り当てて根の構造体セルＣ（１，１）に格納する。また、出現頻度の高い第２階層の葉Ｌ４〜葉Ｌ１３４についても、それぞれ１６個の葉へのポインタを割り当てて根の構造体セルＣ（１，１）に格納する。第３階層の葉Ｌ１３５〜葉Ｌ１２９５については、それぞれ１個の葉へのポインタを割り当てて根の構造体セルＣ（１，１）に格納する。
【０１２９】
図２８は、無節点ハフマン木Ｈ２の葉の構造体を示す説明図である。葉の全体は、第１領域２８０１〜第５領域２８０５を有する。無節点ハフマン木Ｈ２の葉の構造体は、２ｎ分枝ハフマン木Ｈ１の葉の構造体から複写された構造体であるため、第１領域２８０１〜第４領域２８０４は、図１１の第１領域１１３１〜第４領域１１３４に対応する。第１領域２８０１には、圧縮符号およびその圧縮符号長が格納される。第２領域２８０２には、図１１と同様、葉の標識と伸長種別が格納される。第３領域２８０３には、図１１と同様、伸長種別に応じて高位１６ビット文字コード、低位の分割８ビット文字コード、または予約語へのポインタが格納される。
【０１３０】
第４領域２８０４には、図１１と同様、出現率領域が格納される。第５領域２８０５には、符号種別と符号区分が格納される。符号種別とは、文字コードが数字、英字、特殊記号、カタカナ、ひらがな、漢字のいずれに該当するか、または予約語へのポインタであるかを識別する情報である。符号区分とは、文字コードが１６ビットであるか８ビットであるかを識別する情報である。１６ビットの文字コードである場合または予約語である場合、符号区分として“１”を割り当て、８ビットの分割文字コードの場合、符号区分として“０”を割り当てる。
【０１３１】
また、第５領域２８０５には、圧縮符号マップ群Ｍｓへのポインタを構成するアドレス値が格納される。圧縮符号マップ群Ｍｓへのポインタとは、圧縮符号マップ群Ｍｓのうち葉Ｌ♯の構造体に格納されている文字コード固有の圧縮符号マップＭ♯にアクセスするポインタである。１０２４種の高位文字コードの場合は、０００１〜１０２４のアドレス値が文字コードごとに割り当てられる。
【０１３２】
また、１５種の予約語の場合は、１０２５〜１０３９のアドレス値が予約語（のポインタ）ごとに割り当てられる。上位８ビットの分割文字コードの場合は、０００１〜０２５６のアドレス値が上位８ビットの分割文字コードごとに割り当てられる。下位８ビットの分割文字コードの場合は、０２５７〜０５１２のアドレス値が上位８ビットの分割文字コードごとに割り当てられる。なお、第５領域２８０５の符号区分とアドレス値により圧縮符号マップ群Ｍｓへのポインタを構成する。
【０１３３】
図２９は、葉Ｌ♯の構造体に格納される情報を示す説明図である。各レコードが葉Ｌ♯の構造体に相当する。各葉Ｌ♯の構造体は、圧縮符号およびその圧縮符号長、葉の番号、伸長種別、文字コード等（文字コード（１６／８ビット）または予約語へのポインタ）、圧縮符号マップへのポインタといった情報を含む。圧縮符号マップへのポインタは、符号区分とアドレス値ａｄｒ♯を連結したアドレスとする。なお、圧縮符号マップへのポインタは、たとえば、１１ビットのアドレスである。先頭ビットは符号区分となる。後続の１０ビットがアドレス値である。高位文字コードは１０２４種であるため、１０ビットで表現される。分割文字コードは、０ｘ００〜０ｘＦＦの２５６種であり８ビットで足りるが、上位と下位に分類するため、１０ビットのうち上位２ビットを使って上位と下位を識別する。
【０１３４】
＜２ｎ分枝ハフマン木Ｈ１→無節点ハフマン木Ｈ２への変換＞
無節点ハフマン木Ｈ２は、２ｎ分枝ハフマン木Ｈ１からの変換により生成することができる。具体的には、たとえば、２ｎ分枝ハフマン木Ｈ１から２ｍ分枝（ｍ＝ｎ×ｋ）の無節点ハフマン木Ｈ２を生成することができる。以下、２ｍ分枝の無節点ハフマン木Ｈ２へ変換するための機能的構成について説明する。
【０１３５】
＜情報処理装置５００の機能的構成２＞
図３０は、実施の形態にかかる情報処理装置５００の機能的構成２を示すブロック図である。図３０では、図１に示した処理の流れ（１）〜（６）のうち、（３）の処理を実行する機能的構成を示している。なお、図５に示した構成と同一構成には同一符号を付し、その説明を省略する。
【０１３６】
図３０において、情報処理装置５００は、決定部３００１と、複製部３００２と、根生成部３００３と、第１の構築部３００４と、第２の構築部３００５と、文字構造体生成部５１５と、を備えている。決定部３００１〜第２の構築部３００５は、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶されたプログラムをＣＰＵ４０１に実行させることにより、または、Ｉ／Ｆ４０９により、その機能を実現する。
【０１３７】
決定部３００１は、２ｎ分枝ハフマン木Ｈ１の階層数と第ｉ階層の葉の数に基づいて、第ｉ階層の葉ごとに葉へのポインタの種類数を決定する機能を有する。具体的には、たとえば、ＣＰＵ４０１は、第１階層の種類数は２５６種、第２階層の種類数は１６種、第３階層以降の種類数は１種というように、あらかじめ設定しておく。たとえば、上述した２ｎ分枝ハフマン木Ｈ１では、第１階層の葉の数は３個、第２階層の葉の数は１３１個、第３階層の葉の数は１１６１個である。
【０１３８】
したがって、葉のポインタ数は４０２５個（＝３個×２５６種＋１３１個×１６種＋１１６１個×１種）となり、４０９６個（２ｍ個）以下となる。これにより、第１階層の種類数は２５６種、第２階層の種類数は１６種、第３階層以降の種類数は１種に確定する。もし、４０９６個よりも多くなった場合は、第１階層の種類数を１６種にしたり、第２階層の種類数を１種にするなどして、４０９６個以下となるように最適化する。
【０１３９】
複製部３００２は、２ｎ分枝ハフマン木Ｈ１の葉を複製する機能を有する。具体的には、たとえば、ＣＰＵ４０１は、葉Ｌ♯の構造体をコピーして、内部の上位節点へのポインタや圧縮符号長をクリアする。
【０１４０】
根生成部３００３は、２ｍ個の葉へのポインタを格納可能な根を生成して、記憶装置に格納する機能を有する。具体的には、たとえば、ｎ＝４の場合、ｍ＝１２、すなわち、４０９６個の空きポインタを有する根の構造体を生成する。
【０１４１】
第１の構築部３００４は、決定部３００１によって決定された種類数に基づいて、複製部３００２によって複製された葉ごとに当該葉へのポインタを生成し、根生成部３００３によって生成された根に格納する機能を有する。具体的には、たとえば、第１階層について２５６種と決定された場合、第１階層に関する葉Ｌ１に対しては、葉Ｌ１へのポインタＬ１Ｐ（１）〜Ｌ１Ｐ（２５６）を生成する。そして、この葉Ｌ１へのポインタＬ１Ｐ（１）〜Ｌ１Ｐ（２５６）を根の構造体に格納する。
【０１４２】
また、第２階層について１６種と決定された場合、第２階層に関する葉Ｌ４に対しては、葉Ｌ４へのポインタＬ４Ｐ（１）〜Ｌ４Ｐ（１６）を生成する。そして、この葉Ｌ４へのポインタＬ４Ｐ（１）〜Ｌ４Ｐ（１６）を根の構造体に格納する。また、第３階層について１種と決定された場合、第３階層に関する葉Ｌ１３５に対しては、葉Ｌ１３５へのポインタＬ１３５Ｐ（１）を生成する。そして、この葉Ｌ１３５へのポインタＬ１３５Ｐ（１）を根の構造体に格納する。
【０１４３】
第２の構築部３００５は、葉に対する当該葉へのポインタ群に共通のビット列からなる圧縮符号を抽出し、当該圧縮符号およびその圧縮符号長を葉に格納して葉を再構築することにより、根および葉からなる無節点ハフマン木Ｈ２を生成する機能を有する。具体的には、たとえば、任意の葉Ｌ♯について葉Ｌ♯へのポインタが複数種生成されている場合、これらのポインタに共通のビット列を圧縮符号と特定する。また、その圧縮符号長も取得する。そして、圧縮符号および圧縮符号長をその葉Ｌ♯の構造体に格納する。
【０１４４】
たとえば、葉Ｌ１については、２５６種の葉Ｌ１へのポインタＬ１Ｐ（１）〜Ｌ１Ｐ（２５６）が生成されているとした場合、以下のようなビット列となる。
【０１４５】
ポインタＬ１Ｐ（    １）：００００００００００００
ポインタＬ１Ｐ（    ２）：０００００００００００１
ポインタＬ１Ｐ（    ３）：００００００００００１０
ポインタＬ１Ｐ（    ４）：００００００００００１１
・                  ・
・                  ・
・                  ・
ポインタＬ１Ｐ（２５６）：００００１１１１１１１１
【０１４６】
ポインタＬ１Ｐ（１）〜Ｌ１Ｐ（２５６）では、上位４ビットの“００００”が共通のビット列となるため、この上位４ビット“００００”が葉Ｌ１の構造体の圧縮符号として特定される。また、この圧縮符号長は４ビットであるため、圧縮符号“００００”とともに葉Ｌ１の構造体に格納される。したがって、葉Ｌ１の構造体は、２５６種の葉Ｌ１へのポインタＬ１Ｐ（１）〜Ｌ１Ｐ（２５６）のいずれが指定されてもアクセスされることとなる。これにより、アクセス頻度が高くなるため、葉Ｌ１の構造体に格納されている文字コードはその圧縮符号へのアクセス頻度も高くなる。葉Ｌ２，Ｌ３も同様である。
【０１４７】
また、葉Ｌ４については、１６種の葉Ｌ４へのポインタＬ４Ｐ（１）〜Ｌ４Ｐ（１６）が生成されているとした場合、以下のようなビット列となる。
【０１４８】
ポインタＬ４Ｐ（  １）：００１１００００００００
ポインタＬ４Ｐ（  ２）：００１１０００００００１
ポインタＬ４Ｐ（  ３）：００１１００００００１０
ポインタＬ４Ｐ（  ４）：００１１００００００１１
・                  ・
・                  ・
・                  ・
ポインタＬ４Ｐ（１６）：００１１００００１１１１
【０１４９】
ポインタＬ４Ｐ（１）〜Ｌ４Ｐ（１６）では、上位８ビットの“００１１００００”が共通のビット列となるため、この上位８ビット“００１１００００”が葉Ｌ４の構造体の圧縮符号として特定される。また、この圧縮符号長は８ビットであるため、圧縮符号“００１１００００”とともに葉Ｌ４の構造体に格納される。したがって、葉Ｌ４の構造体は、１６種の葉Ｌ４へのポインタＬ４Ｐ（１）〜Ｌ４Ｐ（１６）のいずれが指定されてもアクセスされることとなる。これにより、アクセス頻度が高くなるため（葉Ｌ１〜Ｌ３よりは低いが）、葉Ｌ４の構造体に格納されている文字コードはその圧縮符号へのアクセス頻度も高くなる。
【０１５０】
また、葉Ｌ１３５については、１種の葉Ｌ１３５へのポインタＬ１３５Ｐ（１）が生成されているとした場合、以下のようなビット列となる。
【０１５１】
ポインタＬ１３５Ｐ（１）：１０１０００１０００００
【０１５２】
ポインタＬ１３５Ｐ（１）は１種だけであるため、この１２ビット“１０１０００１０００００”が葉Ｌ１３５の構造体の圧縮符号として特定される。また、この圧縮符号長は１２ビットであるため、圧縮符号“１０１０００１０００００”とともに葉Ｌ１３５の構造体に格納される。このように構築することで、無節点ハフマン木Ｈ２が生成されることとなる。すなわち、無節点ハフマン木Ｈ２の根では、葉の数に応じた長さとなる葉へのポインタが、各葉に対する枝として文字コードの出現率に応じた個数分割り当てられていることとなる。
【０１５３】
また、第２の構築部３００５は、圧縮符号を葉Ｌ♯の構造体に格納する際、符号区分に応じて未使用のアドレス値ａｄｒ♯を符号区分とともに格納する。具体的には、葉Ｌ♯の構造体において、伸長種別を参照して符号区分を格納する。そして、符号区分ごとに未使用のアドレス値ａｄｒ♯を格納する。これにより、文字コード等ごとに、圧縮符号マップＭ♯へのポインタを、葉Ｌ♯の構造体ごとに格納することができる。
【０１５４】
また、文字構造体生成部５１５は、あらたに構築された無節点ハフマン木Ｈ２を参照して文字構造体５３０を再度生成（更新）することとなる。すなわち、予約語の構造体１６００や高位文字コードの構造体１７００、分割文字コードの構造体１８００中、あらたに生成された葉へのポインタが格納されることとなる。
【０１５５】
＜２ｎ分枝ハフマン木Ｈ１→２ｍ分枝無節点ハフマン木変換処理＞
図３１−１は、情報処理装置５００が自動実行する２ｎ分枝ハフマン木Ｈ１→２ｍ分枝無節点ハフマン木変換処理手順を示すフローチャートである。図３１−１において、まず、２ｎ分枝ハフマン木Ｈ１の構造体を読み込み（ステップＳ３１０１）、決定部３００１により、階層ごとの葉へのポインタの種類数を決定する（ステップＳ３１０２）。
【０１５６】
つぎに、複製部３００２により２ｎ分枝ハフマン木Ｈ１の葉Ｌ♯の構造体を複製して（ステップＳ３１０３）、根生成部３００３により、根の構造体を生成する（ステップＳ３１０４）。そして、階層番号ｉをｉ＝１とし（ステップＳ３１０５）、第ｉ階層の未選択の葉Ｌ♯の構造体があるか否かを判断する（ステップＳ３１０６）。
【０１５７】
未選択の葉Ｌ♯の構造体がある場合（ステップＳ３１０６：Ｙｅｓ）、未選択の葉Ｌ♯の構造体を１つ選択し（ステップＳ３１０７）、決定された種類数分の葉へのポインタを生成して根の構造体に格納する（ステップＳ３１０８）。そして、種類数分の葉へのポインタから圧縮符号および圧縮符号長を特定して、葉Ｌ♯の構造体に格納する（ステップＳ３１０９）。このあと、圧縮符号マップＭ♯へのポインタ設定処理を実行して（ステップＳ３１１０）、ステップＳ３１０６に戻る。圧縮符号マップＭ♯へのポインタ設定処理については、図３１−２で後述する。
【０１５８】
一方、ステップＳ３１０６において、未選択の葉Ｌ♯の構造体がない場合（ステップＳ３１０６：Ｎｏ）、階層番号ｉを１ポイントインクリメントして（ステップＳ３１１１）、２ｎ分枝ハフマン木Ｈ１の階層数ｋに対してｉ＞ｋであるか否かを判断する（ステップＳ３１１２）。ｉ＞ｋでない場合（ステップＳ３１１２：Ｎｏ）、ステップＳ３１０６に戻る。一方、ｉ＞ｋである場合（ステップＳ３１１２：Ｙｅｓ）、一連の変換処理を終了する。
【０１５９】
図３１−２は、図３１−１に示した圧縮符号マップＭ♯へのポインタ設定処理（ステップＳ３１１０）の詳細な処理手順を示すフローチャートである。まず、（ステップＳ３１０７において選択されている葉Ｌ♯の構造体を参照して、文字コード等の符号種別および符号区分を特定する（ステップＳ３１２１）。つぎに、特定された符号種別および符号区分にしたがって、アドレス値ａｄｒａ〜ａｄｒｄの初期値を設定する（ステップＳ３１２２）。
【０１６０】
具体的には、葉Ｌ♯の構造体について、符号種別が数字、英字、特殊記号、カタカナ、ひらがな、漢字などの文字コードであり、かつ、符号区分が“１”である場合、１６ビットの文字コード用のアドレス値ａｄｒａの初期値をａｄｒａ＝０００１に設定する。
【０１６１】
また、葉Ｌ♯の構造体について、符号種別が予約語へのポインタであり、かつ、符号区分が“１”である場合、予約語へのポインタ用のアドレス値ａｄｒｂの初期値をａｄｒｂ＝１０２５に設定する。
【０１６２】
また、葉Ｌ♯の構造体について、符号種別が上位８ビットの分割文字コードであり、かつ、符号区分が“０”である場合、上位８ビットの分割文字コード用のアドレス値ａｄｒｃの初期値をａｄｒｃ＝０００１に設定する。
【０１６３】
また、葉Ｌ♯の構造体について、符号種別が下位８ビットの分割文字コードであり、かつ、符号区分が“０”である場合、下位８ビットの分割文字コード用のアドレス値ａｄｒｄの初期値をａｄｒｄ＝０２５７に設定する。
【０１６４】
そして、葉Ｌ♯の構造体内の符号区分を判断する（ステップＳ３１２３）。符号区分が“１”であり（ステップＳ３１２３：１）、かつ、符号種別が文字コードである場合（ステップＳ３１２４：文字コード）、アドレス値ａｄｒａを葉Ｌ♯の構造体の第５領域２８０５に格納する（ステップＳ３１２５）。このあと、アドレス値ａｄｒａをインクリメントして（ステップＳ３１２６）、ステップＳ３１０６に移行する。
【０１６５】
また、ステップＳ３１２３において、符号区分が“１”であり（ステップＳ３１２３：１）、かつ、符号種別が予約語へのポインタである場合（ステップＳ３１２４：予約語へのポインタ）、アドレス値ａｄｒｂを葉Ｌ♯の構造体の第５領域２８０５に格納する（ステップＳ３１２７）。このあと、アドレス値ａｄｒｂをインクリメントして（ステップＳ３１２８）、ステップＳ３１０６に移行する。
【０１６６】
また、ステップＳ３１２３において、符号区分が“０”であり（ステップＳ３１２３：０）、かつ、符号種別が上位８ビットの分割文字コードである場合（ステップＳ３１２９：上位）、アドレス値ａｄｒｃを葉Ｌ♯の構造体の第５領域２８０５に格納する（ステップＳ３１３０）。このあと、アドレス値ａｄｒｃをインクリメントして（ステップＳ３１３１）、ステップＳ３１０６に移行する。
【０１６７】
また、ステップＳ３１２３において、符号区分が“０”であり（ステップＳ３１２３：０）、かつ、符号種別が下位８ビットの分割文字コードである場合（ステップＳ３１２９：下位）、アドレス値ａｄｒｄを葉Ｌ♯の構造体の第５領域２８０５に格納する（ステップＳ３１３２）。このあと、アドレス値ａｄｒｄをインクリメントして（ステップＳ３１３３）、ステップＳ３１０６に移行する。これにより、各葉Ｌ♯の構造体に、圧縮符号マップＭ♯へのポインタが設定されることとなる。したがって、無節点ハフマン木Ｈ２を探索する際に、圧縮符号マップＭ♯を特定することができる。
【０１６８】
このように、２ｎ分枝ハフマン木Ｈ１から２ｍ分枝の無節点ハフマン木Ｈ２に変換することにより、無節点ハフマン木Ｈ２が圧縮や伸長に用いられることとなる。無節点ハフマン木Ｈ２を圧縮や伸長に用いることにより、２ｎ分枝ハフマン木Ｈ１にくらべて圧縮率および検索速度の向上を図ることができる。
【０１６９】
＜無節点ハフマン木を用いた圧縮処理＞
つぎに、２ｍ分枝の無節点ハフマン木Ｈ２を用いた圧縮処理について説明する。２ｍ分枝の無節点ハフマン木Ｈ２では１パスで葉にアクセスできるため、検索速度の高速化を図ることができる。以下、そのための機能的構成について説明する。
【０１７０】
＜情報処理装置５００の機能的構成３＞
図３２は、実施の形態にかかる情報処理装置５００の機能的構成３を示すブロック図である。図３２では、図１に示した処理の流れ（１）〜（６）のうち、（４）〜（６）の処理を実行する機能的構成を示している。なお、図５に示した構成と同一構成には同一符号を付し、その説明を省略する。図３２において、情報処理装置５００は、圧縮部３２００（分割部５０５、設定部３２０１、圧縮対象文字コード探索部３２０２、ハフマン木探索部３２０３、圧縮符号格納部３２０４）と、検出部３２０５と、生成部３２５６と、圧縮符号マップ特定部３２０６と、圧縮符号マップ更新部３２０７と、圧縮符号マップ圧縮部３２０８（ビット列圧縮部３２８１と非圧縮領域設定部３２８２）と、圧縮バッファ３２１１とを備えている。
【０１７１】
設定部３２０１〜圧縮符号マップ圧縮部３２０８，生成部３２５６は、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶されたプログラムをＣＰＵ４０１に実行させることにより、または、Ｉ／Ｆ４０９により、その機能を実現する。また、圧縮バッファ３２１１は、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体によりその機能を実現する。
【０１７２】
圧縮部３２００は、対象ファイル群Ｆｓの中から選ばれた対象ファイルＦに記述されている圧縮対象文字コードをハフマン木に従って順次圧縮する機能を有する。具体的には、たとえば、分割部５０５、設定部３２０１、圧縮対象文字コード探索部３２０２、ハフマン木探索部３２０３、圧縮符号格納部３２０４により圧縮をおこなう。
【０１７３】
設定部３２０１は、圧縮処理をおこなう場合、圧縮対象文字コードを設定する機能を有する。具体的には、たとえば、入力されてくる圧縮対象文字コードや圧縮符号列を、ＣＰＵ４０１が内部のレジスタや外部のバッファに書き込む。
【０１７４】
図３３−１は、圧縮対象文字コード列の一例を示す説明図である。ここでは、「人形芝居」という文字列を圧縮対象文字列とし、その文字コード列を示している。なお、「芝」は低位文字コードであるため、上位８ビットと下位８ビットに分割される。
【０１７５】
図３３−２は、圧縮符号列の一例を示す説明図である。ここでも、「人形芝居」という文字列の圧縮符号列を示している。「芝」は上位８ビットと下位８ビットに分割されているため、圧縮符号も分割文字コードごとに割り当てられる。
【０１７６】
図３２に戻って、圧縮対象文字コード探索部３２０２は、高位の文字コード群の中から設定部３２０１によって設定された圧縮対象文字コードを探索する機能を有する。具体的には、たとえば、ＣＰＵ４０１が、レジスタにセットされた圧縮対象文字コードを、文字構造体５３０、すなわち、予約語の構造体１６００、高位文字コードの構造体１７００を走査することで探索する。
【０１７７】
予約語の構造体１６００、高位文字コードの構造体１７００により一致する文字コードが探索されなかった場合は、ＣＰＵ４０１は、分割部５０５により、圧縮対象文字コードを上位ビットと下位ビットに分割し、分割文字コードごとに、分割文字コードの構造体１８００を走査して探索する。
【０１７８】
ハフマン木探索部３２０３は、探索された文字コード等に対応付けられた葉Ｌ♯へのポインタを用いて、探索された文字コード等の圧縮符号を探索する機能を有する。具体的には、たとえば、ＣＰＵ４０１は、文字構造体５３０から、一致した文字コード等に対応付けられている葉Ｌ♯へのポインタを読み出して、当該葉Ｌ♯の構造体を特定する。そして、ポイントされた葉Ｌ♯の構造体に格納されている文字コードの圧縮符号を抽出する。
【０１７９】
たとえば、図２６を用いて説明すると、葉Ｌ２５６に対応する文字コードが高位文字コードとして探索された場合、葉Ｌ２５６へのポインタを高位文字コードの構造体１７００から読み出して、葉Ｌ２５６の構造体にアクセスする。この葉Ｌ２５６の構造体に格納されている文字コードの圧縮符号を葉Ｌ２５６の構造体から抽出する。
【０１８０】
圧縮符号格納部３２０４は、ハフマン木探索部３２０３によって探索された圧縮符号を所定の記憶領域に格納する機能を有する。具体的には、たとえば、ＣＰＵ４０１が、探索された圧縮符号を圧縮バッファ３２１１に書き込む。
【０１８１】
（圧縮処理の具体例）
ここで、検出部３２０５〜圧縮符号マップ圧縮部３２０８の説明の前に、２ｍ分枝の無節点ハフマン木Ｈ２を用いた対象ファイル群Ｆｓの圧縮処理の具体例について説明する。２ｍ分枝の無節点ハフマン木Ｈ２を用いた圧縮処理では、ハフマン木探索において、内部節点がないため根に向かって探索する必要はなく、ポイントされた葉Ｌ♯の構造体に格納されている文字コードを抽出して、圧縮バッファ３２１１に書き込む。予約語へのポインタを抽出した場合は、ポイント先の予約語を抽出して、圧縮バッファ３２１１に書き込む。これにより、圧縮処理の高速化を図ることができる。
【０１８２】
図３４は、２ｍ分枝の無節点ハフマン木Ｈ２を用いた圧縮処理の具体例を示す説明図である。まず、対象ファイル群Ｆｓから１文字目の圧縮対象文字コードを取得し、対象ファイル３００上の位置を保持しておく。そして、予約語の構造体１６００に対して２分木探索をおこなう。予約語は２文字以上の文字コード列であるため、１文字目の圧縮対象文字コードがヒットした場合、２文字目の文字コードを圧縮対象文字コードとして取得する。
【０１８３】
そして、２文字目の文字コードは、１文字目の圧縮対象文字コードがヒットした位置から探索する。３文字目以降も、不一致の圧縮対象文字コードが出現するまで繰り返し２分木探索をおこなう。一致する予約語ｒａ（ａは葉の番号）が探索された場合、その葉Ｌａへのポインタにより葉Ｌａの構造体にアクセスする。そして、上述したハフマン木探索により、予約語ｒａの圧縮符号を探索して、圧縮バッファ３２１１に格納する。
【０１８４】
一方、不一致の圧縮文字コードが出現した場合、予約語の構造体１６００に対する２分木探索を終了し（ＥＯＴ（Ｅｎｄ  Ｏｆ  Ｔｒａｎｓｍｉｓｓｉｏｎ）まで進み）、１文字目の圧縮対象文字コードを再度レジスタにセットして、高位文字コードの構造体１７００に対する２分木探索をおこなう。
【０１８５】
一致する文字コードｅｂ（ｂは葉の番号）が探索された場合、その葉Ｌｂへのポインタにより葉Ｌｂの構造体にアクセスする。そして、上述したハフマン木探索により、文字コードｅｂの圧縮符号を探索して、圧縮バッファ３２１１に格納する。
【０１８６】
一方、一致する文字コードが出現せず２分木探索を終了した場合、圧縮対象文字コードは高位文字コードではないため、上位８ビットと下位８ビットに分割する。そして、上位８ビットの分割文字コードについて、分割文字コードの構造体１８００に対する２分木探索をおこなう。一致する分割文字コードＤｃ１（ｃ１は葉の番号）が探索された場合、その葉Ｌｃ１へのポインタにより葉Ｌｃ１の構造体にアクセスする。そして、上述したハフマン木探索により、分割文字コードＤｃ１の圧縮符号を探索して、圧縮バッファ３２１１に格納する。
【０１８７】
引き続き、下位８ビットの分割文字コードについて、分割文字コードの構造体１８００に対する２分木探索をおこなう。一致する分割文字コードＤｃ２（ｃ２は葉の番号）が探索された場合、その葉Ｌｃ２へのポインタにより葉Ｌｃ２の構造体にアクセスする。そして、上述したハフマン木探索により、分割文字コードＤｃ２の圧縮符号を探索して、分割文字コードＤｃ１の圧縮符号に続けて圧縮バッファ３２１１に格納する。
【０１８８】
（ファイル圧縮処理手順）
図３５は、情報処理装置５００が自動実行する２ｍ分枝の無節点ハフマン木Ｈ２を用いたファイル圧縮処理手順を示すフローチャートである。まず、ファイル番号：ｐをｐ＝１とし（ステップＳ３５０１）、対象ファイルＦｐを読み込む（ステップＳ３５０２）。つぎに、圧縮処理を実行して（ステップＳ３５０３）、ファイル番号：ｐをインクリメントする（ステップＳ３５０４）。そして、ｐ＞αであるか否かを判断する（ステップＳ３５０５）。αは対象ファイル群Ｆｓの総数である。ｐ＞αでない場合（ステップＳ３５０５：Ｎｏ）、ステップＳ３５０２に戻る。一方、ｐ＞αである場合（ステップＳ３５０５：Ｙｅｓ）、一連のファイル圧縮処理を終了する。
【０１８９】
図３６は、図３５に示した圧縮処理（ステップＳ３５０３）の詳細な処理手順を示すフローチャート（その１）である。図３６において、まず、対象ファイル群Ｆｓに圧縮対象文字コードがあるか否かを判断する（ステップＳ３６０１）。ある場合（ステップＳ３６０１：Ｙｅｓ）、圧縮対象文字コードを取得してレジスタにセットする（ステップＳ３６０２）。そして、先頭の圧縮対象文字コードか否かを判断する（ステップＳ３６０３）。
【０１９０】
ここで、先頭の圧縮対象文字コードとは、未圧縮の１文字目の文字コードをいう。先頭である場合（ステップＳ３６０３：Ｙｅｓ）、その圧縮対象文字コードの対象ファイル群Ｆｓ上の位置（先頭位置）となるポインタを取得し（ステップＳ３６０４）、ステップＳ３６０５に移行する。一方、先頭でない場合（ステップＳ３６０３：Ｎｏ）、先頭位置を取得せずにステップＳ３６０５に移行する。
【０１９１】
そして、予約語の構造体１６００に対して２分木探索をおこなう（ステップＳ３６０５）。圧縮対象文字コードが一致した場合（ステップＳ３６０６：Ｙｅｓ）、連続して一致した文字コード列が予約語（の文字コード列）に該当するか否かを判断する（ステップＳ３６０７）。該当しない場合（ステップＳ３６０７：Ｎｏ）、ステップＳ３６０２に戻って後続の文字コードを圧縮対象文字コードとして取得する。この場合、後続の文字コードは先頭ではないため、先頭位置は取得しないこととなる。
【０１９２】
一方、ステップＳ３６０７において、予約語に該当する場合（ステップＳ３６０７：Ｙｅｓ）、該当する予約語の葉Ｌ♯へのポインタにより葉Ｌ♯の構造体にアクセスする（ステップＳ３６０８）。そして、ポイントされた葉Ｌ♯の構造体に格納されている予約語の圧縮符号を抽出する（ステップＳ３６０９）。
【０１９３】
この後、抽出された圧縮符号を圧縮バッファ３２１１に格納して（ステップＳ３６１０）、ステップＳ３６０１に戻る。このループが予約語の圧縮処理の流れとなる。ステップＳ３６０１において、圧縮対象文字コードがない場合（ステップＳ３６０１：Ｎｏ）、対象ファイルＦｐから圧縮された圧縮ファイルｆｐを圧縮バッファ３２１１からファイル出力して保存する（ステップＳ３６１１）。そして、ステップＳ３５０４に移行する。一方、ステップＳ３６０６において不一致となった場合（ステップＳ３６０６：Ｎｏ）、１６ビットの文字コードの圧縮処理のループに入る。
【０１９４】
図３７は、図３５に示した圧縮処理（ステップＳ３５０３）の詳細な処理手順を示すフローチャート（その２）である。図３７において、ステップＳ３６０４で取得された先頭位置のポインタを参照して、対象ファイル群Ｆｓから圧縮対象文字コードを取得してレジスタにセットする（ステップＳ３７０１）。
【０１９５】
つぎに、圧縮対象文字コードについて、高位文字コードの構造体１７００に対して２分木探索をおこなう（ステップＳ３７０２）。一致した場合（ステップＳ３７０３：Ｙｅｓ）、該当する文字の葉Ｌ♯へのポインタにより葉Ｌ♯の構造体にアクセスする（ステップＳ３７０４）。そして、ポイントされた葉Ｌ♯の構造体に格納されている圧縮対象文字コードの圧縮符号を抽出する（ステップＳ３７０５）。
【０１９６】
この後、探索された圧縮符号を圧縮バッファ３２１１に格納して（ステップＳ３７０６）、ステップＳ３６０１に戻る。このループが１６ビットの文字コードの圧縮処理の流れとなる。一方、ステップＳ３７０３において一致する文字コードが存在しなかった場合（ステップＳ３７０３：Ｎｏ）、分割文字コードの圧縮処理のループに入る。
【０１９７】
図３８は、図３５に示した圧縮処理（ステップＳ３５０３）の詳細な処理手順を示すフローチャート（その３）である。図３８において、まず、圧縮対象文字コードを上位８ビットと下位８ビットとに分割し（ステップＳ３８０１）、上位８ビットの分割文字コードを抽出する（ステップＳ３８０２）。そして、分割文字コードの構造体１８００に対して２分木探索をおこなう（ステップＳ３８０３）。
【０１９８】
そして、探索された分割文字コードの葉Ｌ♯へのポインタにより葉Ｌ♯の構造体にアクセスする（ステップＳ３８０４）。そして、ポイントされた葉Ｌ♯の構造体に格納されている分割文字コードの圧縮符号を抽出する（ステップＳ３８０５）。この後、探索された圧縮符号を圧縮バッファ３２１１に格納する（ステップＳ３８０６）。
【０１９９】
つぎに、下位８ビットが探索済みか否かを判断し（ステップＳ３８０７）、探索済みでない場合（ステップＳ３８０７：Ｎｏ）、下位８ビットの分割文字コードを抽出して（ステップＳ３８０８）、ステップＳ３８０３〜Ｓ３８０６を実行する。一方、下位８ビットが探索済みである場合（ステップＳ３８０７：Ｙｅｓ）、ステップＳ３６０１に戻り、予約語の圧縮処理のループに入る。
【０２００】
このように、２ｍ分枝の無節点ハフマン木Ｈ２を用いた圧縮処理では、内部節点がないため根に向かって探索する必要はなく、ポイントされた葉Ｌ♯の構造体に格納されている文字コードを抽出して、圧縮バッファ３２１１に書き込むだけでよい。したがって、圧縮処理の高速化を図ることができる。
【０２０１】
また、圧縮対象文字コードが格納されている葉Ｌ♯の構造体を、予約語の構造体１６００、高位文字コードの構造体１７００および分割文字コードの構造体１８００により即座に特定することができる。したがって、２ｍ分枝の無節点ハフマン木Ｈ２の葉を探索する必要がなく、圧縮処理の高速化を図ることができる。また、低位文字コードを上位ビットコードと下位ビットコードに分割することで、６万種以上ある低位の文字コードをたかだか２５６種の分割文字コードの圧縮符号に圧縮することができる。したがって、圧縮率の向上を図ることができる。
【０２０２】
また、図３２に戻って、検出部３２０５〜圧縮符号マップ圧縮部３２０８について説明する。検出部３２０５は、圧縮部３２００によるハフマン木の葉へのアクセスを検出する機能を有する。具体的には、たとえば、ハフマン木探索部３２０３による葉Ｌ♯の構造体へのアクセスを検出する。
【０２０３】
生成部３２５６は、対象ファイル群Ｆｓの中から選ばれた一の対象ファイルＦｐ内の連続する２グラムの文字コード列を構成する先行文字コードおよび後続文字コードの各識別情報のうち、少なくともいずれか一方の識別情報を２分割して他方の識別情報と組み合わせ、複数種類の組み合わせ識別情報を生成する機能を有する。
【０２０４】
具体的には、たとえば、先行文字コードの圧縮符号マップへのポインタと後続文字コードの圧縮符号マップへのポインタとを用いる。たとえば、２分割に設定されている場合、いずれか一方のポインタを上位ビットと下位ビットに分割する。非分割である他方の圧縮符号マップへのポインタに分割されたポインタをそれぞれ連結する。これにより、２種類の組み合わせポインタを生成することができる。
【０２０５】
また、４分割に設定されている場合、先行文字コードの圧縮符号マップへのポインタと後続文字コードの圧縮符号マップへのポインタとを、それぞれ上位ビットと下位ビットに分割する。分割された４個のビット列から２つ選択して連結することで、４種類の組み合わせポインタを生成することができる。
【０２０６】
組み合わせポインタについては、連続するｘグラムの文字コード列を構成する先頭文字コードの圧縮符号マップへのポインタと末尾文字コードの圧縮符号マップへのポインタについても同様に生成される。
【０２０７】
圧縮符号マップ特定部３２０６は、圧縮符号マップ群Ｍｓの中から葉Ｌ♯の構造体に格納されている文字コード等に対応する圧縮符号マップＭ♯を特定する機能を有する。具体的には、たとえば、検出部３２０５によって、ハフマン木探索部３２０３による葉Ｌ♯の構造体へのアクセスが検出された場合、当該葉Ｌ＃の構造体から圧縮符号マップへのポインタを読み出す。そして、読み出された圧縮符号マップへのポインタにより、葉Ｌ♯の構造体に格納されている文字コード等に対応する圧縮符号マップＭにアクセスする。
【０２０８】
図３９−１は、圧縮符号マップ群Ｍｓの初期状態を示す説明図である。圧縮符号マップ群Ｍｓは、アドレス項目とビット列項目とを有する。そして、葉Ｌ♯の構造体ごとに、すなわち、高位文字コード、予約語、上位８ビット分割文字コード、下位８ビット分割文字コードごとに、アドレスとビット列とがレコード化されている。
【０２０９】
アドレス項目の区分項目は、葉Ｌ♯の構造体の符号区分を示す。また、アドレス項目のアドレス値は、葉Ｌ♯の構造体のアドレス値を示す。したがって、区分項目の値とアドレス値とが連結されたアドレスが、その圧縮符号マップＭ♯へのポインタによりポイントされる。
【０２１０】
ビット列項目は、ファイル番号順に並んだファイル数分のビット列により構成される。ビットの値が“１”であるファイル番号の対象ファイルには、アドレスにより指定される文字コード等が存在する。一方、ビットの値が“０”であるファイル番号の対象ファイルには、アドレスにより指定される文字コード等が存在しない。図３９−１では、初期状態を示しているため、すべてのビット列の値は“０”である。
【０２１１】
図３２において、圧縮符号マップ更新部３２０７は、ファイル番号のビットを“０”から“１”に更新する機能を有する。具体的には、圧縮符号マップ群Ｍｓの、圧縮符号マップＭ♯へのポインタによりポイントされた圧縮符号マップＭ♯のビット列のうち、現在圧縮処理中である対象ファイルのファイル番号のビットを“０”から“１”に更新する。
【０２１２】
図３９−２は、圧縮符号マップ更新部３２０７による更新後の圧縮符号マップ群Ｍｓを示す説明図である。たとえば、一行目のレコードに該当する文字コード等は、対象ファイルＦ１〜Ｆ４には存在せず、対象ファイルＦαには存在することを示している。
【０２１３】
（２グラムの圧縮符号マップとその分割）
ここで、圧縮符号マップ圧縮部３２０８の説明の前に、２グラムの圧縮符号マップについて説明する。図３９−１および図３９−２では、１グラム、すなわち、単一の文字コード（分割文字コード含む）の対象ファイル群Ｆｓでの存否をあらわす圧縮符号マップについて説明した。２グラムの圧縮符号マップとは、２グラムの文字コード（２つの文字コード）列の対象ファイルＦｓでの存否をあらわす圧縮符号マップである。
【０２１４】
２グラムの圧縮符号マップには、２連続グラムの文字コード列の対象ファイルＦｓでの存否をあらわす圧縮符号マップと、ｘグラムの文字コード列のうち先頭グラムと末尾グラムの文字コードの対象ファイルＦｓでの存否をあらわす圧縮符号マップとがある。本明細書では、前者を「連続グラムマップ」と称し、後者を「ｘグラム頭尾マップ」と称す。
【０２１５】
たとえば、「東」，「京」，「都」の各文字は高位文字コードで表現される。この場合、ある対象ファイルＦｐに「東京都」の文字列が存在すると、「東京」の連続グラムマップと、「京都」の連続グラムマップが生成される。そして、「東京」の連続グラムマップおよび「京都」の連続グラムマップのそれぞれに、対象ファイルＦｐのビットが立つこととなる。
【０２１６】
同様に、「東京都」は３グラムの文字コード列であるため、「東」の高位文字コードを先頭グラム、「都」の高位文字コードを末尾グラムとする３グラム頭尾マップが生成される。そして、この３グラム頭尾マップに、対象ファイルＦｐのビットが立つこととなる。
【０２１７】
また、高位文字コードの文字コード数は、本例の場合、１０２４個（＝２１０）であるため、高位文字コードの圧縮符号マップへのポインタは、少なくとも１０ビットで表現されることとなる。高位文字コードが連続する連続グラムマップでは、連続する２グラムの高位文字コード列の組み合わせを網羅する必要がある。このため、２１０×２１０（＝２２０）のメモリサイズが必要となり、サイズ爆発を引き起こすこととなる。このような現象は、１グラム目が高位文字コードで２グラム目が上位分割文字コードの場合、１グラム目が上位分割文字コードで２グラム目が下位分割文字コードの場合、１グラム目が下位分割文字コードで２グラム目が高位文字コードの場合でも同様である。
【０２１８】
したがって、本実施の形態では、上述した生成部３２５６により、連続する２グラムのうち、少なくともいずれか一方のグラムの文字コードの圧縮符号マップへのポインタを上位ビットと下位ビットに分割して、複数種類のポインタを生成する。そして、圧縮符号マップ特定部３２０６により、対象ファイル数α分のビット列を複数種類のポインタにそれぞれ割り当てることで、連続グラムマップを複数種類のポインタで指定される連続グラム分割マップに分割する。ｘグラム頭尾マップについても、同様にｘグラム頭尾分割マップとする。これにより、連続グラムマップやｘグラム頭尾マップのサイズの縮小化を図る。この分割に伴い、連続グラム分割マップやｘグラム頭尾マップを用いた絞込みの際には、ＡＮＤ演算を実行すればよい。
【０２１９】
図４０は、２グラムの圧縮符号マップのサイズ縮小を示す説明図である。（Ａ）は分割前の２グラムの圧縮符号マップのサイズを示している。第１グラムの圧縮符号マップへのポインタとして１０ビット使用し、第２グラムの圧縮符号マップへのポインタとして１０ビット使用している。したがって、２１０×２１０（＝２２０）のサイズが必要となり、サイズ爆発を引き起こすこととなる。
【０２２０】
（Ｂ）では、第２グラムの圧縮符号マップへのポインタを５ビットで分割している。したがって、サイズは、２１０×２５×２（＝２１６）となり、大幅なサイズ縮小を図ることができる。（Ｂ）の場合、分割された２つのマップによりＡＮＤ演算することで、絞込みをおこなうことができる。
【０２２１】
（Ｃ）では、さらに、第１グラムの圧縮符号マップへのポインタを５ビットで分割している。したがって、メモリサイズは、２５×２５×４（＝２１２）となり、大幅なサイズ縮小を図ることができる。（Ｃ）の場合、分割された４つのマップによりＡＮＤ演算することで、絞込みをおこなうことができる。
【０２２２】
図４１は、２グラムの圧縮符号マップの分割時のサイズを示す図表である。図４０の（Ａ）のように非分割の場合、２グラムの組み合わせでの合計サイズは、１．６４Ｍとなる。一方、図４０の（Ｂ）のような２分割の場合、２グラムの組み合わせでの合計サイズは、１４４Ｋとなる。さらに、図４０の（Ｃ）のような４分割の場合、２グラムの組み合わせでの合計サイズは、１０Ｋとなる。
【０２２３】
図４２−１〜図４２−１５は、２グラムの圧縮符号マップへのポインタの分割例を示す説明図である。図４２−１は、２グラムの高位文字コードの圧縮符号マップへのポインタ列の２分割例を示している。図４２−１では、２グラム目の高位文字コードの圧縮符号マップへのポインタのアドレス値を、上位５ビットと下位５ビットで分割している。図４２−１は、図４０の（Ｂ）に相当する分割例である。
【０２２４】
図４２−２および図４２−３は、図４２−１で分割した２グラムの高位文字コードの圧縮符号マップへのポインタ列の分割例を示している。図４２−２および図４２−３は、図４０の（Ｃ）に相当する分割例である。
【０２２５】
図４２−４は、高位文字コードと上位分割文字コードとの圧縮符号マップへのポインタ列の２分割例を示している。図４２−４では、２グラム目の上位分割文字コードの圧縮符号マップへのポインタのアドレス値を、上位４ビットと下位４ビットで分割している。図４２−４は、図４０の（Ｂ）に相当する分割例である。
【０２２６】
図４２−５および図４２−６は、図４２−４で分割した高位文字コードと上位分割文字コードとの圧縮符号マップへのポインタ列の分割例を示している。図４２−５および図４２−６は、図４０の（Ｃ）に相当する分割例である。
【０２２７】
図４２−７は、上位分割文字コードと下位分割文字コードとの圧縮符号マップへのポインタ列の２分割例を示している。図４２−７では、２グラム目の下位分割文字コードの圧縮符号マップへのポインタのアドレス値を、上位４ビットと下位４ビットで分割している。図４２−７は、図４０の（Ｂ）に相当する分割例である。
【０２２８】
図４２−８および図４２−９は、図４２−７で分割した上位分割文字コードと下位分割文字コードとの圧縮符号マップへのポインタ列の分割例を示している。図４２−８および図４２−９は、図４０の（Ｃ）に相当する分割例である。
【０２２９】
図４２−１０は、下位分割文字コードと上位分割文字コードとの圧縮符号マップへのポインタ列の２分割例を示している。図４２−１０では、２グラム目の上位分割文字コードの圧縮符号マップへのポインタのアドレス値を、上位４ビットと下位４ビットで分割している。図４２−１０は、図４０の（Ｂ）に相当する分割例である。
【０２３０】
図４２−１１および図４２−１２は、図４２−１０で分割した下位分割文字コードと上位分割文字コードとの圧縮符号マップへのポインタ列の分割例を示している。図４２−１１および図４２−１２は、図４０の（Ｃ）に相当する分割例である。
【０２３１】
図４２−１３は、下位分割文字コードと高位文字コードとの圧縮符号マップへのポインタ列の２分割例を示している。図４２−１３では、２グラム目の高位文字コードの圧縮符号マップへのポインタのアドレス値を、上位５ビットと下位５ビットで分割している。図４２−１３は、図４０の（Ｂ）に相当する分割例である。
【０２３２】
図４２−１４および図４２−１５は、図４２−１３で分割した下位分割文字コードと高位文字コードとの圧縮符号マップへのポインタ列の分割例を示している。図４２−１４および図４２−１５は、図４０の（Ｃ）に相当する分割例である。
【０２３３】
図４３−１〜図４３−３２は、連続グラム分割マップの具体例を示す説明図である。なお、ｘグラム頭尾分割マップについては、１グラム目が先頭グラム、２グラム目が末尾グラムとなるだけであり、マップ構成は同一であるため、省略する。
【０２３４】
図４３−１〜図４３−４は、連続グラムがともに高位文字コードである場合の４分割の連続グラム分割マップを示す説明図である。図４３−１は、１グラム目、２グラム目ともに上位５ビットの組み合わせである。図４３−２は、１グラム目が上位５ビット、２グラム目が下位５ビットの組み合わせである。図４３−３は、１グラム目が下位５ビット、２グラム目が上位５ビットの組み合わせである。図４３−４は、１グラム目、２グラム目とも下位５ビットの組み合わせである。
【０２３５】
図４３−５〜図４３−８は、１グラム目が高位文字コードで２グラム目が上位分割文字コードである場合の４分割の連続グラム分割マップを示す説明図である。図４３−５は、１グラム目の上位５ビットと２グラム目の上位４ビットの組み合わせである。図４３−６は、１グラム目が上位５ビット、２グラム目が下位４ビットの組み合わせである。図４３−７は、１グラム目が下位５ビット、２グラム目が上位４ビットの組み合わせである。図４３−８は、１グラム目が下位５ビット、２グラム目が下位４ビットの組み合わせである。
【０２３６】
図４３−９〜図４３−１２は、１グラム目が上位分割文字コードで２グラム目が下位分割文字コードである場合の４分割の連続グラム分割マップを示している。図４３−９は、１グラム目、２グラム目ともに上位４ビットの組み合わせである。図４３−１０は、１グラム目が上位４ビット、２グラム目が下位４ビットの組み合わせである。図４３−１１は、１グラム目が下位４ビット、２グラム目が上位４ビットの組み合わせである。図４３−１２は、１グラム目、２グラム目とも下位４ビットの組み合わせである。
【０２３７】
図４３−１３〜図４３−１６は、１グラム目が下位分割文字コードで２グラム目が高位文字コードである場合の４分割の連続グラム分割マップを示している。図４３−１３は、１グラム目の上位４ビットと２グラム目の上位５ビットの組み合わせである。図４３−１４は、１グラム目が上位４ビット、２グラム目が下位５ビットの組み合わせである。図４３−１５は、１グラム目が下位４ビット、２グラム目が上位５ビットの組み合わせである。図４３−１６は、１グラム目が下位４ビット、２グラム目が下位５ビットの組み合わせである。
【０２３８】
つぎに、前方一致検索や後方一致検索の場合に用いる連続グラム分割マップについて説明する。以降、前方一致検索に用いる連続グラム分割マップを前方一致分割マップと称し、後方一致検索に用いる連続グラム分割マップを後方一致分割マップと称す。
対象ファイルＦｐでは、“，（カンマ）”や“  （スペース）”で見出し語などの単語が区切られている場合がある。また、“）”の次の文字が先頭である場合がある。したがって、前方一致検索や後方一致検索を行う場合、検索キーワードに“，（カンマ）”や“  （スペース）”などの特殊文字（高位文字コード）を付加して検索をおこなう。
【０２３９】
図４３−１７〜図４３−２４は、前方一致分割マップの具体例を示す説明図である。前方一致分割マップの作成の際には、図４３−１〜図４３−１６に示した連続グラム分割マップのうち、１グラム目が特殊文字の高位文字コードである連続グラム分割マップを抽出することで、前方一致分割マップを作成する。
【０２４０】
図４３−２５〜図４３−３２は、後方一致分割マップの具体例を示す説明図である。後方一致分割マップの作成の際には、図４３−１〜図４３−１６に示した連続グラム分割マップのうち、２グラム目が特殊文字の高位文字コードである連続グラム分割マップを抽出することで、後方一致分割マップを作成する。
【０２４１】
なお、“，（カンマ）”や“  （スペース）”など、文字列の連続性を遮断する特殊文字を仮想的に「区切り文字」と見なしUTF16の外字コードを割当て、連続グラム分割マップの1024種の高位文字コードを拡張し、1025番目に割付けすることで、上記の前方一致分割マップや後方一致分割マップを代替(省略)することができる。
【０２４２】
（連続グラム分割マップおよびｘグラム頭尾分割マップの生成例）
ここで、圧縮符号マップ特定部３２０６および圧縮符号マップ更新部３２０７による連続グラム分割マップおよびｘグラム頭尾分割マップの生成例について説明する。
【０２４３】
図４４−１〜図４４−９は、連続グラム分割マップおよびｘグラム頭尾分割マップの生成例を示す説明図である。まず、図４４−１において、対象ファイルＦｐに「人形芝居」という文字列が記述されているとする。文字列「人形芝居」の「人」，「形」，「居」は高位文字コードであり、「芝」は分割文字コードとなるため、文字列「人形芝居」は５グラムの文字コード列である。
【０２４４】
（１）まず、圧縮部３２００により、先頭の「人」の文字コードを２分木探索する。（２）文字構造体５３０で「人」の文字コードが検出され、その葉へのポインタで「人」の文字コードを含む葉Ｌ♯の構造体を指定する。（３）そして、「人」の圧縮符号マップへのポインタにより、「人」の圧縮符号マップＭを指定する。（４）つぎに、ファイル番号ｐのビットが“０”の場合、“１”に更新する。
【０２４５】
（５）また、「人」の文字コードを含む葉Ｌ♯の構造体から「人」の圧縮符号マップへのポインタを抽出する。そして、「人」の圧縮符号マップへのポインタをマップ生成用レジスタに格納する。
【０２４６】
（６）つぎに、上記（１）と同様、「形」の「人」の文字コードを２分木探索する。（７）文字構造体５３０で「形」の文字コードが検出され、その葉へのポインタで「形」の文字コードを含む葉Ｌ♯の構造体を指定する。（８）そして、「形」の圧縮符号マップへのポインタにより、「形」の圧縮符号マップＭを指定する。（９）そして、ファイル番号ｐのビットが“０”の場合、“１”に更新する。
【０２４７】
（１０）また、「形」の文字コードを含む葉Ｌ♯の構造体から「形」の圧縮符号マップへのポインタを抽出する。そして、「形」の圧縮符号マップへのポインタを「人」の圧縮符号マップへのポインタとともにマップ生成用レジスタに格納する。
【０２４８】
（１１）そして、「形」の文字コードを含む葉Ｌ♯の構造体の空き領域に、「人」の圧縮符号マップへのポインタを保存する。具体的には、連続グラム領域に、「人」の圧縮符号マップへのポインタを保存する。また、２グラム頭尾領域にも、「人」の圧縮符号マップへのポインタを保存する。
【０２４９】
図４４−２において、（１２）〜（１４）で連続グラム分割マップ群と２グラム頭尾分割マップ群を生成する。
【０２５０】
（１２）まず、現在マップ生成用レジスタに格納されている「人」の圧縮符号マップへのポインタと、「形」の圧縮符号マップへのポインタとを用いて、「人」と「形」との連続グラム分割マップへのポインタを生成する。ここでは、図４０の（Ｃ）に示したように、４分割するため、「人」と「形」との連続グラム分割マップへのポインタを４種類生成する。同様に、「人」と「形」との頭尾分割マップへのポインタを４種類生成する。
【０２５１】
（１３）つぎに、「人」と「形」との連続グラム分割マップへのポインタごとに、連続グラム分割マップを設定する。すでに他の文字の圧縮時に設定済みである場合は、連続グラム分割マップへのポインタで該当する連続グラム分割マップを指定する。同様に、「人」と「形」との２グラム頭尾分割マップへのポインタごとに、２グラム頭尾分割マップを設定する。すでに他の文字の圧縮時に設定済みである場合は、２グラム頭尾分割マップへのポインタで該当する２グラム頭尾分割マップを指定する。
【０２５２】
（１４）そして、連続グラム分割マップ群および２グラム頭尾分割マップ群において、ファイル番号ｐのビットが“０”の場合、“１”に更新する。
【０２５３】
図４４−３において、（１５）圧縮部３２００により、「芝」の文字コードを２分木探索する。「芝」の出現頻度は、１０２４より低いため、「芝」の文字コード“０ｘ９Ｄ８２”は、上位分割文字コード“０ｘ９Ｄ”と下位分割文字コード“０ｘ８２”とに分割される。
【０２５４】
（１６）まず、文字構造体５３０で上位分割文字コード“０ｘ９Ｄ”が検出され、その葉へのポインタで上位分割文字コード“０ｘ９Ｄ”を含む葉Ｌ♯の構造体を指定する。（１７）つぎに、「芝」の上位分割文字コード“０ｘ９Ｄ”の圧縮符号マップへのポインタにより、「芝」の上位分割文字コード“０ｘ９Ｄ”の圧縮符号マップＭを指定する。（１８）そして、ファイル番号ｐのビットが“０”の場合、“１”に更新する。
【０２５５】
（１９）また、「芝」の上位分割文字コード“０ｘ９Ｄ”を含む葉Ｌ♯の構造体から「芝」の上位分割文字コード“０ｘ９Ｄ”の圧縮符号マップへのポインタを抽出する。そして、「芝」の圧縮符号マップへのポインタをマップ生成用レジスタに格納する。
【０２５６】
（２０）そして、「形」の文字コードを含む葉Ｌ♯の構造体の空き領域に、「形」の圧縮符号マップへのポインタを保存する。具体的には、連続グラム領域に、「形」の圧縮符号マップへのポインタを保存する。また、２グラム頭尾領域にも、「形」の圧縮符号マップへのポインタを保存する。
【０２５７】
図４４−４において、マップ生成用レジスタには、「人」の圧縮符号マップへのポインタと「形」の圧縮符号マップへのポインタと「芝」の上位分割文字コード“０ｘ９Ｄ”の圧縮符号マップへのポインタとが格納されている。
【０２５８】
（２１）まず、連続グラム分割マップへのポインタ群と、２グラム頭尾分割マップへのポインタ群と、３グラム頭尾分割マップへのポインタ群とを生成する。具体的には、「形」の圧縮符号マップへのポインタと「芝」の上位分割文字コード“０ｘ９Ｄ”の圧縮符号マップへのポインタとにより、「形」と「芝」の上位分割文字コード“０ｘ９Ｄ”との連続グラム分割マップ群を生成する。
【０２５９】
また、「形」の圧縮符号マップへのポインタと「芝」の上位分割文字コード“０ｘ９Ｄ”の圧縮符号マップへのポインタとにより、「形」と「芝」の上位分割文字コード“０ｘ９Ｄ”との２グラム頭尾分割マップ群を生成する。同様に、「人」の圧縮符号マップへのポインタと「芝」の上位分割文字コード“０ｘ９Ｄ”の圧縮符号マップへのポインタとにより、「人」と「芝」の上位分割文字コード“０ｘ９Ｄ”との３グラム頭尾分割マップ群を生成する。
【０２６０】
（２２）つぎに、（２１）で生成された各分割マップへのポインタ群により指定する。具体的には、「形」と「芝」の上位分割文字コード“０ｘ９Ｄ”との連続グラム分割マップ群へのポインタにより、「形」と「芝」の上位分割文字コード“０ｘ９Ｄ”との連続グラム分割マップ群を指定する。
【０２６１】
また、「形」と「芝」の上位分割文字コード“０ｘ９Ｄ”との２グラム頭尾分割マップ群へのポインタにより、「形」と「芝」の上位分割文字コード“０ｘ９Ｄ”との２グラム頭尾分割マップ群を指定する。同様に、「人」と「芝」の上位分割文字コード“０ｘ９Ｄ”との３グラム頭尾分割マップ群へのポインタにより、「人」と「芝」の上位分割文字コード“０ｘ９Ｄ”との３グラム頭尾分割マップ群を指定する。
【０２６２】
（２３）そして、（２２）で指定された分割マップ群について、ファイル番号ｐのビットが“０”の場合、“１”に更新する。具体的には、「形」と「芝」の上位分割文字コード“０ｘ９Ｄ”との連続グラム分割マップ群において、ファイル番号ｐのビットが“０”の場合、“１”に更新する。
【０２６３】
また、「形」と「芝」の上位分割文字コード“０ｘ９Ｄ”との２グラム頭尾分割マップ群において、ファイル番号ｐのビットが“０”の場合、“１”に更新する。同様に、「人」と「芝」の上位分割文字コード“０ｘ９Ｄ”との３グラム頭尾分割マップ群において、ファイル番号ｐのビットが“０”の場合、“１”に更新する。
【０２６４】
図４４−５において、上位分割文字コード“０ｘ９Ｄ”の検出のあと、（２４）文字構造体５３０で下位分割文字コード“０ｘ８２”が検出され、その葉へのポインタで下位分割文字コード“０ｘ８２”を含む葉Ｌ♯の構造体を指定する。
【０２６５】
（２５）つぎに、「芝」の下位分割文字コード“０ｘ８２”の圧縮符号マップへのポインタにより、「芝」の下位分割文字コード“０ｘ８２”の圧縮符号マップＭを指定する。（２６）そして、ファイル番号ｐのビットが“０”の場合、“１”に更新する。
【０２６６】
（２７）また、「芝」の下位分割文字コード“０ｘ８２”を含む葉Ｌ♯の構造体から「芝」の下位分割文字コード“０ｘ８２”の圧縮符号マップへのポインタを抽出する。そして、「人」の圧縮符号マップへのポインタをマップ生成用レジスタに格納する。
【０２６７】
（２８）そして、「芝」の下位分割文字コード“０ｘ８２”を含む葉Ｌ♯の構造体の空き領域に、マップ生成用レジスタに格納されているポインタを保存する。具体的には、連続グラム領域に、「芝」の下位分割文字コード“０ｘ８２”の圧縮符号マップへのポインタを保存する。また、２グラム頭尾領域に、「芝」の下位分割文字コード“０ｘ８２”の圧縮符号マップへのポインタを保存する。また、３グラム頭尾領域に、「形」の圧縮符号マップへのポインタを保存する。さらに、４グラム頭尾領域に、「人」の圧縮符号マップへのポインタを保存する。
【０２６８】
図４４−６において、マップ生成用レジスタには、「人」の圧縮符号マップへのポインタと「形」の圧縮符号マップへのポインタと「芝」の上位分割文字コード“０ｘ９Ｄ”の圧縮符号マップへのポインタと「芝」の下位分割文字コード“０ｘ８２”の圧縮符号マップへのポインタとが格納されている。
【０２６９】
（２９）まず、連続グラム分割マップへのポインタ群と、２グラム頭尾分割マップへのポインタ群と、３グラム頭尾分割マップへのポインタ群と、４グラム頭尾分割マップへのポインタ群とを生成する。
【０２７０】
具体的には、「芝」の上位分割文字コード“０ｘ９Ｄ”の圧縮符号マップへのポインタと「芝」の下位分割文字コード“０ｘ８２”の圧縮符号マップへのポインタとにより、「芝」の上位分割文字コード“０ｘ９Ｄ”と下位分割文字コード“０ｘ８２”との連続グラム分割マップ群を生成する。
【０２７１】
また、「芝」の上位分割文字コード“０ｘ９Ｄ”の圧縮符号マップへのポインタと「芝」の下位分割文字コード“０ｘ８２”の圧縮符号マップへのポインタとにより、「芝」の上位分割文字コード“０ｘ９Ｄ”と下位分割文字コード“０ｘ８２”との２グラム頭尾分割マップ群を生成する。
【０２７２】
同様に、「形」の圧縮符号マップへのポインタと「芝」の下位分割文字コード“０ｘ８２”の圧縮符号マップへのポインタとにより、「形」と「芝」の下位分割文字コード“０ｘ８２”との３グラム頭尾分割マップ群を生成する。
【０２７３】
また、「人」の圧縮符号マップへのポインタと「芝」の下位分割文字コード“０ｘ８２”の圧縮符号マップへのポインタとにより、「人」と「芝」の下位分割文字コード“０ｘ８２”との４グラム頭尾分割マップ群を生成する。
【０２７４】
（３０）つぎに、（２９）で生成された各分割マップへのポインタ群により指定する。具体的には、「芝」の上位分割文字コード“０ｘ９Ｄ”と下位分割文字コード“０ｘ８２”との連続グラム分割マップ群へのポインタにより、「芝」の上位分割文字コード“０ｘ９Ｄ”と下位分割文字コード“０ｘ８２”との連続グラム分割マップ群を指定する。
【０２７５】
また、「芝」の上位分割文字コード“０ｘ９Ｄ”と下位分割文字コード“０ｘ８２”との２グラム頭尾分割マップ群へのポインタにより、「芝」の上位分割文字コード“０ｘ９Ｄ”と下位分割文字コード“０ｘ８２”との２グラム頭尾分割マップ群を指定する。
【０２７６】
同様に、「形」と「芝」の下位分割文字コード“０ｘ８２”との３グラム頭尾分割マップ群へのポインタにより、「形」と「芝」の下位分割文字コード“０ｘ８２”との３グラム頭尾分割マップ群を指定する。
【０２７７】
また、「人」と「芝」の下位分割文字コード“０ｘ８２”との４グラム頭尾分割マップ群へのポインタにより、「人」と「芝」の下位分割文字コード“０ｘ８２”との４グラム頭尾分割マップ群を指定する。
【０２７８】
（３１）そして、（３０）で指定された分割マップ群について、ファイル番号ｐのビットが“０”の場合、“１”に更新する。具体的には、「芝」の上位分割文字コード“０ｘ９Ｄ”と下位分割文字コード“０ｘ８２”との連続グラム分割マップ群において、ファイル番号ｐのビットが“０”の場合、“１”に更新する。
【０２７９】
また、「芝」の上位分割文字コード“０ｘ９Ｄ”と下位分割文字コード“０ｘ８２”との２グラム頭尾分割マップ群において、ファイル番号ｐのビットが“０”の場合、“１”に更新する。
【０２８０】
同様に、「形」と「芝」の下位分割文字コード“０ｘ８２”との３グラム頭尾分割マップ群において、ファイル番号ｐのビットが“０”の場合、“１”に更新する。また、「人」と「芝」の下位分割文字コード“０ｘ８２”との４グラム頭尾分割マップ群において、ファイル番号ｐのビットが“０”の場合、“１”に更新する。
【０２８１】
図４４−７において、（３２）まず、圧縮部３２００により、「居」の文字コードを２分木探索する。（３３）文字構造体５３０で「居」の文字コードが検出され、その葉へのポインタで「居」の文字コードを含む葉Ｌ♯の構造体を指定する。（３４）つぎに、「居」の圧縮符号マップへのポインタにより、「居」の圧縮符号マップＭを指定する。（３５）そして、ファイル番号ｐのビットが“０”の場合、“１”に更新する。
【０２８２】
（３６）また、「居」の葉Ｌ♯の構造体から「居」の圧縮符号マップへのポインタを抽出する。そして、「居」の圧縮符号マップへのポインタをマップ生成用レジスタに格納する。
【０２８３】
（３７）そして、「居」の葉Ｌ♯の構造体の空き領域に、マップ生成用レジスタに格納されているポインタを保存する。具体的には、連続グラム領域に、「芝」の下位分割文字コード“０ｘ８２”の圧縮符号マップへのポインタを保存する。また、２グラム頭尾領域に、「芝」の下位分割文字コード“０ｘ８２”の圧縮符号マップへのポインタを保存する。また、３グラム頭尾領域に、「芝」の上位分割文字コード“０ｘ９Ｄ”の圧縮符号マップへのポインタを保存する。さらに、４グラム頭尾領域に、「形」の圧縮符号マップへのポインタを保存する。また、５グラム頭尾領域に、「人」の圧縮符号マップへのポインタを保存する。
【０２８４】
図４４−８において、マップ生成用レジスタには、「人」の圧縮符号マップへのポインタと「形」の圧縮符号マップへのポインタと「芝」の上位分割文字コード“０ｘ９Ｄ”の圧縮符号マップへのポインタと「芝」の下位分割文字コード“０ｘ８２”の圧縮符号マップへのポインタと「居」の圧縮符号マップへのポインタとが格納されている。
【０２８５】
（３８）まず、連続グラム分割マップへのポインタ群と、２グラム頭尾分割マップへのポインタ群と、３グラム頭尾分割マップへのポインタ群と、４グラム頭尾分割マップへのポインタ群と、５グラム頭尾分割マップへのポインタ群とを生成する。４グラム頭尾分割マップへのポインタ群と５グラム頭尾分割マップへのポインタ群については、図４４−９にて説明する。
【０２８６】
具体的には、「芝」の下位分割文字コード“０ｘ８２”の圧縮符号マップへのポインタと「居」の圧縮符号マップへのポインタとにより、「芝」の下位分割文字コード“０ｘ８２”と「居」との連続グラム分割マップ群を生成する。
【０２８７】
また、「芝」の下位分割文字コード“０ｘ８２”の圧縮符号マップへのポインタと「居」の圧縮符号マップへのポインタとにより、「芝」の下位分割文字コード“０ｘ８２”と「居」との２グラム頭尾分割マップ群を生成する。
【０２８８】
同様に、「芝」の上位分割文字コード“０ｘ９Ｄ”の圧縮符号マップへのポインタと「居」の圧縮符号マップへのポインタとにより、「芝」の上位分割文字コード“０ｘ９Ｄ”と「居」との３グラム頭尾分割マップ群を生成する。
【０２８９】
（３９）つぎに、（３８）で生成された各分割マップへのポインタ群により指定する。具体的には、「芝」の上位分割文字コード“０ｘ９Ｄ”と「居」との連続グラム分割マップ群へのポインタにより、「芝」の上位分割文字コード“０ｘ９Ｄ”と「居」との連続グラム分割マップ群を指定する。
【０２９０】
また、「芝」の下位分割文字コード“０ｘ８２”と「居」との２グラム頭尾分割マップ群へのポインタにより、「芝」の下位分割文字コード“０ｘ８２”と「居」との２グラム頭尾分割マップ群を指定する。
【０２９１】
同様に、「芝」の上位分割文字コード“０ｘ９Ｄ”と「居」との３グラム頭尾分割マップ群へのポインタにより、「芝」の上位分割文字コード“０ｘ９Ｄ”と「居」との３グラム頭尾分割マップ群を指定する。
【０２９２】
（４０）そして、（３９）で指定された分割マップ群について、ファイル番号ｐのビットが“０”の場合、“１”に更新する。具体的には、「芝」の上位分割文字コード“０ｘ９Ｄ”と「居」との連続グラム分割マップ群において、ファイル番号ｐのビットが“０”の場合、“１”に更新する。
【０２９３】
また、「芝」の下位分割文字コード“０ｘ８２”と「居」との２グラム頭尾分割マップ群において、ファイル番号ｐのビットが“０”の場合、“１”に更新する。同様に、「芝」の上位分割文字コード“０ｘ９Ｄ”と「居」との３グラム頭尾分割マップ群において、ファイル番号ｐのビットが“０”の場合、“１”に更新する。
【０２９４】
図４４−９において、（４１）４グラム頭尾分割マップへのポインタ群と、５グラム頭尾分割マップへのポインタ群とを生成する。具体的には、「形」の圧縮符号マップへのポインタと「居」の圧縮符号マップへのポインタとにより、「形」と「居」との４グラム頭尾分割マップ群を生成する。同様に、「人」の圧縮符号マップへのポインタと「居」の圧縮符号マップへのポインタとにより、「人」と「居」との５グラム頭尾分割マップ群を生成する。
【０２９５】
（４２）つぎに、（４１）で生成された各分割マップへのポインタ群により指定する。具体的には、「形」と「居」との４グラム頭尾分割マップ群へのポインタにより、「形」と「居」との４グラム頭尾分割マップ群を指定する。また、「人」と「居」との５グラム頭尾分割マップ群へのポインタにより、「人」と「居」との５グラム頭尾分割マップ群を指定する。
【０２９６】
（４３）そして、（４２）で指定された分割マップ群について、ファイル番号ｐのビットが“０”の場合、“１”に更新する。具体的には、「形」と「居」との４グラム頭尾分割マップ群において、ファイル番号ｐのビットが“０”の場合、“１”に更新する。また、「人」と「居」との５グラム頭尾分割マップ群において、ファイル番号ｐのビットが“０”の場合、“１”に更新する。
【０２９７】
このように、連続グラムについては、先行グラムの圧縮符号マップへのポインタを、後続グラムの葉Ｌ♯の構造体に保存しておく。また、末尾グラムとなる葉Ｌ♯の構造体に、当該末尾グラムに対して先頭となる先頭グラムの圧縮符号マップへのポインタを格納しておく。これにより、検索処理のときに、葉Ｌ♯の構造体から先行グラムの圧縮符号マップへのポインタと後続グラムの圧縮符号マップへのポインタとを抽出することで、連続グラム分割マップへのポインタを生成することができる。したがって、当該ポインタにより連続グラム分割マップにアクセスすることができる。
【０２９８】
同様に、検索処理のときに、葉Ｌ♯の構造体から先頭グラムの圧縮符号マップへのポインタと末尾グラムの圧縮符号マップへのポインタとを抽出することで、ｘグラム頭尾分割マップへのポインタを生成することができる。したがって、当該ポインタによりｘグラム頭尾分割マップにアクセスすることができる。つぎに、図４４−１〜図４４−９におけるマップ生成用レジスタのポインタ格納状態について説明する。
【０２９９】
図４４−１０は、図４４−１〜図４４−９におけるマップ生成用レジスタのポインタ格納状態を示す説明図である。マップ生成用レジスタには、ｘグラム分の領域が設定される。本例では、ｘ＝５とした例である。（Ａ）は初期状態であり、空である。
【０３００】
（Ｂ）において、ｘ＝１の領域に「人」の圧縮符号マップへのポインタが格納される。（Ｃ）において、さらに、ｘ＝２の領域に「形」の圧縮符号マップへのポインタが格納される。（Ｄ）において、さらに、ｘ＝３の領域に「芝」の上位分割文字コード“０ｘ９Ｄ”の圧縮符号マップへのポインタが格納される。
【０３０１】
（Ｅ）において、さらに、ｘ＝４の領域に「芝」の下位分割文字コード“０ｘ８２”の圧縮符号マップへのポインタが格納される。（Ｆ）において、さらに、ｘ＝５の領域に「居」の圧縮符号マップへのポインタが格納される。「人形芝居」のあと、文字「は」の高位文字コードがある場合、先頭の「人」の圧縮符号マップへのポインタが押し出され、順次、ｘの値が１つ若い領域にシフトされる。（Ｇ）そして、空き領域となったｘ＝５の領域に、「は」の圧縮符号マップへのポインタが格納される。
【０３０２】
つぎに、図４４−１〜図４４−９に示した連続グラム分割マップへのポインタの生成例について、連続グラムの組み合わせごとに説明する。なお、ｘグラム頭尾分割マップへのポインタもデータ構造としては同じであるため省略する。
【０３０３】
図４５−１は、高位文字コードどうしの連続グラム分割マップへのポインタの生成例を示す説明図である。（Ａ）は、「人」と「形」との圧縮符号マップへのポインタ列を示している。なお、符号区分とは、その文字コードが高位文字コードか分割文字コードかを特定する識別子である。“１”が高位文字コード、“０”が分割文字コードである。
【０３０４】
（Ｂ）は、各圧縮符号マップへのポインタのアドレス値の上位５ビットどうしを組み合わせた連続グラム分割マップへのポインタである。（Ｃ）は、「人」の圧縮符号マップへのポインタのアドレス値の上位５ビットと「形」の圧縮符号マップへのポインタのアドレス値の下位５ビットとを組み合わせた連続グラム分割マップへのポインタである。（Ｄ）は、「人」の圧縮符号マップへのポインタのアドレス値の下位５ビットと「形」の圧縮符号マップへのポインタのアドレス値の上位５ビットとを組み合わせた連続グラム分割マップへのポインタである。（Ｅ）は、各圧縮符号マップへのポインタのアドレス値の下位５ビットどうしを組み合わせた連続グラム分割マップへのポインタである。
【０３０５】
図４５−２は、高位文字コードと上位分割文字コードとの連続グラム分割マップへのポインタの生成例を示す説明図である。（Ａ）は、「形」と「芝」の上位分割文字コード“０ｘ９Ｄ”との圧縮符号マップへのポインタ列を示している。なお、上下区分とは、文字コードが分割文字コードである場合、すなわち、符号区分が“０”である場合、上位分割文字コードか下位分割文字コードかを特定する識別子である。上下区分には、１０ビットのアドレス値の上位２ビットに割り当てられている。“００”が上位文字コード、“０１”が下位文字コードである。上下区分にアドレス値の上位２ビットが割り当てられているため、アドレス値の残余８ビットを上位４ビットと下位４ビットで分割することとなる。
【０３０６】
（Ｂ）は、「形」の圧縮符号マップへのポインタのアドレス値の上位５ビットと「芝」の上位分割文字コード“０ｘ９Ｄ”の圧縮符号マップへのポインタのアドレス値の残余ビットの上位４ビットとを組み合わせた連続グラム分割マップへのポインタである。
【０３０７】
（Ｃ）は、「形」の圧縮符号マップへのポインタのアドレス値の上位５ビットと「芝」の上位分割文字コード“０ｘ９Ｄ”の圧縮符号マップへのポインタのアドレス値の残余ビットの下位４ビットとを組み合わせた連続グラム分割マップへのポインタである。
【０３０８】
（Ｄ）は、「形」の圧縮符号マップへのポインタのアドレス値の下位５ビットと「芝」の上位分割文字コード“０ｘ９Ｄ”の圧縮符号マップへのポインタのアドレス値の残余ビットの上位４ビットとを組み合わせた連続グラム分割マップへのポインタである。
【０３０９】
（Ｅ）は、「形」の圧縮符号マップへのポインタのアドレス値の下位５ビットと「芝」の上位分割文字コード“０ｘ９Ｄ”の圧縮符号マップへのポインタのアドレス値の残余ビットの下位４ビットとを組み合わせた連続グラム分割マップへのポインタである。
【０３１０】
図４５−３は、上位分割文字コードと下位分割文字コードとの連続グラム分割マップへのポインタの生成例を示す説明図である。下位分割文字コードと上位分割文字コードとの連続グラムマップへのポインタの生成例も同じ生成手法になるため省略する。
【０３１１】
（Ａ）は、「芝」の上位分割文字コード“０ｘ９Ｄ”と下位分割文字コード“０ｘ８２”との圧縮符号マップへのポインタ列を示している。（Ｂ）は、「芝」の上位分割文字コード“０ｘ９Ｄ”の圧縮符号マップへのポインタのアドレス値の残余ビットの上位４ビットと「芝」の下位分割文字コード“０ｘ８２”の圧縮符号マップへのポインタのアドレス値の残余ビットの上位４ビットとを組み合わせた連続グラム分割マップへのポインタである。
【０３１２】
（Ｃ）は、「芝」の上位分割文字コード“０ｘ９Ｄ”の圧縮符号マップへのポインタのアドレス値の残余ビットの上位４ビットと「芝」の下位分割文字コード“０ｘ８２”の圧縮符号マップへのポインタのアドレス値の残余ビットの下位４ビットとを組み合わせた連続グラム分割マップへのポインタである。
【０３１３】
（Ｄ）は、「芝」の上位分割文字コード“０ｘ９Ｄ”の圧縮符号マップへのポインタのアドレス値の残余ビットの下位４ビットと「芝」の下位分割文字コード“０ｘ８２”の圧縮符号マップへのポインタのアドレス値の残余ビットの上位４ビットとを組み合わせた連続グラム分割マップへのポインタである。
【０３１４】
（Ｅ）は、「芝」の上位分割文字コード“０ｘ９Ｄ”の圧縮符号マップへのポインタのアドレス値の残余ビットの下位４ビットと「芝」の下位分割文字コード“０ｘ８２”の圧縮符号マップへのポインタのアドレス値の残余ビットの下位４ビットとを組み合わせた連続グラム分割マップへのポインタである。
【０３１５】
図４５−４は、下位分割文字コードと高位文字コードとの連続グラム分割マップへのポインタの生成例を示す説明図である。（Ａ）は、「芝」の下位分割文字コード“０ｘ８２”と「居」との圧縮符号マップへのポインタ列を示している。
【０３１６】
（Ｂ）は、「芝」の下位分割文字コード“０ｘ８２”の圧縮符号マップへのポインタのアドレス値の残余ビットの上位４ビットと「居」の圧縮符号マップへのポインタのアドレス値の上位５ビットとを組み合わせた連続グラム分割マップへのポインタである。
【０３１７】
（Ｃ）は、「芝」の下位分割文字コード“０ｘ８２”の圧縮符号マップへのポインタのアドレス値の残余ビットの上位４ビットと「居」の圧縮符号マップへのポインタのアドレス値の下位５ビットとを組み合わせた連続グラム分割マップへのポインタである。
【０３１８】
（Ｄ）は、「芝」の下位分割文字コード“０ｘ８２”の圧縮符号マップへのポインタのアドレス値の残余ビットの下位４ビットと「居」の圧縮符号マップへのポインタのアドレス値の上位５ビットとを組み合わせた連続グラム分割マップへのポインタである。
【０３１９】
（Ｅ）は、「芝」の下位分割文字コード“０ｘ８２”の圧縮符号マップへのポインタのアドレス値の残余ビットの下位４ビットと「居」の圧縮符号マップへのポインタのアドレス値の下位５ビットとを組み合わせた連続グラム分割マップへのポインタである。
【０３２０】
このように、連続グラムの各圧縮符号マップへのポインタにおいて、先行グラムの上位ビットと後続グラムの下位ビットとを組み合わせることで、４種類の分割マップへのポインタを生成することができる。なお、２分割にする場合は、先行（または後続）グラムのアドレス値を分割せずに、後続（または先行）グラムのアドレス値のみを上位ビットと下位ビットに分割して組み合わせればよい。
【０３２１】
（圧縮符号マップ生成処理手順）
つぎに、圧縮符号マップ生成処理について説明する。圧縮符号マップ生成処理は、図３４および図３５に示したファイル圧縮処理と並列に実行される処理である。具体的には、図３４を参照すると、ＣＰＵ４０１は、圧縮対象文字コードを圧縮する際に、葉Ｌ♯の構造体にアクセスする。圧縮符号マップ生成処理は、ファイル圧縮処理時における葉Ｌ♯の構造体へのアクセスの都度、実行される。これにより、対象ファイルＦを一回走査するだけで、対象ファイルＦの圧縮と対象ファイルＦに存在する文字の圧縮符号マップＭを同時に生成することができ、処理の高速化を図ることができる。なお、圧縮符号マップ群Ｍｓの初期状態は、図３９−１に示したとおりである。
【０３２２】
図４６−１は、図３２に示した圧縮符号マップ特定部３２０６および圧縮符号マップ更新部３２０７による圧縮符号マップ生成処理手順を示すフローチャートである。まず、図３４に示した圧縮処理において、葉Ｌ♯の構造体へのアクセスがあったか否かを判断する（ステップＳ４６０１）。
【０３２３】
葉Ｌ♯の構造体へのアクセスがない場合（ステップＳ４６０１：Ｎｏ）、ステップＳ４６０４に移行する。一方、葉Ｌ♯の構造体へのアクセスがあった場合（ステップＳ４６０１：Ｙｅｓ）、１グラムの圧縮符号マップ生成処理を実行し（ステップＳ４６０２）、２グラムの分割マップ生成処理を実行する（ステップＳ４６０３）。そして、対象ファイルＦｐの圧縮処理が終了したか否かを判断する（ステップＳ４６０４）。終了していない場合（ステップＳ４６０４：Ｎｏ）、ステップＳ４６０１に戻る。一方、終了した場合（ステップＳ４６０４：Ｙｅｓ）、圧縮符号マップ生成処理を終了する。
【０３２４】
図４６−２は、図４６−１に示した１グラムの圧縮符号マップ生成処理（ステップＳ４６０２）の詳細な処理手順を示すフローチャートである。まず、葉Ｌ♯の構造体へのアクセスがあった場合（ステップＳ４６０１：Ｙｅｓ）、圧縮符号マップへのポインタを、アクセス先の葉Ｌ♯の構造体から取得する（ステップＳ４６２１）。そして、取得された圧縮符号マップへのポインタをマップ生成用レジスタに格納する（ステップＳ４６２２）。
【０３２５】
また、取得された圧縮符号マップへのポインタにより圧縮符号マップを指定する（ステップＳ４６２３）。そして、指定された圧縮符号マップにおいてファイル番号ｐのビットが“０”であるか否かを判断する（ステップＳ４６２４）。“１”であれば、アクセス先の葉Ｌ♯の構造体に格納されている文字コードが対象ファイルＦｐにすでに出現しており、“０”の場合はまだ未出現であることを示している。
【０３２６】
“１”である場合（ステップＳ４６２４：Ｎｏ）、更新する必要がないため、ステップＳ４６０３に移行する。一方、“０”である場合（ステップＳ４６２４：Ｙｅｓ）、ファイル番号ｐのビットを“１”に更新し（ステップＳ４６２５）、ステップＳ４６０３に移行する。
【０３２７】
図４６−３は、図４６−１に示した２グラムの分割マップ生成処理（ステップＳ４６０３）の詳細な処理手順を示すフローチャートである。まず、変数ｙをｙ＝１に設定する（ステップＳ４６３１）。そして、第（ｘ−ｙ）グラムの圧縮符号マップへのポインタがマップ生成用レジスタにあるか否かを判断する（ステップＳ４６３２）。
【０３２８】
ｘの値は、１≦ｘ≦Ｘをとる値（Ｘはｘの最大値）であり、グラム数を規定している。初期値はｘ＝１である。最大値Ｘは、任意に設定される。たとえば、５グラムまでの文字コード列について頭尾分割マップを生成したいときは、Ｘ＝５に設定する。グラム数ｘの変動については、図４６−５で説明する。
【０３２９】
図４６−３において、第（ｘ−ｙ）グラムの圧縮符号マップへのポインタがマップ生成用レジスタにない場合（ステップＳ４６３２：Ｎｏ）、ステップＳ４６０４に移行する。一方、第（ｘ−ｙ）グラムの圧縮符号マップへのポインタがマップ生成用レジスタにある場合（ステップＳ４６３２：Ｙｅｓ）、第（ｘ−ｙ）グラムの圧縮符号マップへのポインタが、アクセス先の葉Ｌ♯の構造体の連続グラム領域にあるか否かを判断する（ステップＳ４６３３）。ない場合（ステップＳ４６３３：Ｎｏ）、第（ｘ−ｙ）グラムの圧縮符号マップへのポインタを、アクセス先の葉Ｌ♯の構造体の連続グラム領域に格納する（ステップＳ４６３４）。
【０３３０】
そして、ポインタ分割処理を実行する（ステップＳ４６３５）。ポインタ分割処理では、第（ｘ−ｙ）グラムの圧縮符号マップへのポインタとアクセス先の葉Ｌ♯の構造体に格納されている圧縮符号マップへのポインタとを用いて、連続グラム分割マップへのポインタやｘグラム頭尾分割マップへのポインタを生成する。ポインタ分割処理の詳細については、図４６−４で説明する。
【０３３１】
ポインタ分割処理（ステップＳ４６３５）により、連続グラム分割マップへのポインタ群が生成されるため、連続グラム分割マップへの各ポインタについて、ファイル総数α分のオール０のビット列を割り当てる。そして、現在圧縮している対象ファイルＦｐのファイル番号ｐのビットを“０”から“１”に更新する（ステップＳ４６３６）。そして、ステップＳ４６４０に移行する。
【０３３２】
また、ステップＳ４６３３において、第（ｘ−ｙ）グラムの圧縮符号マップへのポインタが、アクセス先の葉Ｌ♯の構造体の連続グラム領域にある場合（ステップＳ４６３３：Ｙｅｓ）、ポインタ分割処理を実行する（ステップＳ４６３７）。このポインタ分割処理（ステップＳ４６３７）は、ポインタ分割処理（ステップＳ４６３５）と同一処理である。
【０３３３】
ポインタ分割処理（ステップＳ４６３７）により、連続グラム分割マップへのポインタ群が生成されるため、生成された連続グラム分割マップへのポインタ群で各連続グラム分割マップを指定する（ステップＳ４６３８）。そして、指定された各連続グラム分割マップにおいて、現在圧縮している対象ファイルＦｐのファイル番号ｐのビットを“０”から“１”に更新する（ステップＳ４６３９）。そして、ステップＳ４６４０に移行する。このように、ステップＳ４６３３〜Ｓ４６３９までの処理により、連続グラム分割マップの生成／更新を実行することができる。
【０３３４】
また、ステップＳ４６４０において、第（ｘ−ｙ）グラムの圧縮符号マップへのポインタが、アクセス先の葉Ｌ♯の構造体のｘグラム頭尾領域にあるか否かを判断する（ステップＳ４６４０）。ない場合（ステップＳ４６４０：Ｎｏ）、第（ｘ−ｙ）グラムの圧縮符号マップへのポインタを、アクセス先の葉Ｌ♯の構造体のｘグラム頭尾領域に格納する（ステップＳ４６４１）。
【０３３５】
そして、ポインタ分割処理を実行する（ステップＳ４６４２）。このポインタ分割処理（ステップＳ４６４２）も、ポインタ分割処理（ステップＳ４６３５、Ｓ４６３７）と同一処理である。
【０３３６】
ポインタ分割処理（ステップＳ４６４２）により、ｘグラム頭尾分割マップへのポインタ群が生成されるため、ｘグラム頭尾分割マップへの各ポインタについて、ファイル総数α分のオール０のビット列を割り当てる。そして、現在圧縮している対象ファイルＦｐのファイル番号ｐのビットを“０”から“１”に更新する（ステップＳ４６４３）。そして、ステップＳ４６４７に移行する。
【０３３７】
また、ステップＳ４６４０において、第（ｘ−ｙ）グラムの圧縮符号マップへのポインタが、アクセス先の葉Ｌ♯の構造体のｘグラム頭尾領域にある場合（ステップＳ４６４０：Ｙｅｓ）、ポインタ分割処理を実行する（ステップＳ４６４４）。このポインタ分割処理（ステップＳ４６４４）も、ポインタ分割処理（ステップＳ４６３５、Ｓ４６３７、Ｓ４６４２）と同一処理である。
【０３３８】
ポインタ分割処理（ステップＳ４６４４）により、ｘグラム頭尾分割マップへのポインタ群が生成されるため、生成されたｘグラム頭尾分割マップへのポインタ群で各ｘグラム頭尾分割マップを指定する（ステップＳ４６４５）。
【０３３９】
そして、指定された各ｘグラム頭尾分割マップにおいて、現在圧縮している対象ファイルＦｐのファイル番号ｐのビットを“０”から“１”に更新する（ステップＳ４６４６）。そして、ステップＳ４６４７に移行する。このように、ステップＳ４６４０〜Ｓ４６４６までの処理により、ｘグラム頭尾分割マップの生成／更新を実行することができる。
【０３４０】
また、ステップＳ４６４７において、変数ｙをインクリメントし（ステップＳ４６４７）、第（ｘ−ｙ）グラムの圧縮符号マップへのポインタがマップ生成用レジスタにあるか否かを判断する（ステップＳ４６４８）。そして、第（ｘ−ｙ）グラムの圧縮符号マップへのポインタがマップ生成用レジスタにある場合（ステップＳ４６４８：Ｙｅｓ）、ステップＳ４６４０に戻る。
【０３４１】
一方、第（ｘ−ｙ）グラムの圧縮符号マップへのポインタがマップ生成用レジスタにない場合（ステップＳ４６４８：Ｎｏ）、ステップＳ４６０４に移行する。このように、ステップＳ４６４７とステップＳ４６４８：Ｎｏにより、２グラム頭尾分割マップ群まで生成することができる。
【０３４２】
図４６−４は、図４６−３に示したポインタ分割処理（ステップＳ４６３５、Ｓ４６３７、Ｓ４６４２、Ｓ４６４４）の詳細な処理手順を示すフローチャートである。まず、分割対象ポインタを設定する（ステップＳ４６５１）。たとえば、２分割に設定されている場合、第（ｘ−ｙ）グラムの圧縮符号マップへのポインタとアクセス先の葉Ｌ♯の構造体に格納されている圧縮符号マップへのポインタのうちいずれか一方のポインタを分割対象ポインタに設定する。また、４分割に設定されている場合、両ポインタを分割対象ポインタに設定する。
【０３４３】
そして、未選択の分割対象ポインタがあるか否かを判断する（ステップＳ４６５２）。未選択の分割対象ポインタがある場合（ステップＳ４６５２：Ｙｅｓ）、未選択の分割対象ポインタを１つ選択する（ステップＳ４６５３）。そして、選択された分割対象ポインタを参照して、符号種別が“１”か“０”かを判断する（ステップＳ４６５４）。
【０３４４】
“１”である場合（ステップＳ４６５４：１）、選択された分割対象ポインタに含まれているアドレス値を上位５ビットと下位５ビットに分割し（ステップＳ４６５５）、ステップＳ４６５２に戻る。一方、ステップＳ４６５４において、符号種別が“０”である場合（ステップＳ４６５４：０）、選択された分割対象ポインタに含まれているアドレス値から上下区分（先頭２ビット）を特定する（ステップＳ４６５６）。そして、残余ビットを上位４ビットと下位４ビットに分割して（ステップＳ４６５７）、ステップＳ４６５２に戻る。
【０３４５】
ステップＳ４６５２において、未選択の分割対象ポインタがない場合（ステップＳ４６５２：Ｎｏ）、２グラムの分割マップへのポインタを生成する（ステップＳ４６５８）。具体的には、２分割の場合は、非分割対象ポインタと分割された上位ビットとを組み合わせ、また、非分割対象ポインタと分割された下位ビットとを組み合わせることで、２種類の分割マップへのポインタを生成することができる。
【０３４６】
また、４分割の場合、一方の分割対象ポインタから分割された上位ビットおよび下位ビットと、他方の分割対象ポインタから分割された上位ビットおよび下位ビットとを組み合わせることで、４種類の分割マップへのポインタを生成することができる。
【０３４７】
図４６−５は、グラム数ｘの変動処理を示すフローチャートである。まず、図４６−３の２グラムの分割マップ生成処理（ステップＳ４６０３）に先立って、グラム数ｘをｘ＝１とし、最大値ｘｍａｘをｘｍａｘ＝Ｘとする（ステップＳ４６６１）。つぎに、マップ生成用レジスタに、ポインタＸ個分の空き領域を設定する（ステップＳ４６６２）。
【０３４８】
そして、マップ生成用レジスタのｘ番目の領域にポインタが格納されているか否かを判断する（ステップＳ４６６３）。ｘ番目の領域にポインタが格納されている場合（ステップＳ４６６３：Ｙｅｓ）、ｘ＝Ｘであるか否かを判断する（ステップＳ４６６４）。ｘ＝Ｘである場合（ステップＳ４６６４：Ｙｅｓ）、ステップＳ４６６３に戻る。ｘ＝Ｘでない場合（ステップＳ４６６４：Ｎｏ）、ｘをインクリメントして（ステップＳ４６６５）、ステップＳ４６６３に戻る。これにより、Ｘ番目の領域にまでポインタが格納されているか否かを判断することができる。
【０３４９】
一方、ステップＳ４６６３において、ｘ番目の領域にポインタが格納されていない場合（ステップＳ４６６３：Ｎｏ）、対象ファイルＦｐの圧縮処理が終了したか否かを判断する（ステップＳ４６６６）。終了していない場合（ステップＳ４６６６：Ｎｏ）、ステップＳ４６６３に戻る。一方、終了した場合（ステップＳ４６６６：Ｙｅｓ）、グラム数ｘの変動処理を終了する。
【０３５０】
図３２に戻って、圧縮符号マップ圧縮部３２０８は、図３９−２に示した更新後の圧縮符号マップ群Ｍｓを圧縮する機能を有する。圧縮符号マップ圧縮部３２０８は、ビット列圧縮部３２８１と非圧縮領域設定部３２８２とを有する。ビット列圧縮部３２８１は、圧縮符号マップ群Ｍｓの各ビット列を圧縮する。ファイル総数αが膨大（たとえば、α＝１００００）である場合、ビット列において“０”が連続する箇所も多くなる。また、出現頻度が高い文字については、これとは逆に“１”が連続する箇所が多くなる。したがって、文字の出現率に応じた出現率領域を設定する。出現率領域とは、出現率の範囲である。出現率領域に応じて、圧縮符号マップ群Ｍｓの圧縮用ハフマン木を割り当てる。
【０３５１】
図４７−１は、出現率と出現率領域との関係を示す説明図である。出現率が０〜１００％の範囲とすると、図４７−１に示したように、Ａ〜Ｅ領域およびＡ´〜Ｅ´領域に領域分割することができる。したがって、Ａ〜Ｅ領域およびＡ´〜Ｅ´領域で特定された出現率領域に応じて、圧縮符号マップ群Ｍｓの圧縮用ハフマン木を圧縮パターンとして割り当てる。
【０３５２】
図４７−２は、出現率領域別の圧縮パターンを有する圧縮パターンテーブルを示す説明図である。出現率領域は、図２８に示したように、葉Ｌ♯の構造体の第４領域２８０４に格納されているため、葉Ｌ♯の構造体が指定されることで、圧縮パターンテーブルを参照して、圧縮パターンが特定されることとなる。なお、Ａ領域およびＡ´領域は、非圧縮のため、圧縮パターンとなるハフマン木は存在しない。
【０３５３】
図４８−１は、Ｂ領域およびＢ´領域の場合の圧縮パターンを示す説明図である。圧縮パターン４２０１は、１６種のハフマン木となる。
【０３５４】
図４８−２は、Ｃ領域およびＣ´領域の場合の圧縮パターンを示す説明図である。圧縮パターン４２０２は、１６種＋１種のハフマン木となる。圧縮パターン４２０２では、Ｂ領域およびＢ´領域に比べて、“０”が連続する箇所または“１”が連続する箇所が確率的に多くなる。したがって、１６ビット連続して値が“０”であるビット列に、符号語“００”が割り当てられている。
【０３５５】
図４８−３は、Ｄ領域およびＤ´領域の場合の圧縮パターンを示す説明図である。圧縮パターン４２０３は、１６種＋１種のハフマン木となる。圧縮パターン４２０３では、Ｃ領域およびＣ´領域に比べて、“０”が連続する箇所または“１”が連続する箇所が確率的に多くなる。したがって、３２ビット連続して値が“０”であるビット列に、符号語“００”が割り当てられている。
【０３５６】
図４８−４は、Ｅ領域およびＥ´領域の場合の圧縮パターンを示す説明図である。圧縮パターン４２０４は、１６種＋１種のハフマン木となる。圧縮パターン４２０４では、Ｄ領域およびＤ´領域に比べて、“０”が連続する箇所または“１”が連続する箇所が確率的に多くなる。したがって、６４ビット連続して値が“０”であるビット列に、符号語“００”が割り当てられている。このように、出現率領域に応じて、文字コードが存在しないことを意味する“０”の連続数が増加するため、文字コードの出現率に応じて圧縮符号マップＭｓの圧縮効率の向上を図ることができる。
【０３５７】
図４９は、圧縮された圧縮符号マップ群ｍｓを示す説明図である。圧縮符号マップ群ｍｓでは、葉Ｌ♯の構造体に対応するレコードごとに、図４８−１〜図４８−４に示した圧縮パターン４２０１〜４２０４を用いてビット列が圧縮されている。
【０３５８】
また、図３２において、非圧縮領域設定部３２８２は、圧縮符号マップ群Ｍｓにおいて非圧縮領域を設定する機能を有する。具体的には、対象ファイルＦの追加が検出された場合、ファイル番号ｐが連続するように採番する。そして、文字コードごとに文字コードの追加ファイルでの存否をあらわすビット列を、対象ファイル群Ｆｓのファイル番号ｐと連続するように配列した非圧縮領域を設定する。
【０３５９】
たとえば、対象ファイルＦが後から追加されると、追加された対象ファイルＦβを圧縮する際、圧縮符号マップ群Ｍｓにも文字の存否を示すビット列を追加する必要がある。圧縮前の圧縮符号マップ群Ｍｓでは、ファイル番号：１〜αのビット列については、圧縮パターン４２０１〜４２０４により圧縮されてレコードごとに符号長が異なる。すなわち、可変長であるため圧縮領域となる。
【０３６０】
したがって、図４９に示したように、圧縮符号列の先頭（ファイル番号α側）は整列するが末尾が整列しない。仮に、ビット列の並びを、ファイル番号：１〜αの順に、アドレス項目側から割り当てると、追加ファイルのビット列は、圧縮符号列の末尾側に挿入することとなり、圧縮符号列と追加ファイルのビット列とが非連続となってしまう。したがって、あらかじめ、圧縮符号マップ群Ｍｓの圧縮領域のビット列を、先頭位置から末尾位置にかけて対象ファイル群Ｆｓのファイル番号ｐの降順に配列しておく。そして、非圧縮領域設定部３２８２は、圧縮符号マップ群Ｍｓにおいて、圧縮符号マップへのポインタと圧縮領域との間に非圧縮領域を設定する。
【０３６１】
図５０は、圧縮された圧縮符号マップ群ｍｓへのビット列追加を示す説明図である。図５０に示すように、ファイル番号；１〜αのうち圧縮符号列が整列する側にファイル番号：αのビットを割り当てる。これにより、ファイル番号；１〜αのビット列を圧縮した場合でも、非圧縮のファイル番号：α＋１〜βのビット列を挿入しても、ファイル番号順にビット列を連続させることができる。これにより、ファイル番号；１〜αのビット列が圧縮されても、追加ファイルのファイル番号とそのビットとのずれがなく、対象ファイルの絞込みを正確に実行することができる。なお、追加ファイルのビット列の追加は、圧縮符号マップ更新部３２０７により実行される。
【０３６２】
図５１は、削除マップを示す説明図である。対象ファイル群Ｆｓ（対象ファイルＦ１〜Ｆβ）の中には、途中で削除される対象ファイルもある。削除された対象ファイルＦを絞り込みによって得ても無駄であるため、削除マップＭｄを用意しておく。削除マップＭｄは、ファイル総数α（追加があった場合はβ）分のビット列であり、初期状態では、すべて“１”に設定されている。
【０３６３】
削除された対象ファイルがあった場合、削除マップＭｄ中、削除された対象ファイルのファイル番号：ｄのビットの値を“１”→“０”に変更する。削除マップＭｄは対象ファイルの絞込み時に利用される。このため、圧縮符号マップ群Ｍｓにおいて、ある文字コードについてある対象ファイルＦのビットが“１”であっても、削除マップＭｄでは“０”の場合、検索対象外となる。なお、削除マップＭｄの更新は、圧縮符号マップ更新部３２０７により実行される。
【０３６４】
（圧縮符号マップ圧縮処理手順）
つぎに、圧縮符号マップ圧縮処理について説明する。圧縮符号マップ圧縮処理は、図３９−２に示したように、圧縮符号マップ生成処理にて生成された圧縮符号マップ群Ｍｓの圧縮領域であるファイル番号１〜αまでのビット列を圧縮する処理である。具体的には、図５２−２に示した圧縮パターンテーブルと図４８−１〜図４８−４に示した圧縮パターン（圧縮符号マップ用ハフマン木）を用いて、圧縮符号マップ群Ｍｓの圧縮領域のビット列を圧縮する。これにより、図４９に示したような圧縮後の圧縮符号マップ群Ｍｓを得ることができる。以下、圧縮符号マップ圧縮処理手順について説明する。
【０３６５】
図５２は、圧縮符号マップ圧縮処理手順を示すフローチャートである。図５２において、まず、圧縮符号マップ群Ｍｓにおいて、未選択のアドレス（圧縮符号マップへのポインタ）があるか否かを判断する（ステップＳ５２０１）。未選択のアドレスがある場合（ステップＳ５２０１：Ｙｅｓ）、未選択のアドレスを選択して葉Ｌ♯の構造体にアクセスし（ステップＳ５２０２）、葉Ｌ♯の構造体の第１領域２８０１の中から文字コードを取得する（ステップＳ５２０３）。そして、アクセス先の葉Ｌ♯の構造体の第４領域２８０４から出現率領域を取得することで、取得された文字コードの出現率領域を特定する（ステップＳ５２０４）。
【０３６６】
このあと、図４７−２の圧縮パターンテーブルを参照して、特定された出現率領域が非圧縮領域（たとえば、出現率領域Ａ、Ａ’）であるか否かを判断する（ステップＳ５２０５）。非圧縮領域である場合（ステップＳ５２０５：Ｙｅｓ）、ステップＳ５２０１に戻り、つぎのアドレスを選択する。
【０３６７】
一方、非圧縮領域でない場合（ステップＳ５２０５：Ｎｏ）、特定された出現率領域により、図４８−１〜図４８−４に示した圧縮符号マップ用ハフマン木の中から該当する圧縮符号マップ用ハフマン木を選択する（ステップＳ５２０６）。また、圧縮対象となる取得文字コードの圧縮符号マップＭにおける圧縮領域のビット列を抽出する（ステップＳ５２０７）。
【０３６８】
そして、取得文字コードの出現率が５０％以上であるか否かを判断する（ステップＳ５２０８）。出現率とは、上述したように、対象ファイル群Ｆｓ内の全ファイル数を母集団（分母）とし、当該文字コードまたは予約語が存在するファイル数を分子とした値である。出現率領域は、出現率に応じて決められているため（図４７−１を参照）、出現率領域がＡ〜Ｅである場合、取得文字コードの出現率が５０％以上でないと判断する。一方、出現率領域がＡ’〜Ｅ’である場合、取得文字コードの出現率が５０％以上であると判断する。
【０３６９】
そして、出現率が５０％以上である場合（ステップＳ５２０８：Ｙｅｓ）、圧縮効率を上げるために、ステップＳ５２０６で抽出されたビット列を反転する（ステップＳ５２０９）。たとえば、抽出されたビット列が“１１１０”である場合、“０００１”にして、“０”の個数を増やす。そして、反転後のビット列を、ステップＳ５２０６で選択したハフマン木を用いて圧縮して（ステップＳ５２１０）、ステップＳ５２０１に戻る。このように、ビット列反転をおこなうことで、出現率領域Ａ’〜Ｅ’の圧縮符号マップ用ハフマン木を用意する必要がないため、省メモリ化を図ることができる。
【０３７０】
一方、ステップＳ５２０８において、出現率が５０％以上でない場合（ステップＳ５２０８：Ｎｏ）、ビット列反転（ステップＳ５２０９）をおこなうことなく、ステップＳ５２０７で抽出されたビット列を、ステップＳ５２０６で選択したハフマン木を用いて圧縮して（ステップＳ５２１０）、ステップＳ５２０１に戻る。また、ステップＳ５２０１において、未選択のアドレスがない場合（ステップＳ５２０１：Ｎｏ）、圧縮符号マップ圧縮処理を終了する。
【０３７１】
このような圧縮符号マップ圧縮処理手順により、アドレスごとにファイル番号１〜αのビット列が、出現率に応じて圧縮され、図４９に示したような圧縮後の圧縮符号マップ群Ｍｓを得ることができる。
【０３７２】
なお、圧縮符号マップ圧縮処理手順は、上述した連続グラム分割マップ群やｘグラム頭尾分割マップ群にも適用される。なお、連続グラム分割マップ群やｘグラム頭尾分割マップ群は、２つの文字コードにより特定されるマップであるが、圧縮符号マップ圧縮処理に適用する場合は、たとえば、２グラム目の文字コードの出現率を用いて圧縮すればよい。なお、そのほかの圧縮処理の内容は同一であるため、省略する。これにより、連続グラム分割マップ群やｘグラム頭尾分割マップ群のビット列も圧縮することができ、省メモリ化を図ることができる。
【０３７３】
（追加ファイル圧縮処理手順）
つぎに、追加ファイル圧縮処理について説明する。追加ファイル圧縮処理は、あとから対象ファイルＦが追加された場合、追加分の対象ファイルについての文字コード（厳密には圧縮符号マップへのポインタとなるアドレス）ごとに追加分の対象ファイルのビット列を追加する処理である。具体的には、ファイル番号α＋１〜βまでのビット列を追加することで、図５０に示したような圧縮符号マップ群Ｍｓが得られる。以下、圧縮後の圧縮符号マップ群Ｍｓを例に挙げて追加ファイル圧縮処理手順について説明する。なお、β個の追加分の対象ファイルについては、ファイル番号α＋１〜βを付加しておく。
【０３７４】
図５３は、追加ファイル圧縮処理手順を示すフローチャートである。まず、追加ファイル数β分のマップ領域を設定する（ステップＳ５３０１）。具体的には、圧縮符号マップ群Ｍｓのアドレスとファイル番号１〜αの圧縮符号列との間に追加ファイルのビット列（初期値は“０”）を確保する。
【０３７５】
つぎに、ファイル番号ｐをｐ＝α＋１とし（ステップＳ５３０２）、対象ファイルＦｐを読み込む（ステップＳ５３０３）。そして、圧縮処理を実行する（ステップＳ５３０４）。圧縮処理（ステップＳ５３０４）は、図３５および図３６に示した圧縮処理（ステップＳ３５０３）と同じ処理である。圧縮処理（ステップＳ５３０４）のあと、ファイル番号ｐをインクリメントし（ステップＳ５３０５）、ｐ＞βであるか否かを判断する（ステップＳ５３０６）。ｐ＞βでない場合（ステップＳ５３０６：Ｎｏ）、ステップＳ５３０３に戻る。一方、ｐ＞βである場合（ステップＳ５３０６：Ｙｅｓ）、追加ファイル圧縮処理を終了する。
【０３７６】
（削除マップ更新処理手順）
つぎに、削除マップ更新処理について説明する。削除マップ更新処理は、図５１に示した削除マップＭｄ内の選択されたビットを更新する処理である。
【０３７７】
図５４は、削除マップ更新処理手順を示すフローチャートである。まず、ファイル削除があるまで待ちうけ（ステップＳ５４０１：Ｎｏ）、ファイル削除があった場合（ステップＳ５４０１：Ｙｅｓ）、削除された対象ファイルのファイル番号ｄを検出する（ステップＳ５４０２）。そして、削除マップＭｄにおけるファイル番号ｄのビットを、“１”から“０”に更新する（ステップＳ５４０３）。これにより、削除マップ更新処理を終了する。削除マップＭｄは対象ファイルの絞込み時に利用される。このため、圧縮符号マップ群Ｍｓにおいて、ある文字コードについてある対象ファイルのビットが“１”であっても、削除マップＭｄでは“０”の場合、検索対象外となる。
【０３７８】
＜圧縮ファイルｆの検索と対象ファイルＦへの伸長までの処理の流れ＞
図５５は、圧縮ファイルｆの検索と対象ファイルＦへの伸長までの処理の流れを示す説明図である。図５５では、まず、（７）情報検索装置が、検索キーワードの入力を受け付けて読み込む。つぎに、（８）無節点ハフマン木Ｈ２により、検索キーワードを構成する各文字の文字コードを圧縮することで、圧縮符号群が得られる。そして、（９）各圧縮符号に対応する葉Ｌ♯の構造体から圧縮符号マップへのポインタを取得して圧縮符号マップ群Ｍｓにアクセスする。
【０３７９】
なお、圧縮符号マップ群Ｍｓの場合、（７）検索キーワードの読み込みを契機として、圧縮符号マップ用ハフマン木により圧縮符号マップ群Ｍｓを伸長し、圧縮符号マップ群Ｍｓを生成しておく。
【０３８０】
（１０）そして、各文字コードの圧縮符号マップＭのビット列をファイル番号ｐごとにＡＮＤ演算することで、検索キーワードを構成する文字をすべて含む圧縮ファイルｆ（特定圧縮ファイルｆｔ）を特定する。これにより、圧縮ファイル群ｆｓのまま検索キーワードについてファイル絞込みをおこなうことができる。
【０３８１】
（１１）最後に、（９）で特定圧縮ファイルｆｔを無節点ハフマン木Ｈ２を用いて伸長し、伸長された対象ファイルＦ（伸長ファイルＦｔ）内の文字列と検索キーワードとを照合し、ヒットした文字列を強調表示などの文字列置換をする。これにより、圧縮ファイルｆの伸長と検索キーワードの一致判定（照合）を一連の処理で実行することができる。
【０３８２】
（機能的構成４）
図５６は、実施の形態にかかる情報検索装置の機能的構成を示すブロック図である。図５６では、図５５に示した処理（７）〜（１１）を実行する機能的構成を示している。図５６において、情報検索装置５１００は、入力部５１０１と、検索キーワード圧縮部５１０２と、圧縮符号マップ伸長部５１０３と、圧縮符号マップ特定部５１０４と、圧縮ファイル特定部５１０５と、照合フラグ設定部５１０６と、抽出部５１０７と、葉特定部５１０８と、伸長コード格納部５１０９と、照合部５１１０と、文字列置換部５１１１と、出力部５１１２と、生成部５１３４とを備える。
【０３８３】
入力部５１０１〜出力部５１１２，生成部５１３４は、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶されたプログラムをＣＰＵ４０１に実行させることにより、または、Ｉ／Ｆ４０９により、その機能を実現する。また、伸長バッファ５１２０は、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体によりその機能を実現する。なお、情報検索装置５１００は、上述した情報処理装置５００と同一装置であってもよく、異なる装置であってもよい。
【０３８４】
まず、入力部５１０１は、検索キーワードの入力を受け付ける機能を有する。入力部５１０１は、図５５に示した（７）に相当する機能である。入力部５１０１では、検索キーワードのほか、前方一致検索や後方一致検索といった検索条件も受け付ける。
【０３８５】
図５７は、対象ファイルＦｐ内の記述例を示す説明図である。（Ａ）は、対象ファイルＦｐ内の見出しデータである。ここでは、例として「国際通貨基金」という見出し語を示している。見出しデータでは、カンマで文字列を区切るようにルール化されている。
（Ｂ）は、対象ファイルＦｐ内の本文データである。カッコや読点により、単語が区切られている。このように、カンマやカッコ、読点、スペースなど文字列の連続性を遮断するような文字を特殊文字と称す。この特殊文字を連続グラム分割マップ群に利用することで、前方一致検索や後方一致検索を効率的に実行することができる。
【０３８６】
すなわち、入力部５１０１では、検索キーワードのほかに、前方一致検索が指定された場合、検索キーワードの先頭に特殊文字の文字コードを自動付与する。たとえば、（Ａ）の例では、検索キーワードが「国際通貨基金」である場合、先頭にカンマを自動付与して、「，国際通貨基金」とすることで、前方一致検索の効率化を図ることができる。また、（Ｂ）の例では、検索キーワードが「国際通貨基金」である場合、先頭に右カッコを自動付与して、「）国際通貨基金」とすることで、前方一致検索の効率化を図ることができる。
【０３８７】
同様に、検索キーワードのほかに、後方一致検索が指定された場合、検索キーワードの末尾に特殊文字の文字コードを自動付与する。たとえば、（Ａ）の例では、検索キーワードが「国際通貨基金」である場合、末尾にカンマを自動付与して、「国際通貨基金，」とすることで、後方一致検索の効率化を図ることができる。また、（Ｂ）の例では、検索キーワードが「国際通貨基金」である場合、末尾に読点を自動付与して、「国際通貨基金。」とすることで、後方一致検索の効率化を図ることができる。
【０３８８】
また、特殊文字が複数種類あるが、どの特殊文字を利用すればよいかは検索の種類に応じて自動設定することとすればよい。たとえば、見出し語検索の場合は、特殊文字をカンマのみとし、全文検索の場合は、カッコや読点、スペース、墨付カッコとすればよい。なお、特殊文字を仮想的な「区切り文字」と見なし、ＵＴＦ１６の外字コードを割当て、連続グラム分割マップの高位文字コードに割付ける。そして、検索キーワードの文字列の先頭や末尾に「区切り文字」を付与することにより、効率的に前方一致検索や後方一致検索を実現することができる。
【０３８９】
図５８は、検索条件が指定されたときの検索キーワードへの特殊文字の自動付与結果を示す説明図である。ここでは、検索キーワードを「人形芝居」とし、特殊文字をカンマとしている。（Ａ）は前方一致検索の場合の自動付与を示しており、（Ｂ）は後方一致の場合の自動付与を示している。
【０３９０】
検索キーワード圧縮部５１０２は、検索キーワードを圧縮する機能を有する。検索キーワード圧縮部５１０２は、図５５に示した（８）に相当する機能である。具体的には、図３４に示したように、検索キーワード（圧縮対象文字コード列）を順次圧縮する。すなわち、文字構造体５３０を参照して、入力部５１０１によって入力された検索キーワードを構成する文字コードごとに葉Ｌ♯へのポインタを特定する。そして、特定された葉Ｌ♯へのポインタにより葉Ｌ♯の構造体にアクセスして、当該アクセス先の葉Ｌ♯の構造体に格納されている圧縮符号を抽出する。圧縮された検索キーワードの圧縮符号群は、圧縮バッファに格納される。
【０３９１】
圧縮符号マップ伸長部５１０３は、圧縮処理された圧縮符号マップ群Ｍｓを伸長する機能を有する。具体的には、検索キーワードの入力を契機として、圧縮に用いた圧縮符号マップ用ハフマン木により、圧縮符号マップ群Ｍｓにおけるファイル番号１〜αの圧縮符号マップの圧縮符号列（図４９、図５０を参照）をハフマン伸長する。これにより、圧縮符号マップ群Ｍｓを復元することができる。また、連続グラム分割マップやｘグラム頭尾分割マップも圧縮されていれば同じようにハフマン伸長することができる。
【０３９２】
生成部５１３４は、ｘグラムの検索キーワード内の連続する先行文字コードおよび後続文字コードの各識別情報のうち、少なくともいずれか一方の識別情報を２分割して他方の識別情報と組み合わせ、複数種類の組み合わせ識別情報を生成する機能を有する。
【０３９３】
具体的には、たとえば、先行文字コードの圧縮符号マップへのポインタと後続文字コードの圧縮符号マップへのポインタとを用いる。たとえば、２分割に設定されている場合、いずれか一方のポインタを上位ビットと下位ビットに分割する。非分割である他方の圧縮符号マップへのポインタに分割されたポインタをそれぞれ連結する。これにより、２種類の組み合わせポインタを生成することができる。
【０３９４】
また、４分割に設定されている場合、先行文字コードの圧縮符号マップへのポインタと後続文字コードの圧縮符号マップへのポインタとを、それぞれ上位ビットと下位ビットに分割する。分割された４個のビット列から２つ選択して連結することで、４種類の組み合わせポインタを生成することができる。
【０３９５】
たとえば、検索キーワードの圧縮時にアクセスした葉Ｌ♯の構造体の連続グラム領域に、圧縮符号マップへのポインタが格納されている場合、その圧縮符号マップへのポインタと葉Ｌ♯の構造体の圧縮符号マップへのポインタとを組み合わせて、連続グラム分割マップへのポインタ群を組み合わせポインタとして生成する。具体的な生成処理は、図４６−４に示したポインタ分割処理と同一処理である。
【０３９６】
組み合わせポインタについては、検索キーワードを構成する先頭文字コードの圧縮符号マップへのポインタと末尾文字コードの圧縮符号マップへのポインタについても同様に生成される。
【０３９７】
たとえば、検索キーワードの圧縮時にアクセスした葉Ｌ♯の構造体のｇグラム頭尾領域（ｇは検索キーワードのグラム数）に、圧縮符号マップへのポインタが格納されている場合、その圧縮符号マップへのポインタと葉Ｌ♯の構造体の圧縮符号マップへのポインタとを組み合わせて、ｇグラム頭尾分割マップへのポインタ群を生成する。具体的な生成処理は、図４６−４に示したポインタ分割処理と同一処理である。
【０３９８】
圧縮符号マップ特定部５１０４は、圧縮符号マップ群Ｍｓのうち、検索キーワードを構成する文字の文字コードに対応する圧縮符号マップＭを特定する機能を有する。圧縮符号マップ特定部５１０４は、図５５に示した（９）に相当する機能である。圧縮符号マップ特定部５１０４では、検索キーワードの圧縮時にアクセスした葉Ｌ♯の構造体に格納されている圧縮符号マップへのポインタを取得する。そして、取得した圧縮符号マップへのポインタにより、該当する圧縮符号マップＭにアクセスする。
【０３９９】
また、圧縮符号マップ特定部５１０４は、２グラムの分割マップ群（連続グラム分割マップ群およびｘグラム頭尾分割マップ群）のうち、検索キーワードを構成する文字の文字コードに対応する２グラムの分割マップ群を特定する。具体的には、生成部５１３４によって生成された組み合わせポインタにより、２グラムの分割マップ群を指定することで、２グラムの分割マップ群を特定する。そして、連続グラム分割マップ群とｇグラム頭尾分割マップ群を指定することで、連続グラム分割マップ群とｇグラム頭尾分割マップ群とを特定することができる。
【０４００】
圧縮ファイル特定部５１０５は、圧縮符号マップ特定部５１０４によって特定された圧縮符号マップＭを参照することにより、検索キーワード圧縮部５１０２によって圧縮された圧縮符号群をすべて含む圧縮ファイルを圧縮ファイル群から特定する機能を有する。圧縮ファイル特定部５１０５は、図５５に示した（１０）に相当する機能である。圧縮ファイル特定部５１０５では、圧縮ファイルごとに、検索キーワードを構成する各文字コードのビットをＡＮＤ演算する。そして、ＡＮＤ演算結果が“１”であれば、そのファイル番号ｐの圧縮ファイルｆｐに検索キーワードを構成する文字がすべて含まれていることとなる。これにより、圧縮ファイル群Ｆｓの絞込みをおこなうことができる。
【０４０１】
図５９は、圧縮ファイル特定部５１０５による特定例を示す説明図である。図５９では、例として検索キーワードを『人形芝居』とする。そして、圧縮符号マップ特定部５１０４によって特定された圧縮符号マップＭを圧縮符号マップＭ１〜Ｍ４とする。また、図５９では、理解の容易のため、ファイル数αをα＝４とし、追加ファイル数βをβ＝０とする。
【０４０２】
圧縮符号マップＭ１〜Ｍ４のビット列および削除マップＭｄをファイル番号ごとの列でＡＮＤ演算する。ファイル番号１の列は、『人』，『形』，『芝』，『居』がすべて存在しないため、ＡＮＤ演算結果は“０”である。ファイル番号２の列は、『人』，『形』，『芝』，『居』がすべて存在するが、対象ファイルＦ２は削除されているため、削除マップＭｄのビットが“０”である。したがって、ＡＮＤ演算結果は“０”である。
【０４０３】
ファイル番号３の列は、『人』，『形』，『芝』，『居』がすべて存在し、かつ、削除マップＭｄのビットが“１”である。したがって、ＡＮＤ演算結果は“１”である。ファイル番号４の列は、『形』，『芝』，『居』が存在しないため、ＡＮＤ演算結果は“０”である。これにより、図５９の例では、圧縮ファイルｆ１〜ｆ４のうち、ファイル番号３の圧縮ファイルｆ３に絞り込まれることとなる。なお、圧縮ファイル特定部５１０５によって特定された圧縮ファイルｆ内の圧縮符号列は、ＣＰＵ４０１により、内部のレジスタや外部のバッファに書き込まれる。
【０４０４】
また、圧縮ファイル特定部５１０５は、圧縮符号マップ特定部５１０４によって特定された分割マップ群を参照することにより、検索キーワード圧縮部５１０２によって圧縮された圧縮符号群をすべて含む圧縮ファイルを圧縮ファイル群から特定する。具体的には、たとえば、圧縮符号マップ特定部５１０４により、ｇグラムの検索キーワードを構成する連続グラムについて、連続グラム分割マップ群が特定され、ｇグラムの検索キーワードの頭尾グラムについて、ｇグラム頭尾分割マップ群が特定される。
【０４０５】
したがって、圧縮ファイル特定部５１０５では、連続グラム分割マップ群およびｇグラム頭尾分割マップ群についてＡＮＤ演算を実行する。ＡＮＤ演算結果が“１”であれば、そのファイル番号ｐの圧縮ファイルｆｐに、ｇグラムの検索キーワードを構成する連続２グラムの文字コード列と、頭尾の文字コードの組み合わせを満足する文字コード列が含まれていることとなる。
【０４０６】
図６０−１〜図６０−３は、５グラムの検索キーワード「人形芝居」について、連続グラム分割マップ群と５グラム頭尾分割マップ群とを用いた圧縮ファイルｆの特定例を示す説明図である。図６０−１は、検索条件を指定していない部分一致検索の場合の絞込みである。図６０−１では、ファイル番号３の圧縮ファイルｆ３に、「人」と「形」とが連続する２グラムの文字コード、「形」と「芝」の上位分割文字コードとが連続する２グラムの文字コード、「芝」の文字コード、「芝」の下位分割文字コードと「居」の文字コードとが連続する２グラムの文字コード、先頭が「人」で末尾が「居」である５グラムの文字コードが含まれていることがわかる。
【０４０７】
したがって、図９に示した１グラムでの絞り込みに比べて、文字列「人形芝居」が記述されている可能性が非常に高いこととなる。なお、図６０−１では部分一致検索の場合の絞込みについて説明したが、図６０−２は、特殊文字をカンマとした場合の前方一致検索の場合の絞込みの例であり、図６０−３は、特殊文字をカンマとした場合の後方一致検索の場合の絞込みの例である。
【０４０８】
また、図５６に戻って、照合フラグ設定部５１０６は、圧縮ファイル特定部５１０５により葉Ｌ♯の構造体にアクセスされた際、葉Ｌ♯の構造体内の照合フラグをＯＮに設定する機能を有する。照合フラグは、その葉Ｌ♯の構造体に対応する文字コードが伸長バッファ５１２０に格納された場合、対象となる検索キーワード内の文字コードと照合するか否かを判断するフラグである。照合フラグがＯＮの場合は照合し、ＯＦＦの場合は照合しない。デフォルトはＯＦＦであり、検索結果が得られると、ＯＦＦにリセットされる。これにより、照合フラグがＯＮである葉Ｌ♯の構造体の文字コードのみと照合をおこなうことができ、無駄な照合を回避することができる。
【０４０９】
抽出部５１０７は、圧縮ファイル特定部５１０５によって特定された圧縮ファイルｆの中から葉Ｌ♯へのポインタと同じ長さとなる圧縮符号列を抽出する機能を有する。抽出された圧縮符号列は、根の構造体セルＣ（１，１）に格納されている葉Ｌ♯へのポインタ群のいずれかのポインタに一致することとなる。
【０４１０】
葉特定部５１０８は、抽出部５１０７によって抽出された圧縮符号列に基づいて、無節点ハフマン木Ｈ２により葉Ｌ♯の構造体を特定する機能を有する。具体的には、たとえば、抽出された圧縮符号を含む枝番号に一致する葉Ｌ♯へのポインタを、無節点ハフマン木Ｈ２の根の構造体セルＣ（１，１）の中から探索する。そして、探索された場合、ポイント先となる葉Ｌ♯の構造体に１パスでアクセスする。
【０４１１】
たとえば、葉Ｌ１の構造体に含まれている圧縮符号は“００００”、葉Ｌ１をポイントする葉Ｌ１へのポインタＬ１Ｐ（１）〜Ｌ１Ｐ（２５６）は、“００００００００００００”〜“００００１１１１１１１１”である。したがって、抽出された圧縮符号“００００”を含む葉Ｌ♯へのポインタが、“００００００００００００”〜“００００１１１１１１１１”である場合、そのポイント先である葉Ｌ１の構造体にアクセスする。
【０４１２】
伸長コード格納部５１０９は、葉特定部５１０８によってアクセスされた葉Ｌ♯の構造体に格納されている文字コード等を抽出して、伸長コードとして伸長バッファ５１２０に格納する機能を有する。具体的には、たとえば、上記の例では、葉Ｌ１の構造体にアクセスしているため、葉Ｌ１の構造体の第３領域２８０３に格納されている文字コードｅ１を伸長コードとして抽出する。そして、抽出された伸長コードを伸長バッファ５１２０に書き込む。ここで、伸長コードの格納の具体例について説明する。
【０４１３】
図６１−１〜図６１−５は、抽出部５１０７、葉特定部５１０８および伸長コード格納部５１０９による２ｍ分枝の無節点ハフマン木Ｈ２を用いた伸長処理の具体例を示す説明図である。図６１−１〜図６１−５では、図３３−２に示した圧縮符号列を伸長する例を示している。伸長処理では、レジスタに圧縮符号列をセットし、マスクパターンにより圧縮符号を抽出する。抽出した圧縮符号を、１パス（１枝分のアクセス）で２ｍ分枝の無節点ハフマン木Ｈ２の根から探索する。そして、アクセスした葉Ｌ♯の構造体に格納されている文字コードを読み出して伸長バッファ５１２０に格納する。
【０４１４】
圧縮符号を抽出するため、マスクパターンのマスク位置をオフセットする。また、マスクパターンの初期値を“０ｘＦＦＦ０００００”とする。このマスクパターンは先頭１２ビットが“１”であり、後続の２０ビットが“０”のビット列である。
【０４１５】
ＣＰＵ４０１はビットアドレスａｂｉとバイトオフセットｂｙｏｓとビットオフセットｂｉｏｓとを算出する。ビットアドレスａｂｉは、抽出された圧縮符号のビット位置を示す値であり、今回のビットアドレスａｂｉは、前回のビットアドレスａｂｉに前回抽出された圧縮符号の圧縮符号長ｌｅｇを加算した値となる。なお、初期状態では、ビットアドレスａｂｉはａｂｉ＝０とする。
【０４１６】
バイトオフセットｂｙｏｓは、メモリに保持されている圧縮符号列のバイト境界を示す値であり、ビットアドレスａｂｉ／８の商で求められる。たとえば、バイトオフセットｂｙｏｓ＝０のときは、メモリに記憶されている先頭からの圧縮符号列をレジスタにセットし、バイトオフセットｂｙｏｓ＝１のときは、メモリに記憶されている先頭１バイト目からの圧縮符号列をレジスタにセットする。
【０４１７】
また、ビットオフセットｂｉｏｓは、マスクパターンのマスク位置（“ＦＦＦ”）をオフセットする値であり、ビットアドレスａｂｉ／８の余りである。たとえば、ビットオフセットｂｉｏｓ＝０のときは、マスク位置はシフトされないこととなり、マスクパターンは、“０ｘＦＦＦ０００００”となる。一方、ビットオフセットｂｉｏｓ＝４のときは、マスク位置は末尾方向に４ビットシフトすることとなり、マスクパターンは、“０ｘ０ＦＦＦ００００”となる。
【０４１８】
レジスタシフト数ｒｓは、マスクパターンとのＡＮＤ演算後のレジスタ内の圧縮符号列を末尾方向にシフトするビット数であり、ｒｓ＝３２−１２−ｂｉｏｓで求められる。このシフトにより、シフト後のレジスタの末尾ｍビットのビット列を対象ビット列として抽出する。対象ビット列の抽出後はレジスタをクリアする。
【０４１９】
なお、図６１−１〜図６１−５において、メモリには図３４に示した圧縮符号列が保持されているものとする。また、図６１−１〜図６１−５のメモリ内のブロックは１バイトのビット列を示しており、内部の数字は、バイト境界となるバイト位置を示している。
【０４２０】
図６１−１は、初期状態（（Ａ）の状態）を示している。（Ａ）では、ビットアドレスａｂｉ＝０により、バイトオフセットｂｙｏｓ＝０、ビットオフセットｂｉｏｓ＝０となる。バイトオフセットｂｙｏｓ＝０により、メモリに保持されている圧縮符号列のうち先頭から４バイト分（図中、網掛け）の圧縮符号列をレジスタにセットする。
【０４２１】
また、ビットオフセットｂｉｏｓ＝０により、マスクパターンは、“０ｘＦＦＦ０００００”である。したがって、レジスタにセットされた圧縮符号列とマスクパターン“０ｘＦＦＦ０００００”を論理積（ＡＮＤ）演算することにより、ＡＮＤ結果が得られる。
【０４２２】
また、ビットオフセットｂｉｏｓ＝０により、レジスタシフト数ｒｓは、ｒｓ＝３２−ｍ―ｂｉｏｓ＝３２−１２−０＝２０となる。したがって、レジスタ内のＡＮＤ結果を末尾方向に２０ビット分シフトする。このシフトによりレジスタには、“１１０００１００１１００”が残されるため、末尾１２ビットを対象ビット列として抽出する。この場合は、“１１０００１００１１００”が対象ビット列として抽出される。抽出後、レジスタはクリアされる。
【０４２３】
図２７に示したように、無節点ハフマン木Ｈ２の根の構造体セルＣ（１，１）には、葉Ｌ１〜Ｌ１２９５へのポインタが格納されている。したがって、無節点ハフマン木Ｈ２の根の構造体セルＣ（１，１）の中から、抽出された対象ビット列“１１０００１００１１００”と一致する葉Ｌ♯へのポインタ（枝番号）を探索する。この場合、葉Ｌ６９１へのポインタ群の中の１つと一致するため、該当する葉Ｌ６９１へのポインタを読み出して、葉Ｌ６９１の構造体にアクセスする。
【０４２４】
葉Ｌ３４２１の構造体には、文字コード“０ｘＢＡ４Ｅ”（文字：「人」に相当）が格納されているため、当該文字コード“０ｘＢＡ４Ｅ”を抽出して伸長バッファ５１２０に格納する。また、葉Ｌ６９１の構造体には、文字コード“０ｘＢＡ４Ｅ”の圧縮符号長ｌｅｇ（＝１２ビット）も格納されているため、文字コード“０ｘＢＡ４Ｅ”の圧縮符号長ｌｅｇも抽出する。この抽出された圧縮符号長ｌｅｇによりビットアドレスａｂｉを更新する。この場合、更新後のビットアドレスａｂｉはａｂｉ＝０＋１２＝１２となる。
【０４２５】
図６１−２は、図６１−１に示した（Ａ）の状態からレジスタをバイトオフセットｂｉｏｓ分シフトした場合の伸長処理（（Ｂ）の状態）を示している。前回である（Ａ）のビットアドレスａｂｉはａｂｉ＝０、圧縮符号長ｌｅｇは１２ビットであるため、（Ｂ）のビットアドレスａｂｉはａｂｉ＝１２ビットとなる。
【０４２６】
また、このビットアドレスａｂｉ＝１２により、バイトオフセットｂｙｏｓ＝１、ビットオフセットｂｉｏｓ＝４となる。バイトオフセットｂｙｏｓ＝１により、メモリに保持されている圧縮符号列のうち先頭１バイト目から４バイト分（図中、網掛け）の圧縮符号列をレジスタにセットする。
【０４２７】
また、ビットオフセットｂｉｏｓ＝４により、マスクパターンは、“０ｘ０ＦＦＦ００００”である。したがって、レジスタにセットされた圧縮符号列とマスクパターン“０ｘ０ＦＦＦ００００”を論理積（ＡＮＤ）演算することにより、ＡＮＤ結果が得られる。
【０４２８】
また、ビットオフセットｂｉｏｓ＝４により、レジスタシフト数ｒｓは、ｒｓ＝３２−ｍ―ｂｉｏｓ＝３２−１２−４＝１６となる。したがって、レジスタ内のＡＮＤ結果を末尾方向に１６ビット分シフトする。このシフトによりレジスタには、“０００００１０００１００１０１０”が残されるため、末尾１２ビットを対象ビット列として抽出する。この場合は、“０１０００１００１０１０”が対象ビット列として抽出される。抽出後、レジスタはクリアされる。
【０４２９】
図２７に示したように、無節点ハフマン木Ｈ２の根の構造体セルＣ（１，１）には、葉Ｌ１〜Ｌ１２９５へのポインタが格納されている。したがって、無節点ハフマン木Ｈ２の根の構造体セルＣ（１，１）の中から、抽出された対象ビット列“０１０００１００１０１０”と一致する葉Ｌ♯へのポインタ（枝番号）を探索する。この場合、対象ビット列“０１０００１００１０１０”が葉Ｌ２４へのポインタ群の中の１つと一致するため、該当する葉Ｌ２４へのポインタを読み出して、葉Ｌ２４の構造体にアクセスする。
【０４３０】
葉Ｌ２４の構造体には、文字コード“０ｘ６２５Ｆ”（文字：「形」に相当）が格納されているため、当該文字コード“０ｘ６２５Ｆ”を抽出して伸長バッファ５１２０に格納する。また、葉Ｌ２４の構造体には、文字コード“０ｘ６２５Ｆ”の圧縮符号長ｌｅｇ（＝８ビット）も格納されているため、文字コード“０ｘ６２５Ｆ”の圧縮符号長ｌｅｇも抽出する。この抽出された圧縮符号長ｌｅｇによりビットアドレスａｂｉを更新する。この場合、更新後のビットアドレスａｂｉはａｂｉ＝１２＋８＝２０となる。
【０４３１】
図６１−３は、図６１−２に示した（Ｂ）の状態からレジスタをバイトオフセットｂｉｏｓ分シフトした場合の伸長処理（（Ｃ）の状態）を示している。前回である（Ｂ）のビットアドレスａｂｉはａｂｉ＝１２、圧縮符号長ｌｅｇは８ビットであるため、（Ｃ）のビットアドレスａｂｉはａｂｉ＝２０ビットとなる。
【０４３２】
また、このビットアドレスａｂｉ＝２０により、バイトオフセットｂｙｏｓ＝２、ビットオフセットｂｉｏｓ＝４となる。バイトオフセットｂｙｏｓ＝２により、メモリに保持されている圧縮符号列のうち先頭２バイト目から４バイト分（図中、網掛け）の圧縮符号列をレジスタにセットする。
【０４３３】
また、ビットオフセットｂｉｏｓ＝４により、マスクパターンは、“０ｘ０ＦＦＦ００００”である。したがって、レジスタにセットされた圧縮符号列とマスクパターン“０ｘ０ＦＦＦ００００”を論理積（ＡＮＤ）演算することにより、ＡＮＤ結果が得られる。
【０４３４】
また、ビットオフセットｂｉｏｓ＝４により、レジスタシフト数ｒｓは、ｒｓ＝３２−ｍ―ｂｉｏｓ＝３２−１２−４＝１６となる。したがって、レジスタ内のＡＮＤ結果を末尾方向に１６ビット分シフトする。このシフトによりレジスタには、“００００１０１００１００００００”が残されるため、末尾１２ビットを対象ビット列として抽出する。この場合は、“１０１００１００００００”が対象ビット列として抽出される。抽出後、レジスタはクリアされる。
【０４３５】
図２７に示したように、無節点ハフマン木Ｈ２の根の構造体セルＣ（１，１）には、葉Ｌ１〜Ｌ１２９５へのポインタが格納されている。したがって、無節点ハフマン木Ｈ２の根の構造体セルＣ（１，１）の中から、抽出された対象ビット列“１０１００１００００００”と一致する葉Ｌ♯へのポインタ（枝番号）を探索する。この場合、対象ビット列“１０１００１００００００”が葉Ｌ１６７へのポインタ群の中の１つと一致するため、該当する葉Ｌ１６７へのポインタを読み出して、葉Ｌ１６７の構造体にアクセスする。
【０４３６】
葉Ｌ１６７の構造体には、分割文字コード“０ｘ９Ｄ”が格納されているため、当該文字コード“０ｘ９Ｄ”を抽出して伸長バッファ５１２０に格納する。また、葉Ｌ１６７の構造体には、文字コード“０ｘ９Ｄ”の圧縮符号長ｌｅｇ（＝１２ビット）も格納されているため、文字コード“０ｘ９Ｄ”の圧縮符号長ｌｅｇも抽出する。この抽出された圧縮符号長ｌｅｇによりビットアドレスａｂｉを更新する。この場合、更新後のビットアドレスａｂｉはａｂｉ＝２０＋１２＝３２となる。
【０４３７】
図６１−４は、図６１−３に示した（Ｃ）の状態からレジスタをバイトオフセットｂｉｏｓ分シフトした場合の伸長処理（（Ｄ）の状態）を示している。前回である（Ｃ）のビットアドレスａｂｉはａｂｉ＝２０、圧縮符号長ｌｅｇは１２ビットであるため、（Ｄ）のビットアドレスａｂｉはａｂｉ＝３２ビットとなる。
【０４３８】
また、このビットアドレスａｂｉ＝３２により、バイトオフセットｂｙｏｓ＝４、ビットオフセットｂｉｏｓ＝０となる。バイトオフセットｂｙｏｓ＝４により、メモリに保持されている圧縮符号列のうち先頭４バイト目から４バイト分（図中、網掛け）の圧縮符号列をレジスタにセットする。
【０４３９】
また、ビットオフセットｂｉｏｓ＝０により、マスクパターンは、“０ｘＦＦＦ０００００”である。したがって、レジスタにセットされた圧縮符号列とマスクパターン“０ｘＦＦＦ０００００”を論理積（ＡＮＤ）演算することにより、ＡＮＤ結果が得られる。
【０４４０】
また、ビットオフセットｂｉｏｓ＝０により、レジスタシフト数ｒｓは、ｒｓ＝３２−ｍ―ｂｉｏｓ＝３２−１２−０＝２０となる。したがって、レジスタ内のＡＮＤ結果を末尾方向に２０ビット分シフトする。このシフトによりレジスタには、“１０１０００１１０１０１”が残されるため、末尾１２ビットを対象ビット列として抽出する。この場合は、“１０１０００１１０１０１”が対象ビット列として抽出される。抽出後、レジスタはクリアされる。
【０４４１】
図２７に示したように、無節点ハフマン木Ｈ２の根の構造体セルＣ（１，１）には、葉Ｌ１〜Ｌ１２９５へのポインタが格納されている。したがって、無節点ハフマン木Ｈ２の根の構造体セルＣ（１，１）の中から、抽出された対象ビット列“１０１００１００００００”と一致する葉Ｌ♯へのポインタ（枝番号）を探索する。この場合、対象ビット列“１０１００１００００００”が葉Ｌ１５６へのポインタ群の中の一つと一致するため、葉Ｌ１５６へのポインタを読み出して、葉Ｌ１５６の構造体にアクセスする。
【０４４２】
葉Ｌ１５６の構造体には、分割文字コード“０ｘ８２”が格納されているため、当該文字コード“０ｘ８２”を抽出して伸長バッファ５１２０に格納する。また、葉Ｌ１５６の構造体には、文字コード“０ｘ８２”の圧縮符号長ｌｅｇ（＝１２ビット）も格納されているため、文字コード“０ｘ８２”の圧縮符号長ｌｅｇも抽出する。この抽出された圧縮符号長ｌｅｇによりビットアドレスａｂｉを更新する。この場合、更新後のビットアドレスａｂｉはａｂｉ＝３２＋１２＝４４となる。
【０４４３】
図６１−５は、図６１−４に示した（Ｄ）の状態からレジスタをバイトオフセットｂｉｏｓ分シフトした場合の伸長処理（（Ｅ）の状態）を示している。前回である（Ｄ）のビットアドレスａｂｉはａｂｉ＝３２、圧縮符号長ｌｅｇは１２ビットであるため、（Ｅ）のビットアドレスａｂｉはａｂｉ＝４４ビットとなる。
【０４４４】
また、このビットアドレスａｂｉ＝４４により、バイトオフセットｂｙｏｓ＝５、ビットオフセットｂｉｏｓ＝４となる。バイトオフセットｂｙｏｓ＝５により、メモリに保持されている圧縮符号列のうち先頭５バイト目から４バイト分（図中、網掛け）の圧縮符号列をレジスタにセットする。
【０４４５】
また、ビットオフセットｂｉｏｓ＝４により、マスクパターンは、“０ｘ０ＦＦＦ００００”である。したがって、レジスタにセットされた圧縮符号列とマスクパターン“０ｘ０ＦＦＦ００００”を論理積（ＡＮＤ）演算することにより、ＡＮＤ結果が得られる。
【０４４６】
また、ビットオフセットｂｉｏｓ＝４により、レジスタシフト数ｒｓは、ｒｓ＝３２−ｍ―ｂｉｏｓ＝３２−１２−４＝１６となる。したがって、レジスタ内のＡＮＤ結果を末尾方向に１６ビット分シフトする。このシフトによりレジスタには、“０００００１１１１０１１１１１１”が残されるため、末尾１２ビットを対象ビット列として抽出する。この場合は、“０１１１１０１１１１１１”が対象ビット列として抽出される。抽出後、レジスタはクリアされる。
【０４４７】
図２７に示したように、無節点ハフマン木Ｈ２の根の構造体セルＣ（１，１）には、葉Ｌ１〜Ｌ１２９５へのポインタが格納されている。したがって、無節点ハフマン木Ｈ２の根の構造体セルＣ（１，１）の中から、抽出された対象ビット列“０１１１１０１１１１１１”と一致する葉Ｌ♯へのポインタ（枝番号）を探索する。この場合、対象ビット列“０１１１１０１１１１１１”が葉Ｌ７９へのポインタと一致するため、葉Ｌ７９へのポインタを読み出して、葉Ｌ７９の構造体にアクセスする。
【０４４８】
葉Ｌ７９の構造体には、文字コード“０ｘ４５５Ｃ”が格納されているため、当該文字コード“０ｘ６Ｆ３０”を抽出して伸長バッファ５１２０に格納する。また、葉Ｌ７９の構造体には、文字コード“０ｘ４５５Ｃ”の圧縮符号長ｌｅｇ（＝８ビット）も格納されているため、文字コード“０ｘ４５５Ｃ”の圧縮符号長ｌｅｇも抽出する。この抽出された圧縮符号長ｌｅｇによりビットアドレスａｂｉを更新する。この場合、更新後のビットアドレスａｂｉはａｂｉ＝４４＋８＝５２となる。
【０４４９】
また、図５６において、照合部５１１０は、検索キーワードの文字コード列と伸長バッファ５１２０に格納された伸長コード列とを照合する機能を有する。照合部５１１０は、伸長コード格納部５１０９により伸長コードが順次伸長バッファ５１２０に格納される都度、当該伸長コードに対し照合をおこなう。これにより、伸長処理と同時に検索キーワードとの照合を実行することができ、高速処理を実現することができる。
【０４５０】
照合部５１１０では、具体的には、たとえば、伸長バッファ５１２０に順次格納される伸長コードのうち、照合フラグがＯＮである伸長コードについて照合をおこなう。照合対象となる文字コードは、検索キーワード内の文字コードである。伸長コードとの照合対象は、伸長コードの伸長コード長により決定する。たとえば、伸長コードの伸長コード長が１６ビットである場合、同じように、１６ビットの文字コードが照合対象となる。一方、伸長コード長が８ビットである場合、同じように、８ビットの文字コード（分割文字コード）が照合対象となる。なお、照合対象の開始位置は、検索キーワードの先頭である。
【０４５１】
照合部５１１０は、照合一致する都度、照合対象となる文字コードを、後続の文字コードにシフトする。途中で、照合不一致の伸長コードが出現したり、照合フラグＯＦＦの伸長コードが出現したりすると、検索キーワードの先頭から照合をやり直す。
【０４５２】
文字列置換部５１１１は、照合部５１１０により検索キーワードと一致する文字列が照合された場合、照合された文字列を強調表示するように文字列置換する機能を有する。具体的には、たとえば、照合一致された伸長コード列を、強調表示するためのタグで挟み込む。これにより、検索結果を表示する際に、照合一致された伸長コード列に相当する文字列が強調表示されることとなる。
【０４５３】
出力部５１１２は、伸長バッファ５１２０に格納されている伸長コード列をファイル化して、伸長後の対象ファイル（伸長ファイル）として出力する。出力された伸長ファイルは、記憶装置に記憶されたり、ディスプレイに表示される。ディスプレイに表示される場合、検索キーワードに一致する伸長コード列は、文字列置換部５１１１により、強調表示するタグに挟まれているため、ディスプレイ表示時に強調表示される。
【０４５４】
図６２−１〜図６２−３は、照合処理の具体例を示す説明図である。入力バッファ５４００には検索キーワード『人形芝居』の文字コード列である“ＢＡ４Ｅ６２５Ｆ９Ｄ８２４５５Ｃ”が格納されているものとする。
【０４５５】
図６２−１の（Ａ）において、伸長バッファ５１２０に文字『人』の文字コード“０ｘＢＡ４Ｅ”が伸長コードとして格納された場合、伸長コード“０ｘＢＡ４Ｅ”を格納する葉Ｌ♯の構造体の照合フラグのＯＮ／ＯＦＦを判断する。この場合はＯＮであるため、伸長コード“０ｘＢＡ４Ｅ”について照合をおこなう。
【０４５６】
また、伸長コード“０ｘＢＡ４Ｅ”は１６ビット文字コードであるため、照合対象となる文字コードは、先頭から１６ビット分の文字コードとなる。本例の場合、文字『人』の文字コード“０ｘＢＡ４Ｅ”である。この場合、伸長コードと照合対象の文字コードは一致するため、次に伸長バッファ５１２０に格納される伸長コードについて同様の照合処理をおこなう。
【０４５７】
（Ｂ）において、伸長バッファ５１２０に文字『形』の文字コード“０ｘ６２５Ｆ”が伸長コードとして格納された場合、伸長コード“０ｘ６２５Ｆ”を格納する葉Ｌ♯の構造体の照合フラグのＯＮ／ＯＦＦを判断する。この場合はＯＮであるため、伸長コード“０ｘ６２５Ｆ”について照合をおこなう。
【０４５８】
また、伸長コード“０ｘ６２５Ｆ”は１６ビット文字コードであるため、照合対象となる文字コードは、文字コード“０ｘＢＡ４Ｅ”から１６ビット分シフトした文字コードとなる。本例の場合、文字『形』の文字コード“０ｘ６２５Ｆ”である。この場合、伸長コードと照合対象の文字コードは一致するため、次に伸長バッファ５１２０に格納される伸長コードについて同様の照合処理をおこなう。
【０４５９】
（Ｃ）において、伸長バッファ５１２０に文字『芝』の分割文字コード“０ｘ９Ｄ”が伸長コードとして格納された場合、伸長コード“０ｘ９Ｄ”を格納する葉Ｌ♯の構造体の照合フラグのＯＮ／ＯＦＦを判断する。この場合はＯＮであるため、伸長コード“０ｘ９Ｄ”について照合をおこなう。
【０４６０】
また、伸長コード“０ｘ９Ｄ”は８ビット文字コードであるため、照合対象となる文字コードは、文字コード“０ｘ６２５Ｆ”から８ビット分シフトした文字コードとなる。本例の場合、分割文字コード“０ｘ９Ｄ”である。この場合、伸長コードと照合対象の文字コードは一致するため、次に伸長バッファ５１２０に格納される伸長コードについて同様の照合処理をおこなう。
【０４６１】
（Ｄ）において、伸長バッファ５１２０に文字『芝』の分割文字コード“０ｘ８２”が伸長コードとして格納された場合、伸長コード“０ｘ８２”を格納する葉Ｌ♯の構造体の照合フラグのＯＮ／ＯＦＦを判断する。この場合はＯＮであるため、伸長コード“０ｘ８２”について照合をおこなう。
【０４６２】
また、伸長コード“０ｘ８２”は８ビット文字コードであるため、照合対象となる文字コードは、文字コード“０ｘ９Ｄ”から８ビット分シフトした文字コードとなる。本例の場合、分割文字コード“０ｘ８２”である。この場合、伸長コードと照合対象の文字コードは一致するため、次に伸長バッファ５１２０に格納される伸長コードについて同様の照合処理をおこなう。
【０４６３】
（Ｅ）において、伸長バッファ５１２０に文字『居』の文字コード“０ｘ４５５Ｃ”が伸長コードとして格納された場合、伸長コード“０ｘ４５５Ｃ”を格納する葉Ｌ♯の構造体の照合フラグのＯＮ／ＯＦＦを判断する。この場合はＯＮであるため、伸長コード“０ｘ４５５Ｃ”について照合をおこなう。
【０４６４】
また、伸長コード“０ｘ４５５Ｃ”は１６ビット文字コードであるため、照合対象となる文字コードは、文字コード“０ｘ８２”から１６ビット分シフトした文字コードとなる。本例の場合、文字『居』の文字コード“０ｘ４５５Ｃ”である。この場合、伸長コードと照合対象の文字コードは一致する。
【０４６５】
そして、検索キーワード内の文字コード列をすべて照合し、一致したため、伸長バッファ５１２０内の伸長コード列“ＢＡ４Ｅ６２５Ｆ９Ｄ８２４５５Ｃ”を強調表示用のタグで挟み込む。これにより、検索結果を表示する際に、検索キーワードに一致する文字列として強調表示することができる。
【０４６６】
図６２−２では、照合一致の途中で不一致となる文字コードの出現例１を示している。（Ｆ）では、図６２−１の（Ａ），（Ｂ）のように、伸長コード“ＢＡ４Ｅ”、“６２５Ｆ”が照合一致しているものとする。
【０４６７】
（Ｆ）において、伸長バッファ５１２０に文字『町』の文字コード“０ｘ３Ａ７５”が伸長コードとして格納された場合、伸長コード“０ｘ３Ａ７５”を格納する葉Ｌ♯の構造体の照合フラグのＯＮ／ＯＦＦを判断する。この場合はＯＦＦであるため、伸長コード“０ｘ３Ａ７５”について照合をおこなわない。また、照合フラグがＯＦＦのため、照合対象となる文字コードは先頭に戻される。
【０４６８】
（Ｇ）において、伸長バッファ５１２０に文字『は』の文字コード“０ｘ６Ｆ３０”が伸長コードとして格納された場合、伸長コード“０ｘ６Ｆ３０”を格納する葉Ｌ♯の構造体の照合フラグのＯＮ／ＯＦＦを判断する。この場合はＯＦＦであるため、伸長コード“０ｘ６Ｆ３０”について照合をおこなわない。また、照合フラグがＯＦＦのため、照合対象となる文字コードは先頭に戻される。このように、照合フラグがＯＦＦである伸長コードについては照合がおこなわれないため、無駄な照合処理を防止することができ、照合処理の高速化を実現することができる。
【０４６９】
図６２−３では、照合一致の途中で不一致となる文字コードの出現例２を示している。（Ｈ）では、図６２−１の（Ａ），（Ｂ）のように、伸長コード“ＢＡ４Ｅ”、“６２５Ｆ”が照合一致しているものとする。
【０４７０】
（Ｈ）において、伸長バッファ５１２０に２回目の文字『人』の文字コード“０ｘＢＡ４Ｅ”が伸長コードとして格納された場合、伸長コード“０ｘＢＡ４Ｅ”を格納する葉Ｌ♯の構造体の照合フラグのＯＮ／ＯＦＦを判断する。この場合はＯＮであるため、伸長コード“０ｘＢＡ４Ｅ”について照合をおこなう。
【０４７１】
また、伸長コード“０ｘＢＡ４Ｅ”（２回目）は１６ビット文字コードであるため、照合対象となる文字コードは、文字コード“０ｘ６２５Ｆ”から１６ビット分シフトした文字コードとなる。本例の場合、文字『形』の文字コード“０ｘ６２５Ｆ”である。この場合、伸長コードと照合対象の文字コードは不一致であるが、伸長コード“０ｘＢＡ４Ｅ”（２回目）についての照合フラグはＯＮであり、また、１６ビット文字コードである。
【０４７２】
したがって、（Ｉ）において、照合対象を検索キーワードの先頭から１６ビットの文字コード“０ｘＢＡ４Ｅ”と照合する。この場合、一致するため、次に伸長バッファ５１２０に格納される伸長コードについて照合処理をおこなうことになる。
【０４７３】
（検索キーワード圧縮処理手順）
図６３は、検索キーワード圧縮処理手順を示すフローチャートである。まず、入力部５１０１が、検索キーワードが入力されるのを待ち受ける（ステップＳ６３０１：Ｎｏ）。そして、検索キーワードが入力された場合（ステップＳ６３０１：Ｙｅｓ）、入力部５１０１が、検索キーワードを単字分解する（ステップＳ６３０２）。そして、入力部５１０１により検索条件が指定されたか否かを判断する（ステップＳ６３０３）。
【０４７４】
検索条件が指定されていない場合（ステップＳ６３０３：Ｎｏ）、部分一致検索となるため、ステップＳ６３０７に移行する。一方、検索条件が指定されている場合（ステップＳ６３０３：Ｙｅｓ）、指定された検索条件が前方一致検索であるか後方一致検索であるかを判断する（ステップＳ６３０４）。前方一致検索である場合（ステップＳ６３０４：前方一致）、特殊文字を検索キーワードの先頭に追加して（ステップＳ６３０５）、ステップＳ６３０７に移行する。一方、後方一致検索である場合（ステップＳ６３０４：後方一致）、特殊文字を検索キーワードの末尾に追加して（ステップＳ６３０６）、ステップＳ６３０７に移行する。
【０４７５】
そして、ステップＳ６３０７において、、検索キーワード圧縮部５１０２が、無節点ハフマン木Ｈ２により検索キーワードを構成する各文字をハフマン圧縮する圧縮処理を実行する（ステップＳ６３０７）。圧縮処理（ステップＳ６３０７）は、図３４および図３６〜図３８に示した処理と同一であるため、説明を省略する。これにより、検索キーワード圧縮処理を終了する。
【０４７６】
（ファイル絞込み処理手順）
図６４−１は、圧縮ファイル特定部５１０５によるファイル絞込み処理手順を示すフローチャートである。まず、検索キーワードが所定グラム数以上であるか否かを判断する（ステップＳ６４１１）。所定グラム数は、あらかじめ設定しておく。検索キーワードが所定グラム数以上でない場合（ステップＳ６４１１：Ｎｏ）、１グラムでのファイル絞込み処理を実行する（ステップＳ６４１２）。一方、所定グラム数以上である場合（ステップＳ６４１１：Ｙｅｓ）、複数グラムでのファイル絞込み処理を実行する（ステップＳ６４１３）。
【０４７７】
図６４−２は、図６４−１に示した１グラムでのファイル絞込み処理（ステップＳ６４１２）の詳細な処理手順を示すフローチャートである。まず、図６３に示した圧縮処理（ステップＳ６３０７）において、葉Ｌ♯の構造体へのアクセスがあったか否かを判断する（ステップＳ６４２１）。葉Ｌ♯への構造体へのアクセスがあった場合（ステップＳ６４２１：Ｙｅｓ）、葉Ｌ♯の構造体の照合フラグをＯＮにする（ステップＳ６４２２）。そして、葉Ｌ♯の構造体から圧縮符号マップへのポインタと出現率領域を取得する（ステップＳ６４２３）。
【０４７８】
つぎに、取得した圧縮符号マップへのポインタにより圧縮符号マップにアクセスし（ステップＳ６４２４）、アクセス先の圧縮符号マップ伸長処理を実行して（ステップＳ６４２５）、ステップＳ６４２１に戻る。アクセス先の圧縮符号マップ伸長処理（ステップＳ６４２５）については後述する。ステップＳ６４２１において、葉Ｌ♯の構造体へのアクセスがない場合（ステップＳ６４２１：Ｎｏ）、図６３に示した検索キーワード圧縮処理が終了したか否かを判断する（ステップＳ６４２６）。
【０４７９】
終了していない場合（ステップＳ６４２６：Ｎｏ）、ステップＳ６４２１に戻る。一方、終了した場合（ステップＳ６４２６：Ｙｅｓ）、図５９に示したように、ＡＮＤ演算による圧縮ファイルの特定を実行する（ステップＳ６４２７）。このように特定された圧縮ファイルを「特定圧縮ファイルｆｔ」と称す。これにより、１グラムでのファイル絞込み処理を終了する。
【０４８０】
（アクセス先の圧縮符号マップ伸長処理手順）
図６４−３は、図６４−２に示したアクセス先の圧縮符号マップ伸長処理（ステップＳ６４２５）の詳細な処理手順を示すフローチャートである。まず、図５２−２に示した圧縮パターンテーブルを参照して、ステップＳ６４２３で取得した出現率領域が非圧縮領域であるか否かを判断する（ステップＳ６４３１）。非圧縮領域である場合（ステップＳ６４３１：Ｙｅｓ）、伸長処理を実行せずに、ステップＳ６４２１に戻る。
【０４８１】
一方、非圧縮領域でない場合（ステップＳ６４３１：Ｎｏ）、出現率領域に該当する圧縮符号マップ用ハフマン木を選択する（ステップＳ６４３２）。そして、ステップＳ６４２３で取得した圧縮符号マップへのポインタによるアクセス先の圧縮符号マップＭを、選択された圧縮符号マップ用ハフマン木によりハフマン伸長する（ステップＳ６４３３）。そして、出現率が５０％以上であるかを判断する（ステップＳ６４３４）。
【０４８２】
具体的には、出現率領域は、出現率に応じて決められているため（図５２−１を参照）、出現率領域がＡ〜Ｅである場合、取得文字コードの出現率が５０％以上でないと判断する。一方、出現率領域がＡ’〜Ｅ’である場合、取得文字コードの出現率が５０％以上であると判断する。
【０４８３】
そして、出現率が５０％以上である場合（ステップＳ６４３４：Ｙｅｓ）、ステップＳ５２０９にて反転させられているため、ステップＳ６４３３で伸長されたビット列を反転する（ステップＳ６４３５）。これにより、元のビット列に戻ることとなる。
【０４８４】
一方、ステップＳ６４３４において、出現率が５０％以上でない場合（ステップＳ６４３４：Ｎｏ）、ビット列反転（ステップＳ６４３５）をおこなうことなく、ステップＳ６４２１に戻る。
【０４８５】
このようなアクセス先の圧縮符号マップ伸長処理（ステップＳ６４２５）により、検索キーワードを構成する文字についての圧縮符号マップ内の圧縮符号列のみ伸長することができるため、検索に必要な圧縮符号列の伸長のみでよく、伸長効率の向上を図ることができる。
【０４８６】
図６４−４〜図６４−６は、図６４−１に示した複数グラムでのファイル絞込み処理（ステップＳ６４１３）の詳細な処理手順を示すフローチャートである。まず、図６４−１において、グラム数カウンタｇをｇ＝０にし（ステップＳ６４４１）、図６３に示した圧縮処理（ステップＳ６３０７）において、検索キーワードの先頭グラムとなる葉Ｌ♯の構造体へのアクセスを待ち受ける（ステップＳ６４４２：Ｎｏ）。
【０４８７】
葉Ｌ♯への構造体へのアクセスがあった場合（ステップＳ６４４２：Ｙｅｓ）、グラム数カウンタｇをインクリメントし（ステップＳ６４４３）、先頭グラムの葉Ｌ♯の構造体の照合フラグをＯＮにする（ステップＳ６４４４）。そして、先頭グラムの葉Ｌ♯の構造体から圧縮符号マップへのポインタを抽出し、マップ生成用レジスタに格納する（ステップＳ６４４５）。
【０４８８】
図６４−５において、後続グラムの葉Ｌ♯の構造体へのアクセスを待ち受け（ステップＳ６４５１：Ｎｏ）、後続グラムの葉Ｌ♯の構造体へのアクセスがあった場合（ステップＳ６４５１：Ｙｅｓ）、グラム数カウンタｇをインクリメントし（ステップＳ６４５２）、後続グラムの葉Ｌ♯の構造体から後続グラムの圧縮符号マップへのポインタを抽出して、マップ生成用レジスタに格納する（ステップＳ６４５３）。
【０４８９】
そして、後続グラムの葉Ｌ♯の構造体の連続グラム領域において、先行グラムの圧縮符号マップへのポインタ、すなわち、先にマップ生成用レジスタに格納した圧縮符号マップへのポインタと一致するポインタを検索する（ステップＳ６４５４）。一致するポインタが後続グラムの葉Ｌ♯の構造体の連続グラム領域になかった場合（ステップＳ６４５５：Ｎｏ）、ステップＳ６４５１に戻る。一方、一致するポインタがあった場合（ステップＳ６４５５：Ｙｅｓ）、後続グラムの葉Ｌ♯の構造体の照合フラグをＯＮにする（ステップＳ６４５６）。そして、後続グラムの葉Ｌ♯の構造体の出現率領域を取得し（ステップＳ６４５７）、ポインタ分割処理を実行する（ステップＳ６４５８）。
【０４９０】
ポインタ分割処理（ステップＳ６４５８）は、図４６−４に示したポインタ分割処理と同一処理となるため、説明を省略する。ポインタ分割処理（ステップＳ６４５８）により、先行グラムの圧縮符号マップへのポインタと後続グラムの圧縮符号マップへのポインタから連続グラム分割マップへのポインタ群が生成される。したがって、生成された連続グラム分割マップへのポインタ群により、該当する連続グラム分割マップ群を指定する（ステップＳ６４５９）。
【０４９１】
そして、ステップＳ６４５７で取得した後続グラムの葉Ｌ♯の構造体の出現率領域を用いて、アクセス先の連続グラム分割マップ伸長処理を実行する（ステップＳ６４６０）。アクセス先の連続グラム分割マップ伸長処理（ステップＳ６４６０）の詳細については、図６４−３に示した処理手順と同一であるため省略する。
【０４９２】
このようなアクセス先の連続グラム分割マップ伸長処理（ステップＳ６４６０）により、検索キーワードを構成する文字についての連続グラム分割マップ内の圧縮符号列のみ伸長することができるため、検索に必要な圧縮符号列の伸長のみでよく、伸長効率の向上を図ることができる。
【０４９３】
図６４−６において、後続グラムは検索キーワードの末尾グラムであるか否かを判断する（ステップＳ６４６１）。末尾グラムでない場合（ステップＳ６４６１：Ｎｏ）、図６４−５のステップＳ６４５１に戻る。これにより、末尾グラムが出現するまで、検索キーワード内の２連続グラムについて、連続グラム分割マップへのポインタ群を生成することができる。
【０４９４】
ステップＳ６４６１において、末尾グラムであると判断された場合（ステップＳ６４６１：Ｙｅｓ）、末尾となる後続グラムの葉Ｌ♯の構造体のｇグラム頭尾領域を検索する（ステップＳ６４６２）。末尾となる後続グラムの葉Ｌ♯の構造体のｇグラム頭尾領域に、圧縮符号マップへのポインタがあるか否かを判断する（ステップＳ６４６３）。末尾となる後続グラムの葉Ｌ♯の構造体のｇグラム頭尾領域に、圧縮符号マップへのポインタがない場合（ステップＳ６４６３：Ｎｏ）、ステップＳ６４６９に移行する。この場合、ｇグラム頭尾分割マップへのポインタ群が生成されないため、ｇグラム頭尾分割マップを用いた絞込みができなくなり、連続グラム分割マップを用いた絞込みとなる。
【０４９５】
また、末尾となる後続グラムの葉Ｌ♯の構造体のｇグラム頭尾領域に、圧縮符号マップへのポインタがある場合（ステップＳ６４６３：Ｙｅｓ）、当該圧縮符号マップへのポインタと、検索キーワードの先頭グラムの圧縮符号マップへのポインタとが一致するか否かを判断する（ステップＳ６４６４）。不一致である場合（ステップＳ６４６４：Ｎｏ）、ステップＳ６４６９に移行する。この場合、ｇグラム頭尾分割マップへのポインタ群が生成されないため、ｇグラム頭尾分割マップを用いた絞込みができなくなり、連続グラム分割マップを用いた絞込みとなる。
【０４９６】
一方、一致する場合（ステップＳ６４６４：Ｙｅｓ）、末尾となる後続グラムの葉Ｌ♯の構造体から出現率領域を取得して（ステップＳ６４６５）、ポインタ分割処理を実行する（ステップＳ６４６６）。
【０４９７】
ポインタ分割処理（ステップＳ６４６６）は、図４６−４に示したポインタ分割処理と同一処理となるため、説明を省略する。ポインタ分割処理（ステップＳ６４６６）により、先頭グラムの圧縮符号マップへのポインタと末尾グラムの圧縮符号マップへのポインタからｇグラム頭尾分割マップへのポインタ群が生成される。したがって、生成されたｇグラム頭尾分割マップへのポインタ群により、該当するｇグラム頭尾分割マップ群を指定する（ステップＳ６４６７）。
【０４９８】
そして、ステップＳ６４６５で取得した後続グラムの葉Ｌ♯の構造体の出現率領域を用いて、アクセス先のｇグラム頭尾分割マップ伸長処理を実行する（ステップＳ６４６８）。アクセス先のｇグラム頭尾分割マップ伸長処理（ステップＳ６４６８）の詳細については、図６４−３に示した処理手順と同一であるため省略する。
【０４９９】
そして、最後に、図６１−１〜図６１−３に示したように、ステップＳ６４６０で得られた連続グラム分割マップ群とステップＳ６４６８で得られたｇグラム頭尾分割マップ群とのＡＮＤ演算処理を実行して圧縮ファイルを特定する（ステップＳ６４６９）。このように特定された圧縮ファイルも「特定圧縮ファイルｆｔ」となる。これにより、複数グラムでのファイル絞込み処理を終了する。
【０５００】
（伸長処理手順）
図６５は、特定圧縮ファイル伸長処理手順を示すフローチャートである。まず、未処理の特定圧縮ファイルがあるか否かを判断する（ステップＳ６５０１）。未処理の特定圧縮ファイルがある場合（ステップＳ６５０１：Ｙｅｓ）、未処理の特定圧縮ファイルｆｔを１つ選択し（ステップＳ６５０２）、選択された特定圧縮ファイルｆｔをオープンする（ステップＳ６５０３）。そして、伸長処理を実行する（ステップＳ６５０４）。伸長処理（ステップＳ６５０４）の詳細については後述する。そして、選択された特定圧縮ファイルｆｔをクローズする（ステップＳ６５０５）。
【０５０１】
つぎに、選択された特定圧縮ファイルｆｔにおいて、ヒットしたか否かを判断する（ステップＳ６５０６）。具体的には、検索キーワードと一致する文字コード列があったか否かを判断する。ヒットした場合（ステップＳ６５０６：Ｙｅｓ）、特定圧縮ファイルｆｔを伸長した対象ファイルＦ内に検索キーワードと一致する文字コード列が存在することとなり、伸長バッファ５１２０内のデータをファイル出力する（ステップＳ６５０７）。ヒットしなかった場合（ステップＳ６５０６：Ｎｏ）、ステップＳ６５０８に移行する。
【０５０２】
これにより、特定圧縮ファイルｆｔから伸長された対象ファイルＦを得ることができる。このあと、伸長バッファ５１２０をクリアして（ステップＳ６５０８）、ステップＳ６５０１に戻る。一方、ステップＳ６５０１において、未処理の特定圧縮ファイルｆｔがない場合（ステップＳ６５０１：Ｎｏ）、特定圧縮ファイル伸長処理を終了する。
【０５０３】
（伸長処理手順）
図６６−１および図６６−２は、無節点ハフマン木Ｈ２を用いた伸長処理手順を示すフローチャートである。図６６−１において、まず、ビットアドレスａｂｉをａｂｉ＝０とし（ステップＳ６６１１）、バイトオフセットｂｙｏｓを算出し（ステップＳ６６１２）、ビットオフセットｂｉｏｓを算出する（ステップＳ６６１３）。そして、バイトオフセットｂｙｏｓの位置からの圧縮符号列をレジスタにセットする（ステップＳ６６１４）。
【０５０４】
つぎに、マスクパターン“０ｘＦＦＦ０００００”をビットオフセットｂｉｏｓ分、末尾方向にシフトして（ステップＳ６６１５）、レジスタにセットされた圧縮符号列とのＡＮＤ演算をおこなう（ステップＳ６６１６）。このあと、レジスタシフト数ｒｓを算出して（ステップＳ６６１７）、ＡＮＤ演算後のレジスタをレジスタシフト数ｒｓ分、末尾にシフトする（ステップＳ６６１８）。
【０５０５】
ステップＳ６６１８のあと、図６６−２において、シフト後のレジスタから末尾ｍ（ｍ＝１２）ビットを対象ビット列として抽出する（ステップＳ６６２１）。つぎに、無節点ハフマン木Ｈ２の根の構造体セルＣ（１，１）から枝番号となる葉Ｌ♯へのポインタを特定し（ステップＳ６６２２）、ポイント先となる葉Ｌ♯の構造体に１パスでアクセスする（ステップＳ６６２３）。そして、アクセス先の葉Ｌ♯の構造体から文字コードを抽出し（ステップＳ６６２４）、抽出された文字コードを伸長バッファ５１２０に書き込む（ステップＳ６６２５）。
【０５０６】
また、葉Ｌ♯の構造体から圧縮符号長ｌｅｇを抽出し（ステップＳ６６２６）、ビットアドレスａｂｉを更新する（ステップＳ６６２７）。このあと、メモリに圧縮符号列があるか否か、具体的には、マスクパターンによるマスク処理が施されていない圧縮符号列があるか否かを判断する（ステップＳ６６２８）。たとえば、バイトオフセットｂｙｏｓに該当するバイト位置があるか否かにより判断する。圧縮符号列がある場合（ステップＳ６６２８：Ｙｅｓ）、図６６−１のステップＳ６６１２に戻る。一方、圧縮符号列がない場合（ステップＳ６６２８：Ｎｏ）、一連の伸長処理を終了する。
【０５０７】
このような伸長処理により、圧縮符号列からｍビット単位で圧縮符号を抽出することができ、さらに、無節点ハフマン木Ｈ２の根の構造体セルＣ（１，１）にアクセスすることで、該当する枝番号となる葉Ｌ♯へのポインタを特定することができる。そして、アクセス先となる葉Ｌ♯の構造体から文字コードを抽出することで、圧縮符号を伸長する。このように、無節点ハフマン木Ｈ２は、内部節点を有していないため、葉Ｌ♯へのポインタが特定されれば、１パスで葉Ｌ♯の構造体にアクセスすることができ、伸長速度の高速化を図ることができる。
【０５０８】
（照合処理手順）
図６７−１および図６７−２は、照合処理手順を示すフローチャートである。まず、図６７−１において、図６５のステップＳ６５０３における特定圧縮ファイルｆｔのオープンが検出されるまで待ち受け（ステップＳ６７１１：Ｎｏ）、特定圧縮ファイルｆｔのオープンが検出された場合（ステップＳ６７１１：Ｙｅｓ）、Ｃ＝０、Ｓ＝０に設定する（ステップＳ６７１２）。Ｃは、伸長バッファ５１２０内の現在位置であり、Ｓは、検索キーワードを保持している入力バッファ５４００内の現在位置である。
【０５０９】
そして、図６６−２のステップＳ６６２３におけるポイント先となる葉Ｌ♯の構造体へのアクセスがあったか否かを判断する（ステップＳ６７１３）。アクセスがない場合（ステップＳ６７１３：Ｎｏ）、図６５のステップＳ６５０５において特定圧縮ファイルがクローズしたか否かを判断する（ステップＳ６７１４）。クローズしていない場合（ステップＳ６７１４：Ｎｏ）、ステップＳ６７１３に戻る。クローズした場合（ステップＳ６７１４：Ｙｅｓ）、照合処理を終了する。
【０５１０】
一方、葉Ｌ♯の構造体にアクセスがあった場合（ステップＳ６７１３：Ｙｅｓ）、アクセス先の葉Ｌ♯の構造体内の照合フラグがＯＮであるか否かを判断する（ステップＳ６７１５）。ＯＮでない場合（ステップＳ６７１５：Ｎｏ）、今回伸長バッファ５１２０に格納された伸長コード（アクセス先の葉Ｌ♯の構造体内の文字コードに一致）とは照合をおこなわないため、伸長バッファ５１２０内の現在位置Ｃに、今回伸長バッファ５１２０に格納された伸長コードの伸長コード長Ｌｃを加算することで、現在位置Ｃを更新する（ステップＳ６７１６）。これにより、再度、現在位置Ｃから照合をおこなうことができる。
【０５１１】
このあと、入力バッファ５４００内の現在位置ＳをＳ＝０、開始フラグＦｓをＦｓ＝０、開始フラグＦｓ＝１になったときの伸長バッファ５１２０の現在位置ＣｓをＣｓ＝０にして（ステップＳ６７１７）、ステップＳ６７１３に戻る。なお、開始フラグＦｓとは、検索キーワードの先頭文字の文字コードが一致したときに立てる（Ｆｓ＝１にする）フラグである。Ｃｓはそのときの現在位置Ｃである。これにより、図６２−２に示したような照合処理をおこなうことができる。一方、ステップＳ６７１５において、照合フラグがＯＮである場合（ステップＳ６７１５：Ｙｅｓ）、図６７−２のステップＳ６７２１に移行する。
【０５１２】
図６７−２において、照合対象を設定する（ステップＳ６７２１）。具体的には、検索キーワードの文字コード列のうち、現在位置Ｃから今回格納された伸長コードの文字コード長分の文字コードを、伸長コードとの照合対象に設定する。
【０５１３】
そして、位置Ｓからの伸長コードと位置Ｃからの照合対象の文字コードとを照合（一致判定）する（ステップＳ６７２２）。一致する場合（ステップＳ６７２２：Ｙｅｓ）、開始フラグＦｓがＦｓ＝１であるか否かを判断する（ステップＳ６７２３）。Ｆｓ＝１である場合（ステップＳ６７２３：Ｙｅｓ）、ステップＳ６７２６に移行する。一方、Ｆｓ＝１でない場合（ステップＳ６７２３：Ｎｏ）、開始フラグＦｓをＦｓ＝１にし（ステップＳ６７２４）、Ｃｓ＝Ｃに設定する（ステップＳ６７２５）。これにより、検索キーワードの先頭の文字コードと一致した伸長コードの位置を記憶することができる。
【０５１４】
ステップＳ６７２６において、入力バッファ５４００内の現在位置Ｓに今回伸長バッファ５１２０に格納された伸長コードの伸長コード長Ｌｃを加算することで、現在位置Ｓを更新する（ステップＳ６７２６）。そして、Ｓ＝Ｌｓであるか否かを判断する（ステップＳ６７２７）。Ｌｓは検索キーワードの文字コード長である。すなわち、現在位置Ｓが検索キーワードの末尾であるか否かを判断する。Ｓ＝Ｌｓである場合（ステップＳ６７２７：Ｙｅｓ）、検索キーワードと一致する文字列が伸長バッファ５１２０から得られたため、当該伸長コード列を文字列置換する（ステップＳ６７２８）。
【０５１５】
このあと、入力バッファ５４００内の現在位置ＳをＳ＝０、開始フラグＦｓをＦｓ＝０、開始フラグＦｓ＝１になったときの伸長バッファ５１２０の現在位置ＣｓをＣｓ＝０にする（ステップＳ６７２９）。そして、伸長バッファ５１２０内の現在位置Ｃを文字列置換後の最後尾に設定する（ステップＳ６７３０）。これにより、図６２−１に示したような照合処理をおこなうことができる。このあと、ステップＳ６７１３に戻る。
【０５１６】
また、ステップＳ６７２７において、Ｓ＝Ｌｓでない場合（ステップＳ６７２７：Ｎｏ）、伸長コード列の長さが検索キーワードの文字コード長に到達していないため、ステップＳ６７２８〜Ｓ６７３０を実行せずに、ステップＳ６７１３に戻る。
【０５１７】
また、ステップＳ６７２２において、位置Ｓからの伸長コードと位置Ｃからの照合対象の文字コードとが不一致である場合（ステップＳ６７２２：Ｎｏ）、伸長バッファ５１２０での現在位置ＣをＣ＝Ｃｓとし、入力バッファ５４００での現在位置ＳをＳ＝０にする（ステップＳ６７３１）。そして、ステップＳ６７２２と同様、照合対象を設定する（ステップＳ６７３２）。具体的には、検索キーワードの文字コード列のうち、現在位置Ｃ（Ｃ＝Ｃｓ）から今回格納された伸長コードの文字コード長分の文字コードを、伸長コードとの照合対象に設定する。これにより、図６２−３に示したような照合処理をおこなうことができる。
【０５１８】
このあと、ステップＳ６７２２と同様、位置Ｓからの伸長コードと位置Ｃからの照合対象の文字コードとを照合（一致判定）する（ステップＳ６７３３）。一致する場合（ステップＳ６７３３：Ｙｅｓ）、ステップＳ６７２３に移行する。
【０５１９】
一方、一致しない場合（ステップＳ６７３３：Ｎｏ）、入力バッファ５４００内の現在位置Ｓ（Ｓ＝０）に今回伸長バッファ５１２０に格納された伸長コードの伸長コード長Ｌｃを加算することで、現在位置Ｓを更新する（ステップＳ６７３４）。このあと、開始フラグＦｓをＦｓ＝０、ＣｓをＣｓ＝０にして（ステップＳ６７３５）、ステップＳ６７１３に移行する。
【０５２０】
このような照合処理により、伸長処理が終了してから照合するのではなく、伸長処理をしながら検索キーワードとの照合をおこなうことができ、照合処理の高速化を実現することができる。
【０５２１】
なお、上述した実施の形態では、グラム数ごとにｘグラム頭尾分割マップ群を生成することとしたが、２〜Ｘグラムまでのグラム数を包含する頭尾分割マップ群としてもよい。この場合、頭尾分割マップ群の数を削減することができるため、省メモリ化を図ることができる。
【０５２２】
なお、この場合、検索キーワードのグラム数ごとに頭尾分割マップ群を用いた絞込みができないこととなる。たとえば、検索キーワード「東京都」について、ある対象ファイルＦｐに、「東京」、「京都」、「東都」といった連字が存在する場合、それぞれの連字の連続グラム分割マップ群および「東都」の頭尾分割マップ群により、対象ファイルＦｐに「東京都」が存在しない場合でも特定圧縮ファイルｆｔになる。このような検索ノイズを回避するため、間引き処理をおこなう。
【０５２３】
図６８は、間引き処理を示す説明図である。間引き処理では、ポインタ分割処理において、各文字コードの圧縮符号マップへのポインタのアドレス値を間引いて、結合する。すなわち、２グラムの高位文字コードどうしの圧縮符号マップへのポインタを結合すると、結合したアドレス値が２０ビットとなる。間引き処理では、３グラム以上の場合でも、各文字の圧縮符号マップへのポインタのアドレス値を間引いて、合計で２０ビットとなるように設定する。
【０５２４】
図６８の（Ａ）は、３グラムの文字コード列「東京都」の間引き前の状態を示しており、（Ｂ）は、間引き後の状態を示している。図６８では、先頭の「東」は上位３ビット、真ん中の「京」は上位４ビット、末尾の「都」は上位３ビット間引いて、２０ビットとする。このあと、上述したように、間引き後のポインタ列について、上位５ビットどうし、上位５ビットと下位５ビット、下位５ビットと上位５ビット、下位５ビットどうしで分割をおこない、「東」、「京」、「都」を網羅する間引き分割マップ群を生成する。
【０５２５】
図６９は、間引き分割マップ群を用いた圧縮ファイル特定例を示す説明図である。このように、間引き分割マップ群を生成することで、検索ノイズの低減化を図ることができる。
【０５２６】
以上説明したように、本実施の形態によれば、文字種を約１３００に削減することでマップのサイズ縮小を図ることができる。また、文字種の削減により、無節点ハフマン木Ｈ２を生成することができる。この無節点ハフマン木Ｈ２を用いて圧縮伸長をおこなうことにより、１２ビット（つまり、１文字）をまとめて１回で判定することができ、圧縮処理や伸長処理の高速化を実現することができる。
【０５２７】
また、圧縮処理と圧縮符号マップ生成処理とをハフマン木探索で共通化することで、圧縮処理と連動して、圧縮符号マップ群Ｍｓの生成を並列実行することができる。したがって、プログラムステップと走行ステップの短縮化を図ることができ、対象ファイルＦｓの圧縮処理と圧縮符号マップ群Ｍｓの生成処理との高速化を図ることができる。また、出現頻度が低い低位文字コードは８ビットの分割文字コードに分割して圧縮処理が実行されるため、分割文字コードについても圧縮処理と連動して圧縮符号マップ群Ｍｓを生成することができる。
【０５２８】
圧縮符号マップ群Ｍｓのほか、さらに、対象ファイル群Ｆｓの圧縮処理と連動して、連続グラム分割マップ群やｘグラム頭尾分割マップ群の生成を並列実行するため、プログラムステップと走行ステップの短縮化を図ることができる。したがって、対象ファイルＦｓの圧縮処理と連続グラム分割マップ群やｘグラム頭尾分割マップ群の生成処理との高速化を図ることができる。
【０５２９】
また、連続グラムごとに連続グラム分割マップ群を生成することにより、マップサイズの大幅な縮小を図ることができ、かつ、ハッシュ関数の利用に比べ、検索ノイズを減少することができる。同様に、先頭グラムおよび末尾グラムの組み合わせごとにｘグラム頭尾分割マップ群を生成することにより、マップサイズの大幅な縮小を図ることができ、かつ、検索ノイズを減少することができる。
【０５３０】
また、圧縮符号マップ群Ｍｓの圧縮領域となるビット列を、該当する文字の出現率に応じた圧縮率で圧縮することで、圧縮効率の向上を図るとともに、サイズ縮小を図ることができる。また、圧縮符号マップ用ハフマン木４２００において、出現率領域に応じて、文字コードが存在しないことを意味する“０”の連続数を多くしている。したがって、文字コードの出現率に応じて圧縮符号マップＭｓの圧縮効率の向上を図ることができる。
【０５３１】
また、圧縮領域となるビット列の配列を先頭からファイル番号ｐの降順にすることで、対象ファイルが追加されても、ファイル番号の連続性を保持したまま、圧縮領域となるビット列を圧縮することができる。これにより、対象ファイルＦの追加機能と圧縮符号マップ群Ｍｓの圧縮機能のいずれかを選ぶことなく、両機能を実装することができる。したがって、対象ファイルの追加という自由度の向上と圧縮符号マップ群Ｍｓの圧縮というサイズ縮小を実現することができる。
【０５３２】
また、対象ファイルＦの削除の有無をあらわす削除マップＭｄを用いることで、圧縮符号マップ群を用いた圧縮ファイルの絞込み時において、削除された対象ファイルを絞り込みから除外することができる。これにより、圧縮ファイルの絞込み精度の向上を図るとともに、伸長処理の高速化を実現することができる。
【０５３３】
また、連続グラム分割マップ群およびｘグラム頭尾分割マップ群を用いて圧縮ファイル特定（絞込み）を実行することにより、検索ノイズの低減化を図ることができる。たとえば、検索キーワード「東京都」について、ある対象ファイルＦｐに、「東京」、「京都」といった連字が存在する場合、圧縮符号マップＭでは、圧縮ファイルｆｐが特定圧縮ファイルｆｔになるが、「東○都」といった３グラムの文字列（○は「京」以外の文字）が存在しないかぎり、圧縮ファイルｆｐが特定圧縮ファイルｆｔにならない。したがって、圧縮ファイル特定（絞込み）の低減化を図ることができる。
【０５３４】
また、伸長処理に連動して、検索キーワードとの照合を並列実行することにより、検索キーワードとの一致判定の高速化を実現することができる。すなわち、圧縮ファイルｆの伸長中に検索キーワードの一致判定をおこなっているため、圧縮ファイルが伸長された時点で、検索キーワードに一致する伸長コード列があるか否かがわかることとなる。
【０５３５】
また、照合に先立って、検索キーワードを構成する文字コードを格納する葉Ｌ♯の構造体の照合フラグをＯＮに設定することで、照合処理の際、照合フラグがＯＮである葉Ｌ♯の構造体から得られた伸長コードとの照合を回避することができる。したがって、一致しないと分かっている伸長コードとの照合を実行する必要がないため、照合処理の高速化を実現することができる。
【０５３６】
なお、上述した実施の形態では、対象ファイル群Ｆｓを圧縮した圧縮ファイルｆｓの絞込みについて説明したが、非圧縮の対象ファイル群Ｆｓの絞込みにも適用することができる。
【０５３７】
なお、本実施の形態で説明した情報処理方法は、あらかじめ用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。このプログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。またこのプログラムは、インターネット等のネットワークを介して配布することが可能な媒体であってもよい。
【０５３８】
上述した実施の形態に関し、さらに以下の付記を開示する。
【０５３９】
（付記１）コンピュータを、
文字コード列が記述されている対象ファイル群を記憶する記憶手段、
前記対象ファイル群の中から選ばれた一の対象ファイル内の連続する２グラムの文字コード列を構成する先行文字コードおよび後続文字コードの各識別情報のうち、少なくともいずれか一方の識別情報を２分割して前記他方の識別情報と組み合わせ、複数種類の組み合わせ識別情報を生成する生成手段、
前記生成手段によって生成された複数種類の組み合わせ識別情報に対して、前記対象ファイル群のファイル数分のビット列をそれぞれ割り当てて、複数種類の連続グラム分割マップとし、前記記憶手段に記憶するマップ特定手段、
前記マップ特定手段によって特定された複数種類の連続グラム分割マップにおいて、前記連続する２グラムの文字コード列の前記一の対象ファイルでの存否をあらわすビットを更新する更新手段、
として機能させることを特徴とする情報処理プログラム。
【０５４０】
（付記２）前記生成手段は、
前記一方の識別情報を２分割して前記他方の識別情報と結合して、２種類の組み合わせ識別情報を生成することを特徴とする付記１に記載の情報処理プログラム。
【０５４１】
（付記３）前記生成手段は、
前記先行文字コードの識別情報と前記後続文字コードの識別情報とをそれぞれ２分割して得られた４個の分割識別情報から２つ選んで結合した４種類の組み合わせ識別情報を生成することを特徴とする付記１に記載の情報処理プログラム。
【０５４２】
（付記４）コンピュータを、
文字コード列が記述されている対象ファイル群を記憶する記憶手段、
前記対象ファイル群から選ばれた一の対象ファイル内の連続する複数グラムの文字コード列を構成する先頭文字コードおよび末尾文字コードの各識別情報のうち、少なくともいずれか一方の識別情報を２分割して組み合わせ、複数種類の組み合わせ識別情報を生成する生成手段、
前記生成手段によって生成された複数種類の組み合わせ識別情報に対して、前記対象ファイル群のファイル数分のビット列をそれぞれ割り当てて、複数種類の頭尾分割マップとして、前記記憶手段に記憶するマップ特定手段、
前記マップ特定手段によって特定された複数種類の頭尾分割マップにおいて、前記複数グラムの文字コード列における前記先頭文字コードおよび前記末尾文字コードの組み合わせの前記一の対象ファイル群での存否をあらわすビットを更新する更新手段、
として機能させることを特徴とする情報処理プログラム。
【０５４３】
（付記５）前記生成手段は、
前記一方の識別情報を２分割して前記他方の識別情報と結合して、２種類の組み合わせ識別情報を生成することを特徴とする付記４に記載の情報処理プログラム。
【０５４４】
（付記６）前記生成手段は、
前記先頭文字コードの識別情報と前記末尾文字コードの識別情報とをそれぞれ２分割して得られた４個の分割識別情報から２つ選んで結合した４種類の組み合わせ識別情報を生成することを特徴とする付記４に記載の情報処理プログラム。
【０５４５】
（付記７）前記生成手段は、
さらに、前記一の対象ファイル内の連続する複数グラムの文字コード列を構成する先頭文字コードおよび末尾文字コードの各識別情報のうち、少なくともいずれか一方の識別情報を２分割して組み合わせ、複数種類の組み合わせ識別情報を生成し、
前記マップ特定手段は、
前記生成手段によって生成された前記先頭文字コードおよび末尾文字コードの識別情報に基づく複数種類の組み合わせ識別情報に対して、前記対象ファイル群のファイル数分のビット列をそれぞれ割り当てて、複数種類の頭尾分割マップとして、前記記憶手段に記憶し、
前記更新手段は、
さらに、前記マップ特定手段によって特定された複数種類の頭尾分割マップにおいて、前記複数グラムの文字コード列における前記先頭文字コードおよび前記末尾文字コードの組み合わせの前記一の対象ファイル群での存否をあらわすビットを更新することを特徴とする付記１に記載の情報処理プログラム。
【０５４６】
（付記８）前記生成手段は、
さらに、前記一の対象ファイル内の連続する複数グラムの文字コード列を構成する先頭文字コードおよび末尾文字コードの各識別情報のうち、前記一方の識別情報を２分割して前記他方の識別情報と結合して、２種類の組み合わせ識別情報を生成し、
前記マップ特定手段は、
さらに、前記生成手段によって生成された前記先頭文字コードおよび末尾文字コードの識別情報に基づく２種類の組み合わせ識別情報に対して、前記対象ファイル群のファイル数分のビット列をそれぞれ割り当てて、２種類の頭尾分割マップとして、前記記憶手段に記憶し、
前記更新手段は、
さらに、前記マップ特定手段によって特定された２種類の頭尾分割マップにおいて、前記複数グラムの文字コード列における前記先頭文字コードおよび前記末尾文字コードの組み合わせの前記一の対象ファイル群での存否をあらわすビットを更新することを特徴とする付記２に記載の情報処理プログラム。
【０５４７】
（付記９）前記生成手段は、
さらに、前記一の対象ファイル内の連続する複数グラムの文字コード列を構成する先頭文字コードおよび末尾文字コードの各識別情報のうち、前記先頭文字コードの識別情報と前記末尾文字コードの識別情報とをそれぞれ２分割して得られた４個の分割識別情報から２つ選んで結合した４種類の組み合わせ識別情報を生成し、
前記マップ特定手段は、
さらに、前記生成手段によって生成された前記先頭文字コードおよび末尾文字コードの識別情報に基づく４種類の組み合わせ識別情報に対して、前記対象ファイル群のファイル数分のビット列をそれぞれ割り当てて、４種類の頭尾分割マップとして、前記記憶手段に記憶し、
前記更新手段は、
さらに、前記マップ特定手段によって特定された４種類の頭尾分割マップにおいて、前記複数グラムの文字コード列における前記先頭文字コードおよび前記末尾文字コードの組み合わせの前記一の対象ファイル群での存否をあらわすビットを更新することを特徴とする付記３に記載の情報処理プログラム。
【０５４８】
（付記１０）コンピュータを、
文字コード列が記述されている対象ファイル群と、連続する２グラムの文字コード列ごとに設定された複数種類の組み合わせ識別情報に対して前記対象ファイル群のファイル数分のビット列がそれぞれ割り当てられた複数種類の連続グラム分割マップ群と、を記憶する記憶手段、
検索キーワードの入力を受け付ける入力手段、
前記入力手段によって入力された検索キーワードにおいて連続する２グラムの文字コード列を構成する先行文字コードおよび後続文字コードの各識別情報のうち、少なくともいずれか一方の識別情報を２分割して前記他方の識別情報と組み合わせ、複数種類の組み合わせ識別情報を生成する生成手段、
前記複数種類の連続グラム分割マップ群の中から、前記生成手段によって生成された複数種類の組み合わせ識別情報が割り当てられている複数種類の連続グラム分割マップを、前記検索キーワードにおいて連続する２グラムの文字コード列を構成する先行文字コードおよび後続文字コードごとに特定するマップ特定手段、
前記マップ特定手段によって前記検索キーワードにおいて連続する２グラムの文字コード列を構成する先行文字コードおよび後続文字コードごとに特定された複数種類の連続グラム分割マップ群に基づいて、前記検索キーワードにおいて連続する２グラムの文字コード列を構成する先行文字コードおよび後続文字コードがすべて存在する対象ファイルを前記対象ファイル群の中から特定するファイル特定手段、
として機能させることを特徴とする情報検索プログラム。
【０５４９】
（付記１１）前記対象ファイル群は、
用語に関する文字コード列の先頭に特殊な文字コードが記述されており、
前記入力手段は、
前方一致に関する検索条件の指定を受け付け、
前記生成手段は、
前記前方一致に関する検索条件の指定が受け付けられた場合、前記検索キーワードの先頭に前記特殊な文字コード列が追加された追加後の検索キーワードについて、当該追加後の検索キーワード内の先頭文字コードおよび末尾文字コードの各識別情報のうち、少なくともいずれか一方の識別情報を２分割して前記他方の識別情報と組み合わせ、複数種類の組み合わせ識別情報を生成し、
前記ファイル特定手段は、
前記マップ特定手段によって前記追加後の検索キーワードにおいて連続する２グラムの文字コード列を構成する先行文字コードおよび後続文字コードごとに特定された複数種類の連続グラム分割マップ群に基づいて、前記追加後の検索キーワードにおいて連続する２グラムの文字コード列を構成する先行文字コードおよび後続文字コードがすべて存在する対象ファイルを前記対象ファイル群の中から特定することを特徴とする付記１０に記載の情報検索プログラム。
【０５５０】
（付記１２）前記対象ファイル群は、
用語に関する文字コード列の末尾に特殊な文字コードが記述されており、
前記入力手段は、
後方一致に関する検索条件の指定を受け付け、
前記生成手段は、
前記後方一致に関する検索条件の指定が受け付けられた場合、前記検索キーワードの末尾に前記特殊な文字コード列が追加された追加後の検索キーワードについて、当該追加後の検索キーワード内の先頭文字コードおよび末尾文字コードの各識別情報のうち、少なくともいずれか一方の識別情報を２分割して前記他方の識別情報と組み合わせ、複数種類の組み合わせ識別情報を生成し、
前記ファイル特定手段は、
前記マップ特定手段によって前記追加後の検索キーワードにおいて連続する２グラムの文字コード列を構成する先行文字コードおよび後続文字コードごとに特定された複数種類の連続グラム分割マップ群に基づいて、前記追加後の検索キーワードにおいて連続する２グラムの文字コード列を構成する先行文字コードおよび後続文字コードがすべて存在する対象ファイルを前記対象ファイル群の中から特定することを特徴とする付記１０に記載の情報検索プログラム。
【０５５１】
（付記１３）コンピュータを、
文字コード列が記述されている対象ファイル群と、連続する複数グラムの文字コード列を構成する先頭文字コードおよび末尾文字コードの組み合わせごとに設定された複数種類の組み合わせ識別情報に対して前記対象ファイル群のファイル数分のビット列がそれぞれ割り当てられた複数種類の頭尾分割マップ群と、を記憶する記憶手段、
検索キーワードの入力を受け付ける入力手段、
前記入力手段によって入力された検索キーワード内の先頭文字コードおよび末尾文字コードの各識別情報のうち、少なくともいずれか一方の識別情報を２分割して前記他方の識別情報と組み合わせ、複数種類の組み合わせ識別情報を生成する生成手段、
前記複数種類の頭尾分割マップ群の中から、前記生成手段によって生成された複数種類の組み合わせ識別情報が割り当てられている複数種類の頭尾分割マップを特定するマップ特定手段、
前記マップ特定手段によって特定された複数種類の頭尾分割マップ群に基づいて、前記検索キーワードと同一グラム数であり、かつ、前記先頭文字コードおよび前記末尾文字コードが一致する文字コード列が存在する対象ファイルを前記対象ファイル群の中から特定するファイル特定手段、
として機能させることを特徴とする情報検索プログラム。
【０５５２】
（付記１４）前記生成手段は、
前記前方一致に関する検索条件の指定が受け付けられた場合、前記検索キーワードの先頭に前記特殊な文字コード列が追加された追加後の検索キーワードについて、当該追加後の検索キーワード内の先頭文字コードおよび末尾文字コードの各識別情報のうち、少なくともいずれか一方の識別情報を２分割して前記他方の識別情報と組み合わせ、複数種類の組み合わせ識別情報を生成し、
前記ファイル特定手段は、
前記マップ特定手段によって特定された複数種類の頭尾分割マップ群に基づいて、前記追加後の検索キーワードと同一グラム数であり、かつ、前記追加後の検索キーワードでの先頭文字コードおよび末尾文字コードが一致する文字コード列が存在する対象ファイルを前記対象ファイル群の中から特定することを特徴とする付記１３に記載の情報検索プログラム。
【０５５３】
（付記１５）前記対象ファイル群は、
用語に関する文字コード列の末尾に特殊な文字コードが記述されており、
前記入力手段は、
後方一致に関する検索条件の指定を受け付け、
前記生成手段は、
前記後方一致に関する検索条件の指定が受け付けられた場合、前記検索キーワードの末尾に前記特殊な文字コード列が追加された追加後の検索キーワードについて、当該追加後の検索キーワード内の先頭文字コードおよび末尾文字コードの各識別情報のうち、少なくともいずれか一方の識別情報を２分割して前記他方の識別情報と組み合わせ、複数種類の組み合わせ識別情報を生成し、
前記ファイル特定手段は、
前記マップ特定手段によって特定された複数種類の頭尾分割マップ群に基づいて、前記追加後の検索キーワードと同一グラム数であり、かつ、前記追加後の検索キーワードでの先頭文字コードおよび末尾文字コードが一致する文字コード列が存在する対象ファイルを前記対象ファイル群の中から特定することを特徴とする付記１３に記載の情報検索プログラム。
【０５５４】
（付記１６）前記記憶手段は、
さらに、連続する複数グラムの文字コード列を構成する先頭文字コードおよび末尾文字コードの組み合わせごとに設定された複数種類の組み合わせ識別情報に対して前記対象ファイル群のファイル数分のビット列がそれぞれ割り当てられた複数種類の頭尾分割マップ群を記憶しており、
前記生成手段は、
さらに、前記検索キーワード内の先頭文字コードおよび末尾文字コードの各識別情報のうち、少なくともいずれか一方の識別情報を２分割して前記他方の識別情報と組み合わせ、前記先頭文字コードおよび前記末尾文字コードに基づく複数種類の組み合わせ識別情報を生成し、
前記マップ特定手段は、
さらに、前記複数種類の頭尾分割マップ群の中から、前記生成手段によって生成された前記先頭文字コードおよび前記末尾文字コードに基づく複数種類の組み合わせ識別情報が割り当てられている複数種類の頭尾分割マップを特定し、
前記ファイル特定手段は、
前記マップ特定手段によって特定された複数種類の連続グラム分割マップ群および複数種類の頭尾分割マップ群に基づいて、前記検索キーワードにおいて連続する２グラムの文字コード列を構成する先行文字コードおよび後続文字コードがすべて存在するとともに、前記検索キーワードと同一グラム数であり、かつ、先頭文字コードおよび末尾文字コードが一致する文字コード列が存在する対象ファイルを前記対象ファイル群の中から特定することを特徴とする付記１０に記載の情報検索プログラム。
【０５５５】
（付記１７）前記生成手段は、
さらに、前記追加後の検索キーワード内の先頭文字コードおよび末尾文字コードの各識別情報のうち、少なくともいずれか一方の識別情報を２分割して前記他方の識別情報と組み合わせ、前記追加後の検索キーワード内の先頭文字コードおよび末尾文字コードに基づく複数種類の組み合わせ識別情報を生成し、
前記ファイル特定手段は、
前記マップ特定手段によって特定された複数種類の連続グラム分割マップ群および複数種類の頭尾分割マップ群に基づいて、前記追加後の検索キーワードにおいて連続する２グラムの文字コード列を構成する先行文字コードおよび後続文字コードがすべて存在するとともに、前記追加後の検索キーワードと同一グラム数であり、かつ、前記追加後の検索キーワードの先頭文字コードおよび末尾文字コードが一致する文字コード列が存在する対象ファイルを前記対象ファイル群の中から特定することを特徴とする付記１１に記載の情報検索プログラム。
【０５５６】
（付記１８）前記生成手段は、
さらに、前記追加後の検索キーワード内の先頭文字コードおよび末尾文字コードの各識別情報のうち、少なくともいずれか一方の識別情報を２分割して前記他方の識別情報と組み合わせ、前記追加後の検索キーワード内の先頭文字コードおよび末尾文字コードに基づく複数種類の組み合わせ識別情報を生成し、
前記ファイル特定手段は、
前記マップ特定手段によって特定された複数種類の連続グラム分割マップ群および複数種類の頭尾分割マップ群に基づいて、前記追加後の検索キーワードにおいて連続する２グラムの文字コード列を構成する先行文字コードおよび後続文字コードがすべて存在するとともに、前記追加後の検索キーワードと同一グラム数であり、かつ、前記追加後の検索キーワードの先頭文字コードおよび末尾文字コードが一致する文字コード列が存在する対象ファイルを前記対象ファイル群の中から特定することを特徴とする付記１２に記載の情報検索プログラム。
【０５５７】
（付記１９）文字コード列が記述されている対象ファイル群を記憶する記憶手段と、
前記対象ファイル群の中から選ばれた一の対象ファイル内の連続する２グラムの文字コード列を構成する先行文字コードおよび後続文字コードの各識別情報のうち、少なくともいずれか一方の識別情報を２分割して前記他方の識別情報と組み合わせ、複数種類の組み合わせ識別情報を生成する生成手段と、
前記生成手段によって生成された複数種類の組み合わせ識別情報に対して、前記対象ファイル群のファイル数分のビット列をそれぞれ割り当てて、複数種類の連続グラム分割マップとし、前記記憶手段に記憶するマップ特定手段と、
前記マップ特定手段によって特定された複数種類の連続グラム分割マップにおいて、前記連続する２グラムの文字コード列の前記一の対象ファイルでの存否をあらわすビットを更新する更新手段と、
を備えることを特徴とする情報処理装置。
【０５５８】
（付記２０）文字コード列が記述されている対象ファイル群を記憶する記憶手段と、
前記対象ファイル群から選ばれた一の対象ファイル内の連続する複数グラムの文字コード列を構成する先頭文字コードおよび末尾文字コードの各識別情報のうち、少なくともいずれか一方の識別情報を２分割して組み合わせ、複数種類の組み合わせ識別情報を生成する生成手段と、
前記生成手段によって生成された複数種類の組み合わせ識別情報に対して、前記対象ファイル群のファイル数分のビット列をそれぞれ割り当てて、複数種類の頭尾分割マップとして、前記記憶手段に記憶するマップ特定手段と、
前記マップ特定手段によって特定された複数種類の頭尾分割マップにおいて、前記複数グラムの文字コード列における前記先頭文字コードおよび前記末尾文字コードの組み合わせの前記一の対象ファイル群での存否をあらわすビットを更新する更新手段と、
を備えることを特徴とする情報処理装置。
【０５５９】
（付記２１）文字コード列が記述されている対象ファイル群と、連続する２グラムの文字コード列ごとに設定された複数種類の組み合わせ識別情報に対して前記対象ファイル群のファイル数分のビット列がそれぞれ割り当てられた複数種類の連続グラム分割マップ群と、を記憶する記憶手段と、
検索キーワードの入力を受け付ける入力手段と、
前記入力手段によって入力された検索キーワードにおいて連続する２グラムの文字コード列を構成する先行文字コードおよび後続文字コードの各識別情報のうち、少なくともいずれか一方の識別情報を２分割して前記他方の識別情報と組み合わせ、複数種類の組み合わせ識別情報を生成する生成手段と、
前記複数種類の連続グラム分割マップ群の中から、前記生成手段によって生成された複数種類の組み合わせ識別情報が割り当てられている複数種類の連続グラム分割マップを、前記検索キーワードにおいて連続する２グラムの文字コード列を構成する先行文字コードおよび後続文字コードごとに特定するマップ特定手段と、
前記マップ特定手段によって前記検索キーワードにおいて連続する２グラムの文字コード列を構成する先行文字コードおよび後続文字コードごとに特定された複数種類の連続グラム分割マップ群に基づいて、前記検索キーワードにおいて連続する２グラムの文字コード列を構成する先行文字コードおよび後続文字コードがすべて存在する対象ファイルを前記対象ファイル群の中から特定するファイル特定手段と、
を備えることを特徴とする情報検索装置。
【０５６０】
（付記２２）文字コード列が記述されている対象ファイル群と、連続する複数グラムの文字コード列を構成する先頭文字コードおよび末尾文字コードの組み合わせごとに設定された複数種類の組み合わせ識別情報に対して前記対象ファイル群のファイル数分のビット列がそれぞれ割り当てられた複数種類の頭尾分割マップ群と、を記憶する記憶手段と、
検索キーワードの入力を受け付ける入力手段と、
前記入力手段によって入力された検索キーワード内の先頭文字コードおよび末尾文字コードの各識別情報のうち、少なくともいずれか一方の識別情報を２分割して前記他方の識別情報と組み合わせ、複数種類の組み合わせ識別情報を生成する生成手段と、
前記複数種類の頭尾分割マップ群の中から、前記生成手段によって生成された複数種類の組み合わせ識別情報が割り当てられている複数種類の頭尾分割マップを特定するマップ特定手段と、
前記マップ特定手段によって特定された複数種類の頭尾分割マップ群に基づいて、前記検索キーワードと同一グラム数であり、かつ、前記先頭文字コードおよび前記末尾文字コードが一致する文字コード列が存在する対象ファイルを前記対象ファイル群の中から特定するファイル特定手段と、
を備えることを特徴とする情報検索装置。
【符号の説明】
【０５６１】
５００  情報処理装置
５０１  入力部
５０２  取得部
５０３  集計部
５０４  ソート部
５０５  分割部
５０６  分類部
５０７  算出部
５０８  ポインタ生成部
５０９  ポインタ格納部
５１０  葉生成部
５１１  文字コード格納部
５１２  検出部
５１３  特定部
５１４  最適化部
５１５  文字構造体生成部
５２０  算出結果テーブル
５３０  文字構造体
６００  文字出現頻度集計テーブル
３２０１  設定部
３２０２  圧縮対象文字コード探索部
３２０３  ハフマン木探索部
３２０４  圧縮符号格納部
３２０５  検出部
３２０６  圧縮符号マップ特定部
３２０７  圧縮符号マップ更新部
３２０８  圧縮符号マップ圧縮部
３２５６  生成部
３２８１  ビット列圧縮部
３２８２  非圧縮領域設定部
５１００  情報検索装置
５１０１  入力部
５１０２  検索キーワード圧縮部
５１０３  圧縮符号マップ伸長部
５１０４  圧縮符号マップ特定部
５１０５  圧縮ファイル特定部
５１０６  照合フラグ設定部
５１０７  抽出部
５１０８  葉特定部
５１０９  伸長コード格納部
５１１０  照合部
５１１１  文字列置換部
５１１２  出力部
５１４５  生成部
【図１】
0005418218.tif 000002
【図２−１】
0005418218.tif 000003
【図２−２】
0005418218.tif 000004
【図３】
0005418218.tif 000005
【図４】
0005418218.tif 000006
【図５】
0005418218.tif 000007
【図６】
0005418218.tif 000008
【図７】
0005418218.tif 000009
【図８】
0005418218.tif 000010
【図９−１】
0005418218.tif 000011
【図９−２】
0005418218.tif 000012
【図９−３】
0005418218.tif 000013
【図１０】
0005418218.tif 000014
【図１１】
0005418218.tif 000015
【図１２】
0005418218.tif 000016
【図１３−１】
0005418218.tif 000017
【図１３−２】
0005418218.tif 000018
【図１３−３】
0005418218.tif 000019
【図１４】
0005418218.tif 000020
【図１５】
0005418218.tif 000021
【図１６】
0005418218.tif 000022
【図１７】
0005418218.tif 000023
【図１８】
0005418218.tif 000024
【図１９】
0005418218.tif 000025
【図２０】
0005418218.tif 000026
【図２１】
0005418218.tif 000027
【図２２】
0005418218.tif 000028
【図２３】
0005418218.tif 000029
【図２４】
0005418218.tif 000030
【図２５】
0005418218.tif 000031
【図２６】
0005418218.tif 000032
【図２７】
0005418218.tif 000033
【図２８】
0005418218.tif 000034
【図２９】
0005418218.tif 000035
【図３０】
0005418218.tif 000036
【図３１−１】
0005418218.tif 000037
【図３１−２】
0005418218.tif 000038
【図３２】
0005418218.tif 000039
【図３３−１】
0005418218.tif 000040
【図３３−２】
0005418218.tif 000041
【図３４】
0005418218.tif 000042
【図３５】
0005418218.tif 000043
【図３６】
0005418218.tif 000044
【図３７】
0005418218.tif 000045
【図３８】
0005418218.tif 000046
【図３９−１】
0005418218.tif 000047
【図３９−２】
0005418218.tif 000048
【図４０】
0005418218.tif 000049
【図４１】
0005418218.tif 000050
【図４２−１】
0005418218.tif 000051
【図４２−２】
0005418218.tif 000052
【図４２−３】
0005418218.tif 000053
【図４２−４】
0005418218.tif 000054
【図４２−５】
0005418218.tif 000055
【図４２−６】
0005418218.tif 000056
【図４２−７】
0005418218.tif 000057
【図４２−８】
0005418218.tif 000058
【図４２−９】
0005418218.tif 000059
【図４２−１０】
0005418218.tif 000060
【図４２−１１】
0005418218.tif 000061
【図４２−１２】
0005418218.tif 000062
【図４２−１３】
0005418218.tif 000063
【図４２−１４】
0005418218.tif 000064
【図４２−１５】
0005418218.tif 000065
【図４３−１】
0005418218.tif 000066
【図４３−２】
0005418218.tif 000067
【図４３−３】
0005418218.tif 000068
【図４３−４】
0005418218.tif 000069
【図４３−５】
0005418218.tif 000070
【図４３−６】
0005418218.tif 000071
【図４３−７】
0005418218.tif 000072
【図４３−８】
0005418218.tif 000073
【図４３−９】
0005418218.tif 000074
【図４３−１０】
0005418218.tif 000075
【図４３−１１】
0005418218.tif 000076
【図４３−１２】
0005418218.tif 000077
【図４３−１３】
0005418218.tif 000078
【図４３−１４】
0005418218.tif 000079
【図４３−１５】
0005418218.tif 000080
【図４３−１６】
0005418218.tif 000081
【図４３−１７】
0005418218.tif 000082
【図４３−１８】
0005418218.tif 000083
【図４３−１９】
0005418218.tif 000084
【図４３−２０】
0005418218.tif 000085
【図４３−２１】
0005418218.tif 000086
【図４３−２２】
0005418218.tif 000087
【図４３−２３】
0005418218.tif 000088
【図４３−２４】
0005418218.tif 000089
【図４３−２５】
0005418218.tif 000090
【図４３−２６】
0005418218.tif 000091
【図４３−２７】
0005418218.tif 000092
【図４３−２８】
0005418218.tif 000093
【図４３−２９】
0005418218.tif 000094
【図４３−３０】
0005418218.tif 000095
【図４３−３１】
0005418218.tif 000096
【図４３−３２】
0005418218.tif 000097
【図４４−１】
0005418218.tif 000098
【図４４−２】
0005418218.tif 000099
【図４４−３】
0005418218.tif 000100
【図４４−４】
0005418218.tif 000101
【図４４−５】
0005418218.tif 000102
【図４４−６】
0005418218.tif 000103
【図４４−７】
0005418218.tif 000104
【図４４−８】
0005418218.tif 000105
【図４４−９】
0005418218.tif 000106
【図４４−１０】
0005418218.tif 000107
【図４５−１】
0005418218.tif 000108
【図４５−２】
0005418218.tif 000109
【図４５−３】
0005418218.tif 000110
【図４５−４】
0005418218.tif 000111
【図４６−１】
0005418218.tif 000112
【図４６−２】
0005418218.tif 000113
【図４６−３】
0005418218.tif 000114
【図４６−４】
0005418218.tif 000115
【図４６−５】
0005418218.tif 000116
【図４７−１】
0005418218.tif 000117
【図４７−２】
0005418218.tif 000118
【図４８−１】
0005418218.tif 000119
【図４８−２】
0005418218.tif 000120
【図４８−３】
0005418218.tif 000121
【図４８−４】
0005418218.tif 000122
【図４９】
0005418218.tif 000123
【図５０】
0005418218.tif 000124
【図５１】
0005418218.tif 000125
【図５２】
0005418218.tif 000126
【図５３】
0005418218.tif 000127
【図５４】
0005418218.tif 000128
【図５５】
0005418218.tif 000129
【図５６】
0005418218.tif 000130
【図５７】
0005418218.tif 000131
【図５８】
0005418218.tif 000132
【図５９】
0005418218.tif 000133
【図６０−１】
0005418218.tif 000134
【図６０−２】
0005418218.tif 000135
【図６０−３】
0005418218.tif 000136
【図６１−１】
0005418218.tif 000137
【図６１−２】
0005418218.tif 000138
【図６１−３】
0005418218.tif 000139
【図６１−４】
0005418218.tif 000140
【図６１−５】
0005418218.tif 000141
【図６２−１】
0005418218.tif 000142
【図６２−２】
0005418218.tif 000143
【図６２−３】
0005418218.tif 000144
【図６３】
0005418218.tif 000145
【図６４−１】
0005418218.tif 000146
【図６４−２】
0005418218.tif 000147
【図６４−３】
0005418218.tif 000148
【図６４−４】
0005418218.tif 000149
【図６４−５】
0005418218.tif 000150
【図６４−６】
0005418218.tif 000151
【図６５】
0005418218.tif 000152
【図６６−１】
0005418218.tif 000153
【図６６−２】
0005418218.tif 000154
【図６７−１】
0005418218.tif 000155
【図６７−２】
0005418218.tif 000156
【図６８】
0005418218.tif 000157
【図６９】
0005418218.tif 000158