(57)【要約】【課題】圧縮符号マップ群を圧縮処理と連動して生成することにより、生成処理の効率化を図ること。【解決手段】（１）対象ファイル群Ｆｓ内に出現する文字の出現頻度を集計する。（２）集計結果１０を用いて２ｎ分枝ハフマン木Ｈ１を生成する。（３）２ｎ分枝ハフマン木Ｈ１を２ｍ分枝の無節点ハフマン木Ｈ２に変換する。（４）対象ファイル群Ｆｓを１ファイルずつ読み込んで無節点ハフマン木により圧縮符号を探索する。（５）探索された圧縮符号を並べてファイル化することで対象ファイル群Ｆｓを圧縮する。（６）並行して、圧縮符号マップ群Ｍｓを生成する。圧縮符号マップ群Ｍｓを用いることで、検索キーワードを構成する文字を含む圧縮ファイル群ｆｓを伸長せずに絞り込むことができる。【選択図】図１
2011100320.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータを、
文字コードごとに当該文字コードの対象ファイル群での存否をあらわすビット列を有する圧縮符号マップ群と、前記文字コードに対応する葉に当該文字コードの圧縮符号マップへのポインタが格納されており前記文字コードを当該文字コードの圧縮符号に変換するハフマン木とを記憶する記憶手段、
前記対象ファイル群の中から選ばれた対象ファイルに記述されている圧縮対象文字コードを前記ハフマン木に従って順次圧縮する圧縮手段、
前記圧縮手段によってアクセスされた前記ハフマン木の葉を検出する検出手段、
前記検出手段によって検出された葉に格納されているポインタにより、前記圧縮符号マップ群のうち、前記圧縮対象文字コードの圧縮符号マップを特定する圧縮符号マップ特定手段、
前記圧縮符号マップ特定手段によって特定された圧縮符号マップでの前記圧縮対象文字コードの存否をあらわすビットを更新する更新手段、
として機能させることを特徴とする情報処理プログラム。
【請求項２】
前記記憶手段は、
前記文字コード、当該文字コードの圧縮符号、および前記文字コードの前記圧縮符号マップへのポインタを格納する葉と前記葉の数に応じた長さとなる葉へのポインタが前記各葉に対する枝として前記文字コードの出現率に応じた個数分割り当てられている根とを有する無節点ハフマン木と、前記文字コードごとに当該文字コードを格納する葉の構造体へのポインタを有する文字構造体と、を記憶しており、
前記圧縮手段は、
前記圧縮対象文字コードを前記文字構造体から探索して、前記圧縮対象文字コードを格納する葉へのポインタを前記文字構造体から抽出する圧縮対象文字コード探索手段と、
前記圧縮対象文字コード探索手段によって抽出された前記圧縮対象文字コードを格納する葉へのポインタを取得して、前記無節点ハフマン木のうち前記圧縮対象文字コードを格納する葉を指定し、当該指定された葉から前記圧縮対象文字コードの圧縮符号を抽出するハフマン木探索手段と、
前記ハフマン木探索手段によって抽出された圧縮符号を所定の記憶領域に格納する圧縮符号格納手段と、を備え、
前記検出手段は、
前記ハフマン木探索手段による前記葉への指定を検出し、
前記圧縮符号マップ特定手段は、
前記検出手段によって前記葉への指定が検出された場合、当該指定された葉に格納されている圧縮符号マップへのポインタを取得して、ポイント先となる圧縮符号マップを前記圧縮符号マップ群から特定することを特徴とする請求項１に記載の情報処理プログラム。
【請求項３】
前記記憶手段は、
節点の階層数がｋ階層（ｋはｋ≧２の自然数）、節点からその下位節点への枝数が２ｎ本（ｎはｎ≧２の自然数）、第ｉ階層（ｉは１≦ｉ≦ｋの自然数）の節点数が２ｎ（ｉ−１）であり、前記各節点が上位節点へのポインタを格納しており、かつ、葉または下位節点への２ｎ個のポインタを格納可能な節点集合を記憶しており、
前記コンピュータを、
前記対象ファイルに記述されている文字コードの出現頻度の集計結果を取得する取得手段、
前記取得手段によって取得された集計結果に基づいて、前記文字コードを出現確率Ｐ（Ｐは１／２ｎｉ≦Ｐ＜１／２ｎ（ｉ−１）。ただし、ｉ＝１のときは１／２ｎｉ≦Ｐ＜１、ｉ＝ｎのときはＰ＜１／２ｎ（ｉ−１））に応じて階層別に分類する分類手段、
前記分類手段によって分類された前記第ｉ階層の文字コード数に基づいて、前記第ｉ階層の葉へのポインタ数を算出するとともに、当該第ｉ階層の葉へのポインタ数に基づいて、（ｉ＋１）階層の節点をリンク先とする前記第ｉ階層の下位節点へのポインタ数と前記第ｉ階層の節点の使用数とを算出する算出手段、
前記算出手段によって算出された算出結果に基づいて、２ｎ分枝ハフマン木を生成する２ｎ分枝ハフマン木生成手段、
前記２ｎ分枝ハフマン木生成手段によって生成された２ｎ分枝ハフマン木を、２ｍ分枝（ただし、ｍ＝ｎ×ｋ）の無節点ハフマン木に変換して、前記記憶手段に記憶する変換手段、
として機能させることを特徴とする請求項２に記載の情報処理プログラム。
【請求項４】
前記コンピュータを、
前記圧縮対象文字コードをビット数が同数となるように２つに分割する分割手段として機能させ、
前記圧縮符号マップ群は、
出現頻度が所定頻度以上の高位文字コードごとに当該文字コードの対象ファイル群での存否をあらわすビット列を有する圧縮符号マップと、出現頻度が前記所定頻度未満の低位文字コードを分割した分割文字コードの前記対象ファイル群での存否をあらわすビット列を有する圧縮符号マップとを有し、
前記無節点ハフマン木は、
前記高位文字コード、当該高位文字コードの圧縮符号、および前記高位文字コードの前記対象ファイル群での存否をあらわす圧縮符号マップへのポインタを格納する葉と、前記分割文字コード、当該分割文字コードの圧縮符号、および前記分割文字コードの前記対象ファイル群での存否をあらわす圧縮符号マップへのポインタを格納する葉と、前記葉へのポインタを格納する根とを有し、
前記文字構造体は、
前記高位文字コードごとに当該高位文字コードを格納する葉の構造体へのポインタを有する高位文字コード構造体と、前記分割文字コードごとに当該分割文字コードを格納する葉へのポインタを有する分割文字コード構造体とを有し、
前記分割手段は、
前記圧縮対象文字コード探索手段により、前記圧縮対象文字コードが前記高位文字コード構造体になかった場合、前記圧縮対象文字コードを分割して、上位の圧縮対象分割文字コードと下位の圧縮対象分割文字コードを生成し、
前記圧縮対象文字コード探索手段は、
前記分割手段によって分割された圧縮対象分割文字コードごとに当該圧縮対象文字コードを前記分割文字コード構造体から探索して、前記圧縮対象分割文字コードを格納する葉へのポインタを前記分割文字コード構造体から抽出し、
前記ハフマン木探索手段は、
前記圧縮対象文字コード探索手段によって抽出された前記圧縮対象分割文字コードを格納する葉へのポインタを取得して、前記圧縮対象分割文字コードを格納する葉を指定し、当該指定された葉から前記圧縮対象分割文字コードの圧縮符号を抽出し、
前記圧縮符号格納手段は、
前記ハフマン木探索手段によって抽出された前記分割文字コードの圧縮符号を前記所定の記憶領域に格納することを特徴とする請求項２に記載の情報処理プログラム。
【請求項５】
コンピュータを、
文字コードごとに当該文字コードの対象ファイル群での存否をあらわすビット列を有する圧縮符号マップ群と、前記文字コード、当該文字コードの圧縮符号、および前記文字コードの前記対象ファイル群での存否をあらわす圧縮符号マップへのポインタを格納する葉と前記葉の数に応じた長さとなる葉へのポインタが前記各葉に対する枝として前記文字コードの出現率に応じた個数分割り当てられている根とを有する無節点ハフマン木と、前記文字コードごとに当該文字コードを格納する葉の構造体へのポインタを有する文字構造体と、前記無節点ハフマン木を用いて前記対象ファイル群から圧縮された圧縮ファイル群と、を記憶する記憶手段、
検索キーワードの入力を受け付ける入力手段、
前記文字構造体を参照して、前記入力手段によって入力された検索キーワードを構成する文字コードごとに葉へのポインタを取得して、当該葉へのポインタにより葉にアクセスして、当該アクセス先の葉に格納されている圧縮符号を抽出する検索キーワード圧縮手段、
前記アクセス先の葉に格納されている圧縮符号マップへのポインタを取得して、前記検索キーワードを構成する文字コードごとに圧縮符号マップを特定する圧縮符号マップ特定手段、
前記圧縮符号マップ特定手段によって特定された圧縮符号マップを参照することにより、前記検索キーワードを構成する文字コードごとに、前記圧縮ファイル群の中から、前記検索キーワードを構成する文字コードが存在する対象ファイルの圧縮ファイルを特定する圧縮ファイル特定手段、
前記圧縮ファイル特定手段によって特定された圧縮ファイルの中から前記葉へのポインタと同じ長さとなる圧縮符号列を抽出する抽出手段、
前記抽出手段によって抽出された圧縮符号列と一致する葉へのポインタを前記無節点ハフマン木の根から特定し、前記抽出された圧縮符号列と一致する葉へのポインタのポイント先となる葉を特定する葉特定手段、
前記葉特定手段によって特定された葉の中の文字コードを伸長コードとして抽出して、前記所定の記憶領域に格納する伸長コード格納手段、
として機能させることを特徴とする情報検索プログラム。
【請求項６】
文字コードごとに当該文字コードの対象ファイル群での存否をあらわすビット列を有する圧縮符号マップ群と、前記文字コードに対応する葉に当該文字コードの圧縮符号マップへのポインタが格納されており前記文字コードを当該文字コードの圧縮符号に変換するハフマン木とを記憶する記憶手段と、
前記対象ファイル群の中から選ばれた対象ファイルに記述されている圧縮対象文字コードを前記ハフマン木に従って順次圧縮する圧縮手段と、
前記圧縮手段による前記ハフマン木の葉へのアクセスを検出する検出手段と、
前記検出手段によって検出された葉に格納されているポインタにより、前記圧縮符号マップ群のうち、前記圧縮対象文字コードの圧縮符号マップを特定する圧縮符号マップ特定手段と、
前記圧縮符号マップ特定手段によって特定された圧縮符号マップでの前記圧縮対象文字コードの存否をあらわすビットを更新する更新手段と、
を備えることを特徴とする情報処理装置。
【請求項７】
文字コードごとに当該文字コードの対象ファイル群での存否をあらわすビット列を有する圧縮符号マップ群と、前記文字コード、当該文字コードの圧縮符号、および前記文字コードの前記対象ファイル群での存否をあらわす圧縮符号マップへのポインタを格納する葉と前記葉の数に応じた長さとなる葉へのポインタが前記各葉に対する枝として前記文字コードの出現率に応じた個数分割り当てられている根とを有する無節点ハフマン木と、前記文字コードごとに当該文字コードを格納する葉の構造体へのポインタを有する文字構造体と、前記無節点ハフマン木を用いて前記対象ファイル群から圧縮された圧縮ファイル群と、を記憶する記憶手段と、
検索キーワードの入力を受け付ける入力手段と、
前記文字構造体を参照して、前記入力手段によって入力された検索キーワードを構成する文字コードごとに葉へのポインタを取得して、当該葉へのポインタにより葉にアクセスして、当該アクセス先の葉に格納されている圧縮符号を抽出する検索キーワード圧縮手段と、
前記アクセス先の葉に格納されている圧縮符号マップへのポインタを取得して、前記検索キーワードを構成する文字コードごとに圧縮符号マップを特定する圧縮符号マップ特定手段と、
前記圧縮符号マップ特定手段によって特定された圧縮符号マップを参照することにより、前記検索キーワードを構成する文字コードごとに、前記圧縮ファイル群の中から、前記検索キーワードを構成する文字コードが存在する対象ファイルの圧縮ファイルを特定する圧縮ファイル特定手段と、
前記圧縮ファイル特定手段によって特定された圧縮ファイルの中から前記葉へのポインタと同じ長さとなる圧縮符号列を抽出する抽出手段と、
前記抽出手段によって抽出された圧縮符号列と一致する葉へのポインタを前記無節点ハフマン木の根から特定し、前記抽出された圧縮符号列と一致する葉へのポインタのポイント先となる葉を特定する葉特定手段と、
前記葉特定手段によって特定された葉の中の文字コードを伸長コードとして抽出して、前記所定の記憶領域に格納する伸長コード格納手段と、
を備えることを特徴とする情報検索装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ハフマン木を用いた情報の圧縮、伸長をおこなう情報処理プログラム、情報検索プログラム、情報処理装置、および情報検索装置に関する。
【背景技術】
【０００２】
従来において、文字と該文字を含む文書との対応付けを示す文字成分表と、文書から付属語を除いて作成した凝縮本文と文書とを対応付けて格納した凝縮本文ファイルとを備える検索技術がある。当該検索技術では、文字成分表を参照し、検索キーワードに含まれる文字に対応する文書を特定し、文字成分表を参照するステップの実行結果に応じて、凝縮本文ファイル中の凝縮本文から検索キーワードを含む文書を特定する（たとえば、下記特許文献１を参照）。
【０００３】
また、リアルタイム処理要求を受け付けつけたら直ちに受け付け完了として、ユーザからの処理要求を受け付けることが可能であり、リアルタイムの処理としてインデックスファイルを作成中でも、インデックスファイルの検索とリアルタイム処理データの検索の両方を行ない結果を照合する検索技術が開示されている（たとえば、下記特許文献２を参照）。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特許第２９８６８６５号公報
【特許文献２】特許第３０２４５４４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、上述した従来技術では、膨大な数（たとえば、１万個）の文書ファイルで構成されたコンテンツについて、６４Ｋ種の１６ビット文字コードの文字コードで文字成分表を作成している。一方、文書ファイルのリード速度を短縮するため、膨大な数の文書ファイルを圧縮している。その圧縮処理と文字成分表の作成処理とは、同じ文書ファイルを使用するにもかかわらず、共通点がない。したがって、圧縮処理と作成処理とを別々に実行しなければならず、処理時間が増大するという問題があった。
【０００６】
この発明は、上述した従来技術による問題点を解消するため、対象ファイルの圧縮処理と対象ファイル内の文字の存否を示す表の作成処理との共通化により高速化を図ることができる情報処理プログラム、情報検索プログラム、情報処理装置、および情報検索装置を提供することを目的とする。
【課題を解決するための手段】
【０００７】
本発明の一観点によれば、文字コードごとに当該文字コードの対象ファイル群での存否をあらわすビット列を有する圧縮符号マップ群と、前記文字コードに対応する葉に当該文字コードの圧縮符号マップへのポインタが格納されており前記文字コードを当該文字コードの圧縮符号に変換するハフマン木とを記憶し、前記対象ファイル群の中から選ばれた対象ファイルに記述されている圧縮対象文字コードを前記ハフマン木に従って順次圧縮し、アクセスされた前記ハフマン木の葉を検出し、検出された葉に格納されているポインタにより、前記圧縮符号マップ群のうち、前記圧縮対象文字コードの圧縮符号マップを特定し、特定された圧縮符号マップでの前記圧縮対象文字コードの存否をあらわすビットを更新する情報処理プログラムおよび情報処理装置が提供される。
【０００８】
本発明の他の観点によれば、文字コードごとに当該文字コードの対象ファイル群での存否をあらわすビット列を有する圧縮符号マップ群と、前記文字コード、当該文字コードの圧縮符号、および前記文字コードの前記対象ファイル群での存否をあらわす圧縮符号マップへのポインタを格納する葉と、一つの根から前記の葉の数に応じた枝に関して前記文字コードの出現率に応じた個数分のポインタで構成される無節点ハフマン木と、前記文字コードごとに当該文字コードを格納する葉の構造体へのポインタを有する文字構造体と、前記無節点ハフマン木を用いて前記対象ファイル群から圧縮された圧縮ファイル群と、を記憶し、検索キーワードの入力を受け付け、前記文字構造体を参照して、入力された検索キーワードを構成する文字コードごとに葉へのポインタを取得して、当該葉へのポインタにより葉にアクセスして、当該アクセス先の葉に格納されている圧縮符号マップへのポインタを取得して、前記検索キーワードを構成する文字コードごとに圧縮符号マップを特定し、特定された圧縮符号マップを参照することにより、前記検索キーワードを構成する文字コードごとに、前記圧縮ファイル群の中から、前記検索キーワードを構成する文字コードが存在する対象ファイルの圧縮ファイルを特定し、特定された圧縮ファイルの中から固定長にて圧縮符号列を抽出し、圧縮符号列に該当する葉へのポインタを前記無節点ハフマン木の根から特定し、前記抽出された圧縮符号列と一致する葉の構造体を特定し、特定された葉の構造体中の文字コードを伸長コードとして抽出して、前記所定の記憶領域に格納する、あるいは、前記検索キーワードと前記葉の構造体中の照合文字列と照合する、あるいは、照合後に前記葉の構造体中の置換文字列と置換する情報検索プログラムおよび情報検索装置が提供される。
【発明の効果】
【０００９】
開示の情報処理プログラムおよび情報処理装置によれば、対象ファイルの圧縮処理と連動して、圧縮符号マップ群の生成を並列実行することができるため、対象ファイルの圧縮処理と圧縮符号マップ群の生成処理との高速化を図ることができることができるという効果を奏する。
【００１０】
開示の情報検索プログラムおよび情報検索装置によれば、圧縮ファイルの伸長処理に連動して、検索キーワードとの照合を並列実行することにより、検索キーワードとの一致判定との高速化を実現することができるという効果を奏する。
【図面の簡単な説明】
【００１１】
【図１】対象ファイルの圧縮までの処理の流れを示す説明図である。
【図２−１】２ｎ分枝ハフマン木の生成元となる節点集合体を示す説明図である。
【図２−２】２ｎ分枝ハフマン木を示す説明図である。
【図３】圧縮前処理を示す説明図である。
【図４】実施の形態にかかる情報処理装置のハードウェア構成を示すブロック図である。
【図５】実施の形態にかかる情報処理装置の機能的構成１を示すブロック図である。
【図６】文字出現頻度集計テーブルを示す説明図である。
【図７】予約語出現頻度集計テーブルを示す説明図である。
【図８】文字コードおよび予約語の出現頻度を統合した集計結果テーブルを示す説明図である。
【図９−１】分割文字出現頻度集計テーブルを示す説明図である。
【図９−２】上位８ビットに関する分割文字出現頻度集計テーブルを示す説明図である。
【図９−３】下位８ビットに関する分割文字出現頻度集計テーブルを示す説明図である。
【図１０】算出部５０７による算出結果テーブルを示す説明図である。
【図１１】２ｎ分枝ハフマン木の構造体を示す説明図である。
【図１２】２ｎ分枝ハフマン木の構造体を示す説明図である。
【図１３−１】第４階層から第３階層へ最適化する場合の算出結果テーブルの更新例を示す説明図である。
【図１３−２】第３階層から第２階層へ最適化する場合の算出結果テーブルの更新例を示す説明図である。
【図１３−３】第２階層から第１階層へ最適化する場合の算出結果テーブルの更新例を示す説明図である。
【図１４】最適化後の２ｎ分枝ハフマン木の構造体を示す説明図である。
【図１５】最適化後の２ｎ分枝ハフマン木における葉の構造体が格納する情報を示す説明図である。
【図１６】予約語の構造体を示す説明図である。
【図１７】高位文字コードの構造体を示す説明図である。
【図１８】分割文字コードの構造体を示す説明図である。
【図１９】情報処理装置が自動実行する２ｎ分枝ハフマン木生成処理手順を示すフローチャートである。
【図２０】図１９に示した葉数削減処理（ステップＳ１９０３）の詳細な処理手順を示すフローチャートである。
【図２１】図１９に示したパラメータ算出処理（ステップＳ１９０５）の詳細な処理手順を示すフローチャートである。
【図２２】図１９に示した構造体セル構築処理（ステップＳ１９０６）の詳細な処理手順を示すフローチャートである。
【図２３】図２２に示した第ｉ階層の構造体セルＣ（ｉ，ｊ）の構築処理（ステップＳ２２０４）の詳細な処理手順を示すフローチャート（前半）である。
【図２４】図２２に示した第ｉ階層の構造体セルＣ（ｉ，ｊ）の構築処理（ステップＳ２２０４）の詳細な処理手順を示すフローチャート（後半）である。
【図２５】図１９に示した最適化処理（ステップＳ１９０７）の詳細な処理手順を示すフローチャートである。
【図２６】２ｍ分枝の無節点ハフマン木を示す説明図である。
【図２７】２ｍ分枝の無節点ハフマン木の節点（根）の構造体を示す説明図である。
【図２８】無節点ハフマン木の葉の構造体を示す説明図である。
【図２９】葉の構造体に格納される情報を示す説明図である。
【図３０】実施の形態にかかる情報処理装置の機能的構成２を示すブロック図である。
【図３１−１】情報処理装置が自動実行する２ｎ分枝ハフマン木→２ｍ分枝無節点ハフマン木変換処理手順を示すフローチャートである。
【図３１−２】図３１−１に示した圧縮符号マップへのポインタ設定処理（ステップＳ３１１０）の詳細な処理手順を示すフローチャートである。
【図３２】実施の形態にかかる情報処理装置の機能的構成３を示すブロック図である。
【図３３−１】圧縮対象文字コード列の一例を示す説明図である。
【図３３−２】圧縮符号列の一例を示す説明図である。
【図３４】２ｍ分枝の無節点ハフマン木を用いた圧縮処理の具体例を示す説明図である。
【図３５】情報処理装置が自動実行する２ｍ分枝の無節点ハフマン木Ｈ２を用いたファイル圧縮処理手順を示すフローチャートである。
【図３６】図３５に示した圧縮処理（ステップＳ３５０３）の詳細な処理手順を示すフローチャート（その１）である。
【図３７】図３５に示した圧縮処理（ステップＳ３５０３）の詳細な処理手順を示すフローチャート（その２）である。
【図３８】図３５に示した圧縮処理（ステップＳ３５０３）の詳細な処理手順を示すフローチャート（その３）である。
【図３９−１】圧縮符号マップ群の初期状態を示す説明図である。
【図３９−２】圧縮符号マップ更新部による更新後の圧縮符号マップ群を示す説明図である。
【図４０】出現率と出現率領域との関係を示す説明図である。
【図４１】出現率領域別の圧縮パターンを有する圧縮パターンテーブルを示す説明図である。
【図４２−１】Ｂ領域およびＢ´領域の場合の圧縮パターンを示す説明図である。
【図４２−２】Ｃ領域およびＣ´領域の場合の圧縮パターンを示す説明図である。
【図４２−３】Ｄ領域およびＤ´領域の場合の圧縮パターンを示す説明図である。
【図４２−４】Ｅ領域およびＥ´領域の場合の圧縮パターンを示す説明図である。
【図４３】圧縮された圧縮符号マップ群を示す説明図である。
【図４４】圧縮された圧縮符号マップ群へのビット列追加を示す説明図である。
【図４５】削除マップを示す説明図である。
【図４６】圧縮符号マップ生成処理手順を示すフローチャートである。
【図４７】圧縮符号マップ圧縮処理手順を示すフローチャートである。
【図４８】追加ファイル圧縮処理手順を示すフローチャートである。
【図４９】削除マップ更新処理手順を示すフローチャートである。
【図５０】圧縮ファイルの検索と対象ファイルへの伸長までの処理の流れを示す説明図である。
【図５１】実施の形態にかかる情報検索装置の機能的構成を示すブロック図である。
【図５２】圧縮ファイル特定部による特定例を示す説明図である。
【図５３−１】抽出部、葉特定部および伸長コード格納部による２ｍ分枝の無節点ハフマン木を用いた伸長処理の具体例（その１）を示す説明図である。
【図５３−２】抽出部、葉特定部および伸長コード格納部による２ｍ分枝の無節点ハフマン木を用いた伸長処理の具体例（その２）を示す説明図である。
【図５３−３】抽出部、葉特定部および伸長コード格納部による２ｍ分枝の無節点ハフマン木を用いた伸長処理の具体例（その３）を示す説明図である。
【図５３−４】抽出部、葉特定部および伸長コード格納部による２ｍ分枝の無節点ハフマン木を用いた伸長処理の具体例（その４）を示す説明図である。
【図５３−５】抽出部、葉特定部および伸長コード格納部による２ｍ分枝の無節点ハフマン木を用いた伸長処理の具体例（その５）を示す説明図である。
【図５４−１】照合処理の具体例（その１）を示す説明図である。
【図５４−２】照合処理の具体例（その２）を示す説明図である。
【図５４−３】照合処理の具体例（その３）を示す説明図である。
【図５５】検索キーワード圧縮処理手順を示すフローチャートである。
【図５６】ファイル絞込み処理手順を示すフローチャートである。
【図５７】図５６に示したアクセス先の圧縮符号マップ伸長処理（ステップＳ５６０５）の詳細な処理手順を示すフローチャートである。
【図５８】特定圧縮ファイル伸長処理手順を示すフローチャートである。
【図５９】無節点ハフマン木を用いた伸長処理手順を示すフローチャート（その１）である。
【図６０】無節点ハフマン木を用いた伸長処理手順を示すフローチャート（その２）である。
【図６１】照合処理手順を示すフローチャート（その１）である。
【図６２】照合処理手順を示すフローチャート（その２）である。
【発明を実施するための形態】
【００１２】
以下に添付図面を参照して、情報処理プログラム、情報検索プログラム、情報処理装置、および情報検索装置の好適な実施の形態を詳細に説明する。まず、本実施の形態にかかる２ｎ分枝ハフマン木について説明する。
【００１３】
＜対象ファイルの圧縮までの処理の流れ＞
図１は、対象ファイルの圧縮までの処理の流れを示す説明図である。本実施の形態では、まず、（１）情報処理装置が、対象ファイル群Ｆｓを読み込んで対象ファイル群Ｆｓ内に出現する文字の出現頻度を集計する。対象ファイル群Ｆｓは、数千〜数万種の文字（厳密には文字コード）が記述されている電子文書である。
【００１４】
対象ファイル群Ｆｓは文字コードが含まれていれば、テキスト形式でもよく、ＨＴＭＬ（ＨｙｐｅｒＴｅｘｔ  Ｍａｒｋｕｐ  Ｌａｎｇｕａｇｅ）やＸＭＬ（Ｅｘｔｅｎｓｉｂｌｅ  Ｍａｒｋｕｐ  Ｌａｎｇｕａｇｅ）で記述されていてもよい。対象ファイル群Ｆｓとしては、たとえば、国語辞典、外国語辞典（英和や和英など）、専門用語辞典などの辞書データやＷｅｂページを適用することができる。
【００１５】
出現頻度とは、文字が出現する回数である。たとえば、対象ファイル群Ｆｓのファイル数が３個（Ｆ１〜Ｆ３）であり、ある文字Ｘの出現回数が対象ファイルＦ１で２回、対象ファイルＦ２で３回、対象ファイルＦ３で０回の場合、文字Ｘの出現頻度は５である。文字ごとに集計された出現頻度を集計結果１０とする。
【００１６】
つぎに、（２）情報処理装置が、集計結果１０を用いて２ｎ分枝ハフマン木Ｈ１を生成する。２ｎ分枝ハフマン木Ｈ１とは、節点からその下位節点への枝数が２ｎ本のハフマン木である。ｎはｎ≧２の自然数である。節点の階層数はｋ（ｋはｋ≧２の自然数）である。また、第ｉ階層（ｉは１≦ｉ≦ｋの自然数）の節点数は２ｎ（ｉ−１）である。各節点が上位節点へのポインタを格納している。
【００１７】
また、各節点は、２ｎ個の葉または下位節点への２ｎ個のポインタを格納可能である。本実施の形態では、日本語の漢字等は１６ビットコードで表現されるため、１６ビットの文字コードを圧縮／伸長の対象とする場合はｎ＝４、ｋ＝４として説明する。２ｎ分枝ハフマン木Ｈ１の詳細については、図２−１および図２−２において後述する。
【００１８】
つぎに、（３）情報処理装置は、２ｎ分枝ハフマン木Ｈ１を２ｍ分枝の無節点ハフマン木Ｈ２に変換する。無節点ハフマン木Ｈ２とは、根と葉のみからなる内部節点のないハフマン木である。無節点ハフマン木Ｈ２は、枝の本数が多くなるが、根から１パスで葉にアクセスすることができるハフマン木である。無節点ハフマン木Ｈ２の詳細については、図２６において後述する。
【００１９】
このあと、（４）情報処理装置は、対象ファイル群Ｆｓを１ファイルずつ読み込んで無節点ハフマン木により圧縮符号を探索する。そして、（５）探索された圧縮符号を並べてファイル化することで対象ファイル群Ｆｓを圧縮する。これにより、圧縮ファイル群ｆｓが得られることとなる。
【００２０】
また、（６）上記（５）の処理と並行して、圧縮符号マップ群Ｍｓを生成する。圧縮符号マップ群Ｍｓとは、圧縮符号マップＭの集合であり、圧縮符号マップＭとは、対象ファイル群Ｆｓでの各文字の存否を文字ごとに示すテーブルである。圧縮符号マップ群Ｍｓを用いることにより、検索キーワードを構成する文字を含む圧縮ファイル群ｆｓを絞り込むことができる。圧縮符号マップ群Ｍｓは、具体的には、たとえば、ＲＡＭ、磁気ディスク、光ディスクなどの記憶媒体に記憶されており、ＣＰＵがアクセス可能である。
【００２１】
圧縮符号マップ群Ｍｓは、具体的には、文字ごとの対象ファイル数分のビット列により構成されている。たとえば、文字Ｘについてファイル番号＃に対応するビットの値が「１」であれば、文字ＸはファイルＦ♯に存在することを示す。一方、文字Ｘについてファイル番号＃に対応するビットの値が「０」であれば、文字ＸはファイルＦ♯に存在しないことを示す。圧縮符号マップ群Ｍｓの詳細については、図３９−１および図３９−２において後述する。
【００２２】
＜２ｎ分枝ハフマン木の内容＞
図２−１は、２ｎ（ｎ＝４により２ｎ＝１６）分枝ハフマン木の生成元となる節点集合体を示す説明図である。図２−１の節点集合体１００において、第１階層では１個の節点の構造体セル、第２階層では１６個の節点の構造体セル、第３階層では２５６個の節点の構造体セル、第４階層では４０９６個の節点の構造体セルを有する。各構造体セルＣ（ｉ，ｊ）は、リンク元となる上位節点のポインタを格納している。最上位となる第１階層の節点の構造体Ｃ（１，１）は、根の構造体であるため、上位節点のポインタはない。
【００２３】
図２−２は、２ｎ分枝ハフマン木を示す説明図である。図２−２では、ｎ＝４、すなわち、１６分枝ハフマン木である。２ｎ分枝ハフマン木は、具体的には、たとえば、ＲＡＭ、磁気ディスク、光ディスクなどの記憶媒体に記憶されており、ＣＰＵがアクセス可能である。
【００２４】
２ｎ分枝ハフマン木Ｈ１において、根は図２−１の第１階層の節点の構造体セルＣ（１，１）に相当する。また、（Ａ）〜（Ｃ）は節点または葉を示している。図２−２中、□は葉を示しており、■は節点を示している。下位節点／葉に枝が出ていない■は、使用されない節点である。また、葉の直下の数字は、葉の番号を示している。以降、葉をＬ♯（♯は葉の番号）と表記する。
【００２５】
すなわち、（Ａ）の□は第１階層の根からリンクする葉Ｌ１〜Ｌ３である。また、■は根からリンクする第２階層の節点であり、節点の構造体セルＣ（２，４）〜Ｃ（２，１６）に相当する。（Ｂ）の□は第２階層の節点からリンクする葉Ｌ４〜Ｌ１３４である。また、■は根からリンクする第３階層の節点であり、節点の構造体セルＣ（３，１３５）〜Ｃ（３，２５６）に相当する。（Ｃ）の□は第３階層の節点からリンクする葉Ｌ１３５〜Ｌ１２９５である。また、■は根からリンクする第４階層の節点であり、節点の構造体セルＣ（４，１２９６）〜Ｃ（４，４０９６）に相当する。つぎに、圧縮の前処理について説明する。
【００２６】
＜圧縮前処理＞
図３は、圧縮前処理を示す説明図である。対象ファイル群Ｆｓには数千〜数万種の文字が記述されており、本プログラムでは、対象ファイル群Ｆｓ内の文字コードについて出現頻度を集計して降順にソートする。そして、高位（たとえば、１〜１０２４位まで）の文字コードと低位（１０２５位以下）の文字コードに分ける。
【００２７】
高位の文字コードは出現頻度が高いため、１６ビットコードとして圧縮符号を割り当てる。低位の文字コードは、上位８ビットと下位８ビットに分割する。１６ビットコードでは最大で６５５３６（２５６×２５６）種の文字を扱えるが、低位の文字コードを、８ビットで分割することにより、６万種以上ある低位の文字コードを２５６種の分割文字コードに抑えることができる。
【００２８】
たとえば、漢字の「兎」の１６ビットの文字コードは“０ｘ５１４Ｅ”であるため、上位８ビット“０ｘ５１”と下位８ビット“０ｘ４Ｅ”に分割する。同様に、漢字の「兆」の１６ビットの文字コードは“０ｘ５１４６”であるため、上位８ビット“０ｘ５１”と下位８ビット“０ｘ４６”に分割する。そして、分割された８ビットの分割文字コードの出現頻度を集計する。この「兎」および「兆」の例では、分割文字コード“０ｘ５１”の出現頻度は２回、分割文字コード“０ｘ４Ｅ”，“０ｘ４６”は１回となる。
【００２９】
また、＜ｐ＞や＜ｐ／＞といったタグなどを予約語とする。予約語は数十種決めておく。そして、高位文字コード群、分割文字コード群および予約語群を混在させて出現頻度を再集計し、出現頻度の降順に再ソートする。これにより、出現頻度の降順にソートされた約１３００種の文字コードが得られる。文字コード種をこの程度の数に抑えることで、１６ビットの文字コードを１２ビット以下の圧縮符号に圧縮し、圧縮符号を１６ビットの文字コードに伸長することが可能となる。
【００３０】
＜情報処理装置のハードウェア構成＞
図４は、実施の形態にかかる情報処理装置のハードウェア構成を示すブロック図である。図４において、情報処理装置は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）４０１と、ＲＯＭ（Ｒｅａｄ‐Ｏｎｌｙ  Ｍｅｍｏｒｙ）４０２と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）４０３と、磁気ディスクドライブ４０４と、磁気ディスク４０５と、光ディスクドライブ４０６と、光ディスク４０７と、ディスプレイ４０８と、Ｉ／Ｆ（Ｉｎｔｅｒｆａｃｅ）４０９と、キーボード４１０と、マウス４１１と、スキャナ４１２と、プリンタ４１３と、を備えている。また、各構成部はバス４００によってそれぞれ接続されている。
【００３１】
ここで、ＣＰＵ４０１は、情報処理装置の全体の制御を司る。ＲＯＭ４０２は、ブートプログラムなどのプログラムを記憶している。ＲＡＭ４０３は、ＣＰＵ４０１のワークエリアとして使用される。磁気ディスクドライブ４０４は、ＣＰＵ４０１の制御にしたがって磁気ディスク４０５に対するデータのリード／ライトを制御する。磁気ディスク４０５は、磁気ディスクドライブ４０４の制御で書き込まれたデータを記憶する。
【００３２】
光ディスクドライブ４０６は、ＣＰＵ４０１の制御にしたがって光ディスク４０７に対するデータのリード／ライトを制御する。光ディスク４０７は、光ディスクドライブ４０６の制御で書き込まれたデータを記憶したり、光ディスク４０７に記憶されたデータをコンピュータに読み取らせたりする。
【００３３】
ディスプレイ４０８は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。このディスプレイ４０８は、たとえば、ＣＲＴ、ＴＦＴ液晶ディスプレイ、プラズマディスプレイなどを採用することができる。
【００３４】
インターフェース（以下、「Ｉ／Ｆ」と略する。）４０９は、通信回線を通じてＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどのネットワーク４１４に接続され、このネットワーク４１４を介して他の装置に接続される。そして、Ｉ／Ｆ４０９は、ネットワーク４１４と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。Ｉ／Ｆ４０９には、たとえばモデムやＬＡＮアダプタなどを採用することができる。
【００３５】
キーボード４１０は、文字、数字、各種指示などの入力のためのキーを備え、データの入力をおこなう。また、タッチパネル式の入力パッドやテンキーなどであってもよい。マウス４１１は、カーソルの移動や範囲選択、あるいはウィンドウの移動やサイズの変更などをおこなう。ポインティングデバイスとして同様に機能を備えるものであれば、トラックボールやジョイスティックなどであってもよい。
【００３６】
スキャナ４１２は、画像を光学的に読み取り、情報処理装置内に画像データを取り込む。なお、スキャナ４１２は、ＯＣＲ（Ｏｐｔｉｃａｌ  Ｃｈａｒａｃｔｅｒ  Ｒｅａｄｅｒ）機能を持たせてもよい。また、プリンタ４１３は、画像データや文書データを印刷する。プリンタ４１３には、たとえば、レーザプリンタやインクジェットプリンタを採用することができる。
【００３７】
＜情報処理装置の機能的構成１＞
図５は、実施の形態にかかる情報処理装置の機能的構成１を示すブロック図である。図５では、図１に示した処理の流れ（１）〜（６）のうち、（１）および（２）の処理を実行する機能的構成を示している。図５において、情報処理装置５００は、入力部５０１と、取得部５０２と、分類部５０６と、算出部５０７と、２ｎ分枝ハフマン木生成部（ポインタ生成部５０８、ポインタ格納部５０９、葉生成部５１０、文字コード格納部５１１）と、検出部５１２と、特定部５１３と、最適化部５１４と、文字構造体生成部５１５と、を備えている。
【００３８】
入力部５０１〜文字構造体生成部５１５は、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶されたプログラムをＣＰＵ４０１に実行させることにより、または、Ｉ／Ｆ４０９により、その機能を実現する。
【００３９】
入力部５０１は、対象ファイル群Ｆｓから文字コードを入力する機能を有する。具体的には、たとえば、ＣＰＵ４０１が対象ファイル群Ｆｓを走査して２ｎビットの文字コードを順次対象ファイル群Ｆｓから読み出す。読み出された文字コードはＣＰＵ４０１内のレジスタに保持される。
【００４０】
取得部５０２は、対象ファイル群Ｆｓに記述されている２ｎビットの文字コードの出現頻度の集計結果を取得する機能を有する。集計結果さえ取得できれば、集計結果自体を直接読み込んでもよく、また、入力部５０１によりレジスタにセットされる文字コードを順次集計してもよい。後者の場合、取得部５０２は、具体的には、たとえば、集計部５０３とソート部５０４とを有する。集計部５０３は、レジスタにセットされる文字コードの数を集計する。たとえば、ＣＰＵ４０１がレジスタにセットされる文字コードと一致する文字コードについて文字出現頻度集計テーブルの計数値をインクリメントする。
【００４１】
図６は、文字出現頻度集計テーブルを示す説明図である。文字出現頻度集計テーブル６００は、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶されており、ＣＰＵ４０１がアクセス可能である。文字出現頻度集計テーブル６００は、文字ごとに計数値を記憶する。文字項目は実際には説明の便宜上、各種文字が割り当てられているが、実際には入力文字コードと比較するため文字コードが割り当てられている。すなわち、ＣＰＵ４０１は、入力文字コードを文字項目で走査することで一致する文字コードを検出する。そして、検出された場合に計数値を１ポイントインクリメントする。
【００４２】
図７は、予約語出現頻度集計テーブルを示す説明図である。予約語出現頻度集計テーブル７００も、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶されており、ＣＰＵ４０１がアクセス可能である。予約語出現頻度集計テーブル７００は、予約語ごとに計数値を記憶する。予約語項目は説明の便宜上、各種文字が割り当てられているが、実際には入力文字コードと比較するため文字コード列が割り当てられている。すなわち、図６に示した文字出現頻度集計テーブル６００との照合に先立って、ＣＰＵ４０１は、入力文字コードを予約語項目で走査することで一致する文字コードを検出する。
【００４３】
一致する場合は、次の入力文字コードを予約語項目で走査する。これを繰り返し、一致する文字コード列が検出された場合、その予約語の文字コード列の計数値を１ポイントインクリメントする。不一致の文字コードが出現した場合は、文字出現頻度集計テーブル６００にアクセスして、これまで一致した文字コード列の各文字コードの計数値を１ポイントインクリメントする。そして、不一致となった文字コードについては、上述したように、文字出現頻度集計テーブル６００を用いて集計する。
【００４４】
図５に戻って、ソート部５０４は、集計結果をソートする機能を有する。具体的には、たとえば、ＣＰＵ４０１は、文字出現頻度集計テーブル６００の文字（文字コード）や予約語出現頻度集計テーブル７００の予約語を計数値の降順にソートする。
【００４５】
図８は、文字コードおよび予約語の出現頻度を統合した集計結果テーブルを示す説明図である。集計結果テーブル８００では、出現頻度（計数値）の降順に文字コードまたは予約語がソートされている。集計結果テーブル８００も、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶されており、ＣＰＵ４０１がアクセス可能である。
【００４６】
取得部５０２では、さらに、文字コードまたは予約語ごとに出現率を計算し、出現率に応じた出現率領域を特定する。出現率とは、対象ファイル群Ｆｓ内の全ファイル数を母集団（分母）とし、当該文字コードまたは予約語が存在するファイル数を分子とした値である。出現率領域とは、出現率の範囲をあらわす情報であり、圧縮符号マップ群Ｍｓの圧縮に用いられるハフマン木（以下、「圧縮符号マップ用ハフマン木」）を特定する。出現率領域および圧縮符号マップ用ハフマン木については後述する（図４２−１〜図４２−４を参照。）。
【００４７】
分割部５０５は、ソート部５０４によってソートされた結果、文字コードのうち出現頻度の高位の文字コードと低位の文字コードとに分け、低位の文字コードを上位ビットコードと下位ビットコードに分割する機能を有する。具体的には、たとえば、文字出現頻度集計テーブル６００の文字（コード）を計数値の降順にソートした結果、たとえば、１位〜１０２４位までの文字コードを高位文字コードとし、１０２５位以降の文字コードを低位文字コードとする。ＣＰＵ４０１は、この低位文字コードを、図３の例１）や例２）に示したように、上位８ビットコードと下位８ビットコードに分割する。
【００４８】
上位８ビットコードや下位８ビットコードといった分割文字コードは、最大２５６種となる。１６ビットコードでは最大６万種以上の文字が割り当てられ、同数の葉が必要となるが、出現順位の低い低位文字コードを分割することで、１０２５位以降の最大約６万種の文字コードを、たかだか２５６種の分割文字コードで表現できる。したがって、文字コードに割り当てる葉の数を大幅に削減（１０２４＋２５６＋予約語数十種）することができる。この場合、集計部５０３は、分割文字コードの出現頻度を再集計する。さらに、分割文字コードが上位８ビットに出現した出現頻度と下位８ビットに出現した出現頻度に分けて再集計する。
【００４９】
図９−１は、分割文字出現頻度集計テーブルを示す説明図である。分割文字出現頻度集計テーブル９０１も、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶されており、ＣＰＵ４０１がアクセス可能である。そして、ソート部５０４では、１６ビットである高位文字コード、予約語、分割文字コード（以下、「文字コード等」という）を統合して、図８に示した集計結果テーブル８００を更新する。
【００５０】
図９−２は、上位８ビットに関する分割文字出現頻度集計テーブルを示す説明図である。分割文字出現頻度集計テーブル９０２も、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶されており、ＣＰＵ４０１がアクセス可能である。分割文字出現頻度集計テーブル９０２は、圧縮符号マップ群Ｍｓの生成に用いられる。
【００５１】
図９−３は、下位８ビットに関する分割文字出現頻度集計テーブルを示す説明図である。分割文字出現頻度集計テーブル９０３も、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶されており、ＣＰＵ４０１がアクセス可能である。分割文字出現頻度集計テーブル９０３は、圧縮符号マップ群Ｍｓの生成に用いられる。
【００５２】
分類部５０６は、取得部５０２によって取得された集計結果に基づいて、文字コード等を出現確率Ｐに応じて階層別に分類する機能を有する。具体的には、たとえば、文字出現頻度集計テーブル６００を参照して、文字コード等を出現確率Ｐに応じて階層別に分類する。
【００５３】
ここで、出現確率Ｐとは、文字コード等の総数を、対象となる文字コード等の出現数（文字出現頻度集計テーブル６００の計数値）で除算した値である。ＣＰＵ４０１は、各文字コード等の出現確率Ｐを算出する。そして、算出された出現確率Ｐを階層別に分類する。たとえば、第ｉ階層の場合、１／２ｎｉ≦Ｐ＜１／２ｎ（ｉ−１）となる文字コードでグループ化する。ただし、第１階層（ｉ＝１）のときは１／２ｎｉ≦Ｐ＜１、第ｎ階層（ｉ＝ｎ）のときはＰ＜１／２ｎ（ｉ−１）でグループ化する。
【００５４】
たとえば、ｎ＝４の場合、第１階層の文字コード等は、出現確率Ｐが１／１６≦Ｐ＜１となる文字コードである。また、第２階層の文字コード等は、１／３２≦Ｐ＜１／１６となる文字コードである。また、第３階層の文字コード等は、１／４０９６≦Ｐ＜１／３２となる文字コードである。また、第４階層の文字コード等は、Ｐ＜１／４０９６となる文字コードである。分類結果である階層番号ｉや集計結果テーブル８００における順位は、文字コード等ごとに付与される。集計結果テーブル８００における順位は、その文字コード等の葉の番号となる。
【００５５】
算出部５０７は、分類部５０６によって分類された第ｉ階層の文字コード数に基づいて、第ｉ階層の葉へのポインタ数を算出する機能を有する。また、当該第ｉ階層の葉へのポインタ数に基づいて、（ｉ＋１）階層の節点をリンク先とする第ｉ階層の下位節点へのポインタ数と第ｉ階層の節点の使用数とを算出する機能を有する。
【００５６】
具体的には、たとえば、ＣＰＵ４０１は、節点集合体１００と分類結果から、第ｉ階層について、構造体セル数Ｎ（ｉ）、葉の数Ｎｌ（ｉ）、葉へのポインタ数Ｎｌｐ（ｉ）、下位節点へのポインタ数Ｎｎｐ（ｉ）、構造体セル使用数Ｎｃｕ（ｉ）、葉へのポインタ数の累計値ΣＮｌｐ（ｉ）、先頭からの空きセル数Ｎｃｓｔ（ｉ）、末尾までの空きポインタ数Ｎｐｓｅ（ｉ）、末尾までの空きセル数Ｎｃｓｅ（ｉ）を算出する。
【００５７】
図１０は、算出部５０７による算出結果テーブルを示す説明図である。算出結果テーブル５２０も、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶されており、ＣＰＵ４０１がアクセス可能である。算出結果テーブル５２０には、階層ごとに算出された各項目の値がＣＰＵ４０１により書き込まれる。図１０では、ｎ＝４の場合の算出結果を示している。
【００５８】
構造体セル数Ｎ（ｉ）とは、第ｉ階層の節点の構造体セルＣ（ｉ，ｊ）の個数である。構造体セル数Ｎ（ｉ）は、ＣＰＵ４０１が節点集合体１００の各階層の節点の構造体セルＣ（ｉ，ｊ）の個数を計数することで得られる。ｎ＝４の場合、第１階層は１個（根）、第２階層は１６個、第３階層は２５６個、第４階層は４０９６個である。
【００５９】
葉の数Ｎｌ（ｉ）とは、第ｉ階層の葉の構造体の個数である。葉の数Ｎｌ（ｉ）は、分類結果である階層ごとの文字コード数となる。図１０の例では、第１階層は３個、第２階層は５４個、第３階層は３５３個、第４階層は８８５個である。
【００６０】
葉へのポインタ数Ｎｌｐ（ｉ）とは、第ｉ階層の節点の構造体セルＣ（ｉ，ｊ）に格納する葉へのポインタの総数である。葉へのポインタ数Ｎｌｐ（ｉ）は葉の数Ｎｌ（ｉ）と同数である。
【００６１】
下位節点へのポインタ数Ｎｎｐ（ｉ）とは、第ｉ階層の節点の構造体セルＣ（ｉ，ｊ）に格納する下位節点へのポインタの総数である。下位節点をポイントするため、第（ｉ＋１）階層の葉へのポインタ数Ｎｌｐ（ｉ＋１）と下位節点へのポインタ数Ｎｎｐ（ｉ＋１）に依存する。たとえば、ＣＰＵ４０１は、下記式（１）により、下位節点へのポインタ数Ｎｎｐ（ｉ）を算出する。
【００６２】
Ｎｎｐ（ｉ）＝｛Ｎｌｐ（ｉ＋１）＋Ｎｎｐ（ｉ＋１）｝／２ｎ＋１・・・（１）
ただし、端数は切り捨て。また、ｉ＝ｎのときは、下位節点が存在しないため、Ｎｎｐ（ｉ）＝０。
【００６３】
構造体セル使用数Ｎｃｕ（ｉ）とは、第ｉ階層において、構造体セルＣ（ｉ，ｊ）のうち、葉へのポインタおよび下位節点へのポインタが格納される構造体セルＣ（ｉ，ｊ）の総数である。たとえば、ＣＰＵ４０１は、下記式（２）により、構造体セル使用数Ｎｃｕ（ｉ）を算出する。
【００６４】
Ｎｃｕ（ｉ）＝｛Ｎｌｐ（ｉ）＋Ｎｎｐ（ｉ）｝／２ｎ＋１・・・（２）
ただし、端数は切り捨て。
【００６５】
葉へのポインタ数の累計値ΣＮｌｐ（ｉ）とは、第１階層から第ｉ階層までの葉へのポインタ数Ｎｌｐ（ｉ）の総和である。
【００６６】
先頭からの空きセル数Ｎｃｓｔ（ｉ）とは、第ｉ階層の先頭となる構造体セルＣ（ｉ、１）からの不使用セル数である。もともと節点集合体１００を構成する構造体セルＣ（ｉ，ｊ）には、それぞれ上位節点へのポインタが格納されているが、その上位節点の構造体セルＣ（ｉ−１，ｊ）が葉Ｌｊの構造体とリンクすると、葉Ｌｊの構造体には、構造体セルＣ（ｉ，ｊ）と同一の上位節点へのポインタが格納されることとなる。
【００６７】
このように、ポインタが重複するため、葉Ｌｊの構造体に格納される上位節点へのポインタを優先するために、先頭からの空きセル数Ｎｃｓｔ（ｉ）を計算する。具体的には、たとえば、ＣＰＵ４０１は、下記式（３）により、先頭からの空きセル数Ｎｃｓｔ（ｉ）を算出する。
【００６８】
Ｎｃｓｔ（ｉ）＝ΣＮｌｐ（ｉ−１）・・・（３）
ただし、ｉ＝１のときは、Ｎｃｓｔ（ｉ）＝０。
【００６９】
したがって、図１０の例では、第２階層では、構造体セルＣ（２，１）〜Ｃ（２，３）が先頭からの空きセル（不使用セル）となる。また、第３階層では、構造体セルＣ（３，１）〜Ｃ（３，５７）が先頭からの空きセル（不使用セル）となる。同様に、第４階層では、構造体セルＣ（４，１）〜Ｃ（４，４１０）が先頭からの空きセル（不使用セル）となる。
【００７０】
末尾までの空きポインタ数Ｎｐｓｅ（ｉ）とは、第ｉ階層において、先頭からの空きセルの次の構造体セルＣ（ｉ，ｊ）から葉へのポインタおよび下位節点へのポインタが格納された場合の空きポインタの総数である。なお、先頭からの空きセルの空きポインタは除かれる。具体的には、たとえば、ＣＰＵ４０１は、下記式（４）により、末尾までの空きポインタ数Ｎｐｓｅ（ｉ）を算出する。
【００７１】
Ｎｐｓｅ（ｉ）
＝Ｎ（ｉ）×２ｎ−Ｎｌｐ（ｉ）−Ｎｎｐ（ｉ）−Ｎｃｓｔ（ｉ）×２ｎ・・・（４）
【００７２】
末尾までの空きセル数Ｎｃｓｅ（ｉ）とは、第ｉ階層の構造体セル群のうち、先頭からの空きセルと葉へのポインタや下位節点へのポインタが格納された構造体セルＣ（ｉ，ｊ）を除いた残余の構造体セルＣ（ｉ，ｊ）の個数である。具体的には、たとえば、ＣＰＵ４０１は、下記式（５）により、末尾までの空きセル数Ｎｃｓｅ（ｉ）を算出する。
【００７３】
Ｎｃｓｅ（ｉ）＝Ｎ（ｉ）−Ｎｃｕ（ｉ）−Ｎｃｓｔ（ｉ）・・・（５）
【００７４】
ポインタ生成部５０８は、算出部５０７によって算出された算出結果に基づいて、第ｉ階層の葉へのポインタと第ｉ階層の下位節点へのポインタを生成する機能を有する。具体的には、たとえば、ＣＰＵ４０１が算出結果テーブル５２０にアクセスして、第ｉ階層の葉へのポインタ数と下位節点へのポインタ数を取得する。
【００７５】
２ｎ分枝ハフマン木Ｈ１では、節点からの枝本数は２ｎ本なので、ｎ＝４の場合、枝番号となる下位節点へのポインタは４ビットコードとなる。たとえば、第１階層の根Ｃ（１，１）においては、葉Ｌ１へのポインタは“００００”、葉Ｌ２へのポインタは“０００１”、葉Ｌ３へのポインタは“００１０”となる。また、下位節点Ｃ（２，４）へのポインタは“００１１”、下位節点Ｃ（２，５）へのポインタは“０１００”、…、下位節点Ｃ（２，８）へのポインタは“０１１１”となる。生成されたポインタは、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に一時的に保持される。
【００７６】
ポインタ格納部５０９は、第ｉ階層の使用数分の節点に、ポインタ生成部５０８によって生成された第ｉ階層の葉へのポインタと第ｉ階層の下位節点へのポインタとを格納する機能を有する。具体的には、たとえば、ＣＰＵ４０１は、第ｉ階層の構造体セルＣ（ｉ，ｊ）のうち、ポインタの格納可能な先頭の構造体セルを特定する。
【００７７】
具体的には、たとえば、ＣＰＵ４０１が算出結果テーブル５２０にアクセスして、先頭からの空きセル数Ｎｃｓｔ（ｉ）を取得する。そして、ポインタの格納可能な先頭の構造体セルＣ（ｉ，ｊ）を、構造体セルＣ（ｉ，Ｎｃｓｔ（ｉ）＋１）に決定する。この構造体セルＣ（ｉ，Ｎｃｓｔ（ｉ）＋１）以降の構造体セルに、まず葉へのポインタを葉の番号順に格納し、ついで、下位節点へのポインタを格納する。葉へのポインタおよび下位節点へのポインタが格納された構造体セルの総数は、算出結果テーブル５２０の構造体セル使用数Ｎｃｕ（ｉ）に一致する。
【００７８】
葉生成部５１０は、分類部５０６によって分類された第ｉ階層の文字ごとに、ポインタ格納部５０９によって第ｉ階層の節点に格納された葉へのポインタにより第ｉ階層の節点のリンク先となる葉を、文字コードごとに生成する機能を有する。具体的には、たとえば、階層ごとに、葉の数Ｎｌ（ｉ）分の葉Ｌ♯の構造体を生成する。葉Ｌ♯の構造体は、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶される。
【００７９】
図１１は、２ｎ（１６）分枝ハフマン木の構造体を示す説明図である。ｎ＝４の１６分枝の場合、ハフマン木は１個の第１階層の節点（根）の構造体１１０１、１６個の第２階層の節点の構造体１１０２、２５６個の第３階層の節点の構造体１１０３、４０９６個の第４階層の節点の構造体１１０４、および１２９５個の葉Ｌ＃の構造体１１０５で構成される。
【００８０】
節点の構造体は、上位節点へのポインタ１１１０と下位第１節点へのポインタ１１１１〜第１６節点へのポインタ１１２６の１７種のポインタで構成される。葉Ｌ♯の構造体は、第１領域１１３１〜第４領域１１３４を有する。第１領域１１３１には、上位節点へのポインタが格納される。具体的には、たとえば、第ｉ階層のｊ番目の節点の構造体の下位第１２節点へのポインタがｌ番目の葉Ｌ♯の構造体をポイントしていた場合、第１領域１１３１には、第ｉ階層のｊ番目の節点の構造体への先頭アドレス（ポインタ）が格納される。
【００８１】
また、第２領域１１３２には、葉の標識および伸長種別などが格納される。葉の標識とは、圧縮や伸長の際に参照されるフラグであり、「０」（ＯＦＦを示す）の場合は一般の節点を、「１」（ＯＮを示す）の場合は葉を意味する。伸長種別は、伸長対象の出現頻度が高位の１６ビットの文字コードか、低位文字コードから分割された上位８ビットの分割文字コードか、低位文字コードから分割された下位８ビットの分割文字コードか、または予約語かを示す識別子である。第３領域１１３３には、伸長種別に対応して、高位の１６ビット文字コード、８ビットの分割文字コード、または予約語へのポインタが格納される。第４領域１１３４には、図８に示した出現率領域が格納される。
【００８２】
文字コード格納部５１１は、葉生成部５１０によって生成された葉に、当該葉の番号に対応付けられた文字コードを格納することにより、２ｎ分枝ハフマン木Ｈ１を生成する機能を有する。具体的には、たとえば、文字コードの出現頻度の順位（図８を参照）と一致する葉Ｌ♯の番号♯を格納する葉Ｌ♯の構造体の第３領域１１３３にその文字コードを格納する。予約語の場合は、予約語へのポインタを格納する。なお、第３領域１１３３の大きさによっては予約語の文字コード列を格納してもよい。また、文字コード格納部５１１は、文字コードの格納とともに、格納する文字コードの出現率領域も、集計結果テーブル８００から読み出して、第４領域１１３４に格納する。
【００８３】
このように、葉生成部５１０によって生成された葉Ｌ♯の構造体を図１に示した節点集合体１００の該当する節点の構造体セルＣ（ｉ，ｊ）にリンクさせ、ポインタ格納部５０９により節点集合体１００の構造体セルＣ（ｉ，ｊ）に葉Ｌ♯へのポインタを格納し、文字コード格納部５１１により葉Ｌ♯の構造体に文字コードや予約語のポインタを格納することで、節点集合体１００から２ｎ分枝ハフマン木Ｈ１が生成される。
【００８４】
図１２は、２ｎ分枝ハフマン木Ｈ１の構造体を示す説明図である。２ｎ分枝ハフマン木Ｈ１は、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶される。図１２では、ｎ＝４、すなわち、１６分枝ハフマン木を示している。
【００８５】
検出部５１２は、第ｉ階層の葉へのポインタ数と第（ｉ−１）階層の空き節点内の空きポインタ数とを検出する機能を有する。具体的には、たとえば、ＣＰＵ４０１が、算出結果テーブル５２０から第ｉ階層の葉へのポインタ数Ｎｌｐ（ｉ）と第（ｉ−１）階層の末尾までの空きポインタ数Ｎｐｓｅ（ｉ−１）とを読み出す。
【００８６】
特定部５１３は、検出部５１２によって検出された第ｉ階層の葉へのポインタ数と第（ｉ−１）階層の空き節点内の空きポインタ数とに基づいて、第ｉ階層から第（ｉ−１）階層の空き節点への移動対象となる第ｉ階層の葉Ｌ♯へのポインタ（以下、「移動対象ポインタ」という）を特定する機能を有する。具体的には、たとえば、ＣＰＵ４０１が、読み出された第ｉ階層の葉へのポインタ数Ｎｌｐ（ｉ）と第（ｉ−１）階層の末尾までの空きポインタ数Ｎｐｓｅ（ｉ−１）と第（ｉ−１）階層の下位節点へのポインタ数Ｎｎｐ（ｉ−１）を用いて、下記式（６）により判断する。
【００８７】
Ｎｐｓｅ（ｉ−１）＋Ｎｎｐ（ｉ−１）＞Ｎｌｐ（ｉ）・・・（６）
【００８８】
（６）式を満たす場合、第ｉ階層の葉Ｌ♯へのポインタはすべて第（ｉ＋１）階層に移動可能である。（６）式を満たさない場合、第（ｉ−１）階層の末尾までの空きポインタ数Ｎｐｓｅ（ｉ−１）と同数の第ｉ階層の葉へのポインタを移動対象ポインタとする。たとえば、図１１の２ｎ分枝ハフマン木Ｈ１を最適化する場合、算出結果テーブル５２０を参照すると、ｉ＝４の場合、第４階層の葉へのポインタ数Ｎｌｐ（４）＝８８５、第３階層の末尾までの空きポインタ数Ｎｐｓｅ（３）＝２７７５、第３階層の下位節点へのポインタ数Ｎｎｐ（３）＝５６であるため、（６）式を満たすこととなる。したがって、第４階層の葉Ｌ４１１へのポインタ〜葉Ｌ１２９５へのポインタはすべて第３階層の空きセル内に移動可能となる。
【００８９】
最適化部５１４は、特定部５１３によって特定された移動対象ポインタを格納する節点へのポインタを第（ｉ−１）階層の節点から削除し、移動対象ポインタを第（ｉ−１）階層の節点に移動させる機能を有する。具体的には、たとえば、上記の例では、移動対象ポインタ（第４階層の葉Ｌ４１１へのポインタ〜葉Ｌ１２９５へのポインタ）を格納する節点Ｃ（４，４１１）〜Ｃ（４，４６６）へのポインタを第３階層から削除する。そして、第３階層の構造体セルＣ（３，８０）から順次、移動対象ポインタを移動させる。すなわち、葉Ｌ４１１の構造体〜葉Ｌ１２９５の構造体は、第４階層から第３階層に昇格する。
【００９０】
これにより、第４階層の場合は圧縮符号長が１６ビットであったが、第３階層に昇格することで、圧縮符号長が１２ビットに短縮され、圧縮率の向上を図ることができる。このように、第ｉ階層から第（ｉ−１）階層に昇格することで、圧縮符号長がｎ×ｉビットからｎ×（ｉ−１）ビットに短縮され、圧縮率の向上を図ることができる。
【００９１】
また、最適化部５１４は、最適化する都度、算出結果テーブル５２０を更新する。図１３−１〜図１３−３は、最適化する場合の算出結果テーブル５２０の更新例である。このように、最適化は、最下位の階層から実行することとなる。
【００９２】
図１３−１は、第４階層から第３階層へ最適化する場合の算出結果テーブル５２０の更新例を示す説明図である。図１３−１は、図１０に示した状態からの更新例を示している。
【００９３】
図１３−２は、第３階層から第２階層へ最適化する場合の算出結果テーブル５２０の更新例を示す説明図である。図１３−２は、図１３−１に示した状態からの更新例を示している。
【００９４】
図１３−３は、第２階層から第１階層へ最適化する場合の算出結果テーブル５２０の更新例を示す説明図である。図１３−３は、図１３−２に示した状態からの更新例を示している。
【００９５】
図１４は、最適化後の２ｎ分枝ハフマン木Ｈ１の構造体を示す説明図である。図１２と比較すると、最適化後の２ｎ分枝ハフマン木Ｈ１では、第４階層の葉Ｌ♯の構造体が存在しない。このように、上位階層の空きポインタに下位階層の葉Ｌ♯へのポインタを移動させているため、圧縮符号の短縮化を図ることができる。
【００９６】
図１５は、最適化後の２ｎ分枝ハフマン木Ｈ１における葉Ｌ♯の構造体が格納する情報を示す説明図である。図１５の各レコードがそれぞれの葉Ｌ♯の構造体が格納する情報に相当する。なお、圧縮符号は２ｎ分枝ハフマン木Ｈ１の根から該当する葉Ｌ♯までの枝番号となる下位節点へのポインタ〜葉へのポインタのコード列である。
【００９７】
図５に戻って、文字構造体生成部５１５は、文字構造体５３０を生成する機能を有する。具体的には、たとえば、ＣＰＵ４０１が、予約語出現頻度集計テーブル７００、文字出現頻度集計テーブル６００、分割文字出現頻度集計テーブル９００、２ｎ分枝ハフマン木Ｈ１にアクセスし、指定された情報を抽出することで、予約語の構造体、高位文字コードの構造体、および分割上位文字コードの構造体を生成する。
【００９８】
図１６は、予約語の構造体を示す説明図である。予約語の構造体１６００は、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶され、ＣＰＵ４０１がアクセス可能である。予約語の構造体１６００は、予約語総数（図１６の例では１５個）、予約語の最大ビット長Ｌｒｍａｘ、各予約語ｒ１〜ｒ１５とそのビット長および葉Ｌ♯へのポインタを格納する。
【００９９】
ＣＰＵ４０１は、予約語出現頻度集計テーブル７００から予約語総数、各予約語、予約語の最大ビット長、各予約語のビット長を読み出す。また、２ｎ分枝ハフマン木Ｈ１にお
ける予約語の葉Ｌ♯の構造体から上位節点を特定し、その上位節点の構造体セル内の予約語の葉Ｌ♯へのポインタを読み出す。これにより、予約語の構造体１６００が生成される。
【０１００】
図１７は、高位文字コードの構造体を示す説明図である。高位文字コードの構造体１７００は、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶され、ＣＰＵ４０１がアクセス可能である。高位文字コードの構造体１７００は、文字コードｅ♯とその葉Ｌ♯へのポインタを格納する。
【０１０１】
ＣＰＵ４０１は、文字出現頻度集計テーブル６００から文字コードｅ♯を読み出す。また、２ｎ分枝ハフマン木Ｈ１においてその文字コードｅ♯に対応する葉Ｌ♯の構造体から上位節点を特定し、その上位節点の構造体セル内の文字コードｅ♯に対応する葉Ｌ♯へのポインタを読み出す。これにより、高位文字コードの構造体１７００が生成される。
【０１０２】
図１８は、分割文字コードの構造体を示す説明図である。分割文字コードの構造体１８００は、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶され、ＣＰＵ４０１がアクセス可能である。分割文字コードの構造体１８００は、分割文字コードとその葉Ｌ♯へのポインタを格納する。
【０１０３】
ＣＰＵ４０１は、分割文字出現頻度集計テーブル９００から分割文字コードを読み出す。また、２n分枝ハフマン木Ｈ１においてその分割文字コードに対応する葉Ｌ♯の構造体から上位節点を特定し、その上位節点の構造体セル内の分割文字コードに対応する葉Ｌ♯へのポインタを読み出す。これにより、分割文字コードの構造体１８００が生成される。
【０１０４】
＜２ｎ分枝ハフマン木生成処理手順＞
図１９は、情報処理装置５００が自動実行する２ｎ分枝ハフマン木生成処理手順を示すフローチャートである。図１９において、まず、入力部５０１により対象ファイル群Ｆｓを読み込む（ステップＳ１９０１）。つぎに、集計部５０３により文字コードと予約語の出現頻度を集計する（ステップＳ１９０２）。そして、葉数削減処理を実行する（ステップＳ１９０３）。つぎに、分類部５０６により、文字コード等をその出現確率Ｐに応じて階層別に分類する（ステップＳ１９０４）。
【０１０５】
このあと、算出部５０７によるパラメータ算出処理（ステップＳ１９０５）、ポインタ生成部５０８、ポインタ格納部５０９、葉生成部５１０、文字コード格納部５１１による構造体セル構築処理（ステップＳ１９０６）、最適化処理（ステップＳ１９０７）を実行する。これにより、２n分枝ハフマン木Ｈ１が自動生成される。
【０１０６】
図２０は、図１９に示した葉数削減処理（ステップＳ１９０３）の詳細な処理手順を示すフローチャートである。まず、ソート部５０４により、１６ビットの文字コードおよび予約語を出現頻度の降順にソートする（ステップＳ２００１）。その順位を参照して、低位文字コードを抽出し（ステップＳ２００２）、低位文字コードを前後８ビットの分割文字コードに分割する（ステップＳ２００３）。そして、分割文字コードの出現頻度を集計する（ステップＳ２００４）。最後に、１６ビットの文字コード、分割文字コード、予約語の出現頻度をすべて含めて出現頻度の降順にソートする（ステップＳ２００５）。このあと、ステップＳ１９０４に移行する。
【０１０７】
図２１は、図１９に示したパラメータ算出処理（ステップＳ１９０５）の詳細な処理手順を示すフローチャートである。まず、階層番号ｉをｉ＝１にセットし（ステップＳ２１０１）、ｉ＞ｋであるか否かを判断する（ステップＳ２１０２）。
【０１０８】
ｉ＞ｋでない場合（ステップＳ２１０２：Ｎｏ）、第ｉ階層における葉Ｌ♯へのポインタ数Ｎｌｐ（ｉ）、第ｉ階層における下位節点へのポインタ数Ｎｎｐ（ｉ）、第ｉ階層における構造体セルＣ（ｉ，ｊ）の使用数Ｎｃｕ（ｉ）、葉へのポインタ数の累計値ΣＮｌｐ（ｉ）、第ｉ階層における先頭からの空きセル数Ｎｃｓｔ（ｉ）、第ｉ階層における末尾までの空きポインタ数Ｎｐｓｅ（ｉ）、第ｉ階層における末尾までの空きセル数Ｎｃｓｅ（ｉ）を算出する（ステップＳ２１０３〜Ｓ２１０９）。
【０１０９】
そして、階層番号ｉを１ポイントインクリメントし（ステップＳ２１１０）、ステップＳ２１０２に戻る。ステップＳ２１０２において、ｉ＞ｋである場合（ステップＳ２１０２：Ｙｅｓ）、ステップＳ１９０６に移行する。
【０１１０】
図２２は、図１９に示した構造体セル構築処理（ステップＳ１９０６）の詳細な処理手順を示すフローチャートである。まず、節点集合体１００を読み込み（ステップＳ２２０１）、階層番号ｉをｉ＝１にセットし（ステップＳ２２０２）、セル番号ｊをｊ＝１にセットする（ステップＳ２２０３）。そして、第ｉ階層の構造体セルＣ（ｉ，ｊ）の構築処理を実行する（ステップＳ２２０４）。
【０１１１】
このあと、ｊが第ｉ階層の節点数２ｎ（ｉ−１）に対して、ｊ＞２ｎ（ｉ−１）であるか否かを判断する（ステップＳ２２０５）。ｊ＞２ｎ（ｉ−１）でない場合（ステップＳ２２０５：Ｎｏ）、ｊを１ポイントインクリメントし（ステップＳ２２０６）、ステップＳ２２０４に戻る。一方、ｊ＞２ｎ（ｉ−１）である場合（ステップＳ２２０５：Ｙｅｓ）、ｉ＞ｋであるか否かを判断する（ステップＳ２２０７）。ｉ＞ｋでない場合（ステップＳ２２０７：Ｎｏ）、ｉを１ポイントインクリメントし（ステップＳ２２０８）、ステップＳ２２０３に戻る。一方、ｉ＞ｋである場合（ステップＳ２２０７：Ｙｅｓ）、ステップＳ１９０７に移行する。
【０１１２】
図２３は、図２２に示した第ｉ階層の構造体セルＣ（ｉ，ｊ）の構築処理（ステップＳ２２０４）の詳細な処理手順を示すフローチャート（前半）である。まず、Ｎｌｐ（ｉ）個の葉Ｌ♯へのポインタを生成し（ステップＳ２３０１）、第ｉ階層に関する葉Ｌ♯の構造体を生成する（ステップＳ２３０２）。そして、Ｎｎｐ（ｉ）個の下位節点へのポインタを生成する（ステップＳ２３０３）。このあと、セル番号ｊが先頭からの空きセル数Ｎｃｓｔ（ｉ）に対して、ｊ＞Ｎｃｓｔ（ｉ）であるか否かを判断する（ステップＳ２３０４）。
【０１１３】
ｊ＞Ｎｃｓｔ（ｉ）でない場合（ステップＳ２３０４：Ｎｏ）、構造体セルＣ（ｉ，ｊ）を空きセルに決定する（ステップＳ２３０５）。そして、ｊを１ポイントインクリメントし（ステップＳ２３０６）、ステップＳ２３０４に戻る。一方、ｊ＞Ｎｃｓｔ（ｉ）である場合（ステップＳ２３０４：Ｙｅｓ）、ｊ＞Ｎｃｓｔ（ｉ）＋Ｎｃｕ（ｉ）であるか否かを判断する（ステップＳ２３０７）。Ｎｃｕ（ｉ）は第ｉ階層における構造体セル使用数である。
【０１１４】
ｊ＞Ｎｃｓｔ（ｉ）＋Ｎｃｕ（ｉ）である場合（ステップＳ２３０７：Ｙｅｓ）、ステップＳ２２０５に移行する。一方、ｊ＞Ｎｃｓｔ（ｉ）＋Ｎｃｕ（ｉ）でない場合（ステップＳ２３０７：Ｎｏ）、ステップＳ２４０１に移行する。
【０１１５】
図２４は、図２２に示した第ｉ階層の構造体セルＣ（ｉ，ｊ）の構築処理（ステップＳ２２０４）の詳細な処理手順を示すフローチャート（後半）である。ステップＳ２４０１において、構造体セルＣ（ｉ，ｊ）に空きがあるか否かを判断する（ステップＳ２４０１）。空きがない場合（ステップＳ２４０１：Ｎｏ）、ｊを１ポイントインクリメントして（ステップＳ２４０２）、ステップＳ２４０１に戻る。
【０１１６】
一方、空きがある場合（ステップＳ２４０１：Ｙｅｓ）、葉Ｌ♯へのポインタを葉の番号♯の若い順に構造体セルＣ（ｉ，ｊ）に格納する（ステップＳ２４０３）。そして、格納した葉Ｌ♯のポインタによりリンク先となる葉Ｌ♯の構造体に上位節点Ｃ（ｉ−１，ｊ）へのポインタを生成・格納する（ステップＳ２４０４）。
【０１１７】
そして、未保存の葉Ｌ♯へのポインタがあるか否かを判断する（ステップＳ２４０５）。未保存の葉Ｌ♯へのポインタがある場合（ステップＳ２４０５：Ｙｅｓ）、ステップＳ２４０１に戻る。一方、未保存の葉Ｌ♯へのポインタがない場合（ステップＳ２４０５：Ｎｏ）、構造体セルＣ（ｉ，ｊ）に空きがあるか否かを判断する（ステップＳ２４０６）。空きがない場合（ステップＳ２４０６：Ｎｏ）、ｊを１ポイントインクリメントして（ステップＳ２４０７）、ステップＳ２４０６に戻る。
【０１１８】
一方、構造体セルＣ（ｉ，ｊ）に空きがある場合（ステップＳ２４０６：Ｙｅｓ）、下位節点へのポインタを節点番号の若い順に構造体セルＣ（ｉ，ｊ）に格納する（ステップＳ２４０８）。そして、未格納の下位節点へのポインタがあるか否かを判断する（ステップＳ２４０９）。未格納の下位節点へのポインタがある場合（ステップＳ２４０９：Ｙｅｓ）、ステップＳ２４０６に戻る。一方、未格納の下位節点へのポインタがない場合（ステップＳ２４０９：Ｎｏ）、図２３のステップＳ２３０４に戻る。
【０１１９】
図２５は、図１９に示した最適化処理（ステップＳ１９０７）の詳細な処理手順を示すフローチャートである。まず、階層番号ｉをｉ＝ｋとし（ステップＳ２５０１）、ｉ＝１であるか否かを判断する（ステップＳ２５０２）。ｉ＝１でない場合（ステップＳ２５０２：Ｎｏ）、検出部５１２により、第ｉ階層の葉Ｌ♯へのポインタ数Ｎｌｐ（ｉ）、第（ｉ−１）階層の下位節点へのポインタ数Ｎｎｐ（ｉ−１）、および第（ｉ−１）階層の末尾までの空きポインタ数Ｎｐｓｅ（ｉ−１）を算出結果テーブル５２０から検出する（ステップＳ２５０３）。
【０１２０】
そして、Ｎｌｐ（ｉ）＝０であるか否かを判断する（ステップＳ２５０４）。Ｎｌｐ（ｉ）＝０である場合（ステップＳ２５０４：Ｙｅｓ）、移動させる葉Ｌ♯へのポインタがないため、ステップＳ２５０９に移行する。一方、Ｎｌｐ（ｉ）＝０でない場合（ステップＳ２５０４：Ｎｏ）、Ｎｐｓｅ（ｉ−１）＝０であるか否かを判断する（ステップＳ２５０５）。Ｎｐｓｅ（ｉ−１）＝０である場合（ステップＳ２５０５：Ｙｅｓ）、空きがないこととなり、ステップＳ２５０９に移行する。
【０１２１】
一方、Ｎｐｓｅ（ｉ−１）＝０でない場合（ステップＳ２５０５：Ｎｏ）、特定部５１３により、上記（６）式を用いて、第ｉ階層から第（ｉ−１）階層へ移動させる葉Ｌ♯へのポインタ（移動対象ポインタ）およびその数を特定する（ステップＳ２５０６）。
【０１２２】
つぎに、移動対象ポインタを格納している構造体セルＣ（ｉ，ｊ）をポイントする第（ｉ−１）階層の下位節点Ｃ（ｉ，ｊ）へのポインタを第（ｉ−１）階層から削除する（ステップＳ２５０７）。そして、移動対象ポインタを第（ｉ−１）階層に移動させ、葉Ｌ♯の番号♯が連続するように格納する（ステップＳ２５０８）。この後、ステップＳ２５０９において、階層番号ｉを１ポイントデクリメントし（ステップＳ２５０９）、ステップＳ２５０２に戻る。ステップＳ２５０２において、階層番号ｉ＝１の場合（ステップＳ２５０２：Ｙｅｓ）、一連の処理を終了する。これにより、情報処理装置５００が自動実行する２ｎ分枝ハフマン木生成処理手順の一連の説明を終了する。
【０１２３】
つぎに、２ｎ分枝ハフマン木Ｈ１を用いた圧縮処理と伸長処理について説明する。ここでは、上述した生成処理により自動生成された２ｎ分枝ハフマン木Ｈ１を用いてもよく、あらかじめ与えられた２ｎ分枝ハフマン木Ｈ１であってもよい。具体的には、２ｎ分枝ハフマン木Ｈ１を無節点ハフマン木Ｈ２に変換し、無節点ハフマン木Ｈ２を用いて圧縮処理と伸長処理を実行する。
【０１２４】
＜無節点ハフマン木＞
ここで、無節点ハフマン木Ｈ２について説明する。無節点ハフマン木Ｈ２とは、根と葉のみからなる内部節点のないハフマン木である。無節点ハフマン木Ｈ２は、枝の本数が多くなるが、根から１パスで葉にアクセスすることができる。無節点ハフマン木Ｈ２は、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶されており、ＣＰＵ４０１がアクセス可能である。
【０１２５】
図２６は、２ｍ分枝の無節点ハフマン木を示す説明図である。２ｍ（ｍ＝１２）分枝の無節点ハフマン木Ｈ２では、根から葉へのポインタとなる枝番号はｍビットコードのアドレスとなる。すなわち、葉の番号１〜４０９６の葉へのポインタは、“００００００００００００”〜“１１１１１１１１１１１１”となる。１６ビットの文字コードの場合、１２ビットコード以下に圧縮されることとなる。なお、ｍは、ｍ＜２ｎとなる値であり、たとえば、この不等式を満たす値のうち４の倍数で最大のものを用いる。ｍはｎに応じてあらかじめ設定される。たとえば、ｎ＝４の場合、ｍ＝１２とする。
【０１２６】
図２７は、２ｍ分枝の無節点ハフマン木Ｈ２の節点（根）の構造体を示す説明図である。上述の２n分枝ハフマン木Ｈ１の場合と同様、葉の総数が１２９５個であるとすると、葉の数が余ることとなる。したがって、出現頻度の高い文字コード等を格納する葉に対して複数（たとえば、２５６個）のポインタを用意する。
【０１２７】
図２７では、出現頻度が高い２ｎ分枝ハフマン木Ｈ１の第１階層の葉Ｌ１〜Ｌ３に対して、それぞれ２５６個の葉へのポインタを割り当てて根の構造体セルＣ（１，１）に格納する。また、出現頻度の高い第２階層の葉Ｌ４〜葉Ｌ１３４についても、それぞれ１６個の葉へのポインタを割り当てて根の構造体セルＣ（１，１）に格納する。第３階層の葉Ｌ１３５〜葉Ｌ１２９５については、それぞれ１個の葉へのポインタを割り当てて根の構造体セルＣ（１，１）に格納する。
【０１２８】
図２８は、無節点ハフマン木Ｈ２の葉の構造体を示す説明図である。葉の全体は、第１領域２８０１〜第５領域２８０５を有する。無節点ハフマン木Ｈ２の葉の構造体は、２ｎ分枝ハフマン木Ｈ１の葉の構造体から複写された構造体であるため、第１領域２８０１〜第４領域２８０４は、図１１の第１領域１１３１〜第４領域１１３４に対応する。第１領域２８０１には、圧縮符号およびその圧縮符号長が格納される。第２領域２８０２には、図１１と同様、葉の標識と伸長種別が格納される。第３領域２８０３には、図１１と同様、伸長種別に応じて高位１６ビット文字コード、低位の分割８ビット文字コード、または予約語へのポインタが格納される。
【０１２９】
第４領域２８０４には、図１１と同様、出現率領域が格納される。第５領域２８０５には、符号種別と符号区分が格納される。符号種別とは、文字コードが数字、英字、特殊記号、カタカナ、ひらがな、漢字のいずれに該当するか、または予約語へのポインタであるかを識別する情報である。符号区分とは、文字コードが１６ビットであるか８ビットであるかを識別する情報である。１６ビットの文字コードである場合または予約語である場合、符号区分として“１”を割り当て、８ビットの分割文字コードの場合、符号区分として“０”を割り当てる。
【０１３０】
また、第５領域２８０５には、圧縮符号マップ群Ｍｓへのポインタを構成するアドレス値が格納される。圧縮符号マップ群Ｍｓへのポインタとは、圧縮符号マップ群Ｍｓのうち葉Ｌ♯の構造体に格納されている文字コード固有の圧縮符号マップＭ♯にアクセスするポインタである。１０２４種の高位文字コードの場合は、０００１〜１０２４のアドレス値が文字コードごとに割り当てられる。
【０１３１】
また、１５種の予約語の場合は、１０２５〜１０３９のアドレス値が予約語（のポインタ）ごとに割り当てられる。上位８ビットの分割文字コードの場合は、０００１〜０２５６のアドレス値が上位８ビットの分割文字コードごとに割り当てられる。下位８ビットの分割文字コードの場合は、０２５７〜０５１２のアドレス値が上位８ビットの分割文字コードごとに割り当てられる。なお、第５領域２８０５の符号区分とアドレス値により圧縮符号マップ群Ｍｓへのポインタを構成する。
【０１３２】
図２９は、葉Ｌ♯の構造体に格納される情報を示す説明図である。各レコードが葉Ｌ♯の構造体に相当する。各葉Ｌ♯の構造体は、圧縮符号およびその圧縮符号長、葉の番号、伸長種別、文字コード等（文字コード（１６／８ビット）または予約語へのポインタ）、圧縮符号マップＭ♯へのポインタといった情報を含む。圧縮符号マップＭ♯へのポインタは、符号区分とアドレス値ａｄｒ♯を連結したアドレスとする。
【０１３３】
＜２ｎ分枝ハフマン木Ｈ１→無節点ハフマン木Ｈ２への変換＞
無節点ハフマン木Ｈ２は、２ｎ分枝ハフマン木Ｈ１からの変換により生成することができる。具体的には、たとえば、２ｎ分枝ハフマン木Ｈ１から２ｍ分枝（ｍ＝ｎ×ｋ）の無節点ハフマン木Ｈ２を生成することができる。以下、２ｍ分枝の無節点ハフマン木Ｈ２へ変換するための機能的構成について説明する。
【０１３４】
＜情報処理装置５００の機能的構成２＞
図３０は、実施の形態にかかる情報処理装置５００の機能的構成２を示すブロック図である。図３０では、図１に示した処理の流れ（１）〜（６）のうち、（３）の処理を実行する機能的構成を示している。なお、図５に示した構成と同一構成には同一符号を付し、その説明を省略する。
【０１３５】
図３０において、情報処理装置５００は、決定部３００１と、複製部３００２と、根生成部３００３と、第１の構築部３００４と、第２の構築部３００５と、文字構造体生成部５１５と、を備えている。決定部３００１〜第２の構築部３００５は、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶されたプログラムをＣＰＵ４０１に実行させることにより、または、Ｉ／Ｆ４０９により、その機能を実現する。
【０１３６】
決定部３００１は、２ｎ分枝ハフマン木Ｈ１の階層数と第ｉ階層の葉の数に基づいて、第ｉ階層の葉ごとに葉へのポインタの種類数を決定する機能を有する。具体的には、たとえば、ＣＰＵ４０１は、第１階層の種類数は２５６種、第２階層の種類数は１６種、第３階層以降の種類数は１種というように、あらかじめ設定しておく。たとえば、上述した２ｎ分枝ハフマン木Ｈ１では、第１階層の葉の数は３個、第２階層の葉の数は１３１個、第３階層の葉の数は１１６１個である。
【０１３７】
したがって、葉のポインタ数は４０２５個（＝３個×２５６種＋１３１個×１６種＋１１６１個×１種）となり、４０９６個（２ｍ個）以下となる。これにより、第１階層の種類数は２５６種、第２階層の種類数は１６種、第３階層以降の種類数は１種に確定する。もし、４０９６個よりも多くなった場合は、第１階層の種類数を１６種にしたり、第２階層の種類数を１種にするなどして、４０９６個以下となるように最適化する。
【０１３８】
複製部３００２は、２ｎ分枝ハフマン木Ｈ１の葉を複製する機能を有する。具体的には、たとえば、ＣＰＵ４０１は、葉Ｌ♯の構造体をコピーして、内部の上位節点へのポインタや圧縮符号長をクリアする。
【０１３９】
根生成部３００３は、２ｍ個の葉へのポインタを格納可能な根を生成して、記憶装置に格納する機能を有する。具体的には、たとえば、ｎ＝４の場合、ｍ＝１２、すなわち、４０９６個の空きポインタを有する根の構造体を生成する。
【０１４０】
第１の構築部３００４は、決定部３００１によって決定された種類数に基づいて、複製部３００２によって複製された葉ごとに当該葉へのポインタを生成し、根生成部３００３によって生成された根に格納する機能を有する。具体的には、たとえば、第１階層について２５６種と決定された場合、第１階層に関する葉Ｌ１に対しては、葉Ｌ１へのポインタＬ１Ｐ（１）〜Ｌ１Ｐ（２５６）を生成する。そして、この葉Ｌ１へのポインタＬ１Ｐ（１）〜Ｌ１Ｐ（２５６）を根の構造体に格納する。
【０１４１】
また、第２階層について１６種と決定された場合、第２階層に関する葉Ｌ４に対しては、葉Ｌ４へのポインタＬ４Ｐ（１）〜Ｌ４Ｐ（１６）を生成する。そして、この葉Ｌ４へのポインタＬ４Ｐ（１）〜Ｌ４Ｐ（１６）を根の構造体に格納する。また、第３階層について１種と決定された場合、第３階層に関する葉Ｌ１３５に対しては、葉Ｌ１３５へのポインタＬ１３５Ｐ（１）を生成する。そして、この葉Ｌ１３５へのポインタＬ１３５Ｐ（１）を根の構造体に格納する。
【０１４２】
第２の構築部３００５は、葉に対する当該葉へのポインタ群に共通のビット列からなる圧縮符号を抽出し、当該圧縮符号およびその圧縮符号長を葉に格納して葉を再構築することにより、根および葉からなる無節点ハフマン木Ｈ２を生成する機能を有する。具体的には、たとえば、任意の葉Ｌ♯について葉Ｌ♯へのポインタが複数種生成されている場合、これらのポインタに共通のビット列を圧縮符号と特定する。また、その圧縮符号長も取得する。そして、圧縮符号および圧縮符号長をその葉Ｌ♯の構造体に格納する。
【０１４３】
たとえば、葉Ｌ１については、２５６種の葉Ｌ１へのポインタＬ１Ｐ（１）〜Ｌ１Ｐ（２５６）が生成されているとした場合、以下のようなビット列となる。
【０１４４】
ポインタＬ１Ｐ（    １）：００００００００００００
ポインタＬ１Ｐ（    ２）：０００００００００００１
ポインタＬ１Ｐ（    ３）：００００００００００１０
ポインタＬ１Ｐ（    ４）：００００００００００１１
・                  ・
・                  ・
・                  ・
ポインタＬ１Ｐ（２５６）：００００１１１１１１１１
【０１４５】
ポインタＬ１Ｐ（１）〜Ｌ１Ｐ（２５６）では、上位４ビットの“００００”が共通のビット列となるため、この上位４ビット“００００”が葉Ｌ１の構造体の圧縮符号として特定される。また、この圧縮符号長は４ビットであるため、圧縮符号“００００”とともに葉Ｌ１の構造体に格納される。したがって、葉Ｌ１の構造体は、２５６種の葉Ｌ１へのポインタＬ１Ｐ（１）〜Ｌ１Ｐ（２５６）のいずれが指定されてもアクセスされることとなる。これにより、アクセス頻度が高くなるため、葉Ｌ１の構造体に格納されている文字コードはその圧縮符号へのアクセス頻度も高くなる。葉Ｌ２，Ｌ３も同様である。
【０１４６】
また、葉Ｌ４については、１６種の葉Ｌ４へのポインタＬ４Ｐ（１）〜Ｌ４Ｐ（１６）が生成されているとした場合、以下のようなビット列となる。
【０１４７】
ポインタＬ４Ｐ（  １）：００１１００００００００
ポインタＬ４Ｐ（  ２）：００１１０００００００１
ポインタＬ４Ｐ（  ３）：００１１００００００１０
ポインタＬ４Ｐ（  ４）：００１１００００００１１
・                  ・
・                  ・
・                  ・
ポインタＬ４Ｐ（１６）：００１１００００１１１１
【０１４８】
ポインタＬ４Ｐ（１）〜Ｌ４Ｐ（１６）では、上位８ビットの“００１１００００”が共通のビット列となるため、この上位８ビット“００１１００００”が葉Ｌ４の構造体の圧縮符号として特定される。また、この圧縮符号長は８ビットであるため、圧縮符号“００１１００００”とともに葉Ｌ４の構造体に格納される。したがって、葉Ｌ４の構造体は、１６種の葉Ｌ４へのポインタＬ４Ｐ（１）〜Ｌ４Ｐ（１６）のいずれが指定されてもアクセスされることとなる。これにより、アクセス頻度が高くなるため（葉Ｌ１〜Ｌ３よりは低いが）、葉Ｌ４の構造体に格納されている文字コードはその圧縮符号へのアクセス頻度も高くなる。
【０１４９】
また、葉Ｌ１３５については、１種の葉Ｌ１３５へのポインタＬ１３５Ｐ（１）が生成されているとした場合、以下のようなビット列となる。
【０１５０】
ポインタＬ１３５Ｐ（１）：１０１０００１０００００
【０１５１】
ポインタＬ１３５Ｐ（１）は１種だけであるため、この１２ビット“１０１０００１０００００”が葉Ｌ１３５の構造体の圧縮符号として特定される。また、この圧縮符号長は１２ビットであるため、圧縮符号“１０１０００１０００００”とともに葉Ｌ１３５の構造体に格納される。このように構築することで、無節点ハフマン木Ｈ２が生成されることとなる。すなわち、無節点ハフマン木Ｈ２の根では、葉の数に応じた長さとなる葉へのポインタが、各葉に対する枝として文字コードの出現率に応じた個数分割り当てられていることとなる。
【０１５２】
また、第２の構築部３００５は、圧縮符号を葉Ｌ♯の構造体に格納する際、符号区分に応じて未使用のアドレス値ａｄｒ♯を符号区分とともに格納する。具体的には、葉Ｌ♯の構造体において、伸長種別を参照して符号区分を格納する。そして、符号区分ごとに未使用のアドレス値ａｄｒ♯を格納する。これにより、文字コード等ごとに、圧縮符号マップＭ♯へのポインタを、葉Ｌ♯の構造体ごとに格納することができる。
【０１５３】
また、文字構造体生成部５１５は、あらたに構築された無節点ハフマン木Ｈ２を参照して文字構造体５３０を再度生成（更新）することとなる。すなわち、予約語の構造体１６００や高位文字コードの構造体１７００、分割文字コードの構造体１８００中、あらたに生成された葉へのポインタが格納されることとなる。
【０１５４】
＜２ｎ分枝ハフマン木Ｈ１→２ｍ分枝無節点ハフマン木変換処理＞
図３１−１は、情報処理装置５００が自動実行する２ｎ分枝ハフマン木Ｈ１→２ｍ分枝無節点ハフマン木変換処理手順を示すフローチャートである。図３１−１において、まず、２ｎ分枝ハフマン木Ｈ１の構造体を読み込み（ステップＳ３１０１）、決定部３００１により、階層ごとの葉へのポインタの種類数を決定する（ステップＳ３１０２）。
【０１５５】
つぎに、複製部３００２により２ｎ分枝ハフマン木Ｈ１の葉Ｌ♯の構造体を複製して（ステップＳ３１０３）、根生成部３００３により、根の構造体を生成する（ステップＳ３１０４）。そして、階層番号ｉをｉ＝１とし（ステップＳ３１０５）、第ｉ階層の未選択の葉Ｌ♯の構造体があるか否かを判断する（ステップＳ３１０６）。
【０１５６】
未選択の葉Ｌ♯の構造体がある場合（ステップＳ３１０６：Ｙｅｓ）、未選択の葉Ｌ♯の構造体を１つ選択し（ステップＳ３１０７）、決定された種類数分の葉へのポインタを生成して根の構造体に格納する（ステップＳ３１０８）。そして、種類数分の葉へのポインタから圧縮符号および圧縮符号長を特定して、葉Ｌ♯の構造体に格納する（ステップＳ３１０９）。このあと、圧縮符号マップＭ♯へのポインタ設定処理を実行して（ステップＳ３１１０）、ステップＳ３１０６に戻る。圧縮符号マップＭ♯へのポインタ設定処理については、図３１−２で後述する。
【０１５７】
一方、ステップＳ３１０６において、未選択の葉Ｌ♯の構造体がない場合（ステップＳ３１０６：Ｎｏ）、階層番号ｉを１ポイントインクリメントして（ステップＳ３１１１）、２ｎ分枝ハフマン木Ｈ１の階層数ｋに対してｉ＞ｋであるか否かを判断する（ステップＳ３１１２）。ｉ＞ｋでない場合（ステップＳ３１１２：Ｎｏ）、ステップＳ３１０６に戻る。一方、ｉ＞ｋである場合（ステップＳ３１１２：Ｙｅｓ）、一連の変換処理を終了する。
【０１５８】
図３１−２は、図３１−１に示した圧縮符号マップＭ♯へのポインタ設定処理（ステップＳ３１１０）の詳細な処理手順を示すフローチャートである。まず、（ステップＳ３１０７において選択されている葉Ｌ♯の構造体を参照して、文字コード等の符号種別および符号区分を特定する（ステップＳ３１２１）。つぎに、特定された符号種別および符号区分にしたがって、アドレス値ａｄｒａ〜ａｄｒｄの初期値を設定する（ステップＳ３１２２）。
【０１５９】
具体的には、葉Ｌ♯の構造体について、符号種別が数字、英字、特殊記号、カタカナ、ひらがな、漢字などの文字コードであり、かつ、符号区分が“１”である場合、１６ビットの文字コード用のアドレス値ａｄｒａの初期値をａｄｒａ＝０００１に設定する。
【０１６０】
また、葉Ｌ♯の構造体について、符号種別が予約語へのポインタであり、かつ、符号区分が“１”である場合、予約語へのポインタ用のアドレス値ａｄｒｂの初期値をａｄｒｂ＝１０２５に設定する。
【０１６１】
また、葉Ｌ♯の構造体について、符号種別が上位８ビットの分割文字コードであり、かつ、符号区分が“０”である場合、上位８ビットの分割文字コード用のアドレス値ａｄｒｃの初期値をａｄｒｃ＝０００１に設定する。
【０１６２】
また、葉Ｌ♯の構造体について、符号種別が下位８ビットの分割文字コードであり、かつ、符号区分が“０”である場合、下位８ビットの分割文字コード用のアドレス値ａｄｒｄの初期値をａｄｒｄ＝０２５７に設定する。
【０１６３】
そして、葉Ｌ♯の構造体内の符号区分を判断する（ステップＳ３１２３）。符号区分が“１”であり（ステップＳ３１２３：１）、かつ、符号種別が文字コードである場合（ステップＳ３１２４：文字コード）、アドレス値ａｄｒａを葉Ｌ♯の構造体の第５領域２８０５に格納する（ステップＳ３１２５）。このあと、アドレス値ａｄｒａをインクリメントして（ステップＳ３１２６）、ステップＳ３１０６に移行する。
【０１６４】
また、ステップＳ３１２３において、符号区分が“１”であり（ステップＳ３１２３：１）、かつ、符号種別が予約語へのポインタである場合（ステップＳ３１２４：予約語へのポインタ）、アドレス値ａｄｒｂを葉Ｌ♯の構造体の第５領域２８０５に格納する（ステップＳ３１２７）。このあと、アドレス値ａｄｒｂをインクリメントして（ステップＳ３１２８）、ステップＳ３１０６に移行する。
【０１６５】
また、ステップＳ３１２３において、符号区分が“０”であり（ステップＳ３１２３：０）、かつ、符号種別が上位８ビットの分割文字コードである場合（ステップＳ３１２９：上位）、アドレス値ａｄｒｃを葉Ｌ♯の構造体の第５領域２８０５に格納する（ステップＳ３１３０）。このあと、アドレス値ａｄｒｃをインクリメントして（ステップＳ３１３１）、ステップＳ３１０６に移行する。
【０１６６】
また、ステップＳ３１２３において、符号区分が“０”であり（ステップＳ３１２３：０）、かつ、符号種別が下位８ビットの分割文字コードである場合（ステップＳ３１２９：下位）、アドレス値ａｄｒｄを葉Ｌ♯の構造体の第５領域２８０５に格納する（ステップＳ３１３２）。このあと、アドレス値ａｄｒｄをインクリメントして（ステップＳ３１３３）、ステップＳ３１０６に移行する。これにより、各葉Ｌ♯の構造体に、圧縮符号マップＭ♯へのポインタが設定されることとなる。したがって、無節点ハフマン木Ｈ２を探索する際に、圧縮符号マップＭ♯を特定することができる。
【０１６７】
このように、２ｎ分枝ハフマン木Ｈ１から２ｍ分枝の無節点ハフマン木Ｈ２に変換することにより、無節点ハフマン木Ｈ２が圧縮や伸長に用いられることとなる。無節点ハフマン木Ｈ２を圧縮や伸長に用いることにより、２ｎ分枝ハフマン木Ｈ１にくらべて圧縮率および検索速度の向上を図ることができる。
【０１６８】
＜無節点ハフマン木を用いた圧縮処理＞
つぎに、２ｍ分枝の無節点ハフマン木Ｈ２を用いた圧縮処理について説明する。２ｍ分枝の無節点ハフマン木Ｈ２では１パスで葉にアクセスできるため、検索速度の高速化を図ることができる。以下、そのための機能的構成について説明する。
【０１６９】
＜情報処理装置５００の機能的構成３＞
図３２は、実施の形態にかかる情報処理装置５００の機能的構成３を示すブロック図である。図３２では、図１に示した処理の流れ（１）〜（６）のうち、（４）〜（６）の処理を実行する機能的構成を示している。なお、図５に示した構成と同一構成には同一符号を付し、その説明を省略する。図３２において、情報処理装置５００は、圧縮部３２００（分割部５０５、設定部３２０１、圧縮対象文字コード探索部３２０２、ハフマン木探索部３２０３、圧縮符号格納部３２０４）と、検出部３２０５と、圧縮符号マップ特定部３２０６と、圧縮符号マップ更新部３２０７と、圧縮符号マップ圧縮部３２０８（ビット列圧縮部３２８１と非圧縮領域設定部３２８２）と、圧縮バッファ３２１１とを備えている。
【０１７０】
設定部３２０１〜圧縮符号マップ圧縮部３２０８は、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶されたプログラムをＣＰＵ４０１に実行させることにより、または、Ｉ／Ｆ４０９により、その機能を実現する。また、圧縮バッファ３２１１は、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体によりその機能を実現する。
【０１７１】
圧縮部は、対象ファイル群Ｆｓの中から選ばれた対象ファイルＦに記述されている圧縮対象文字コードをハフマン木に従って順次圧縮する機能を有する。具体的には、たとえば、分割部５０５、設定部３２０１、圧縮対象文字コード探索部３２０２、ハフマン木探索部３２０３、圧縮符号格納部３２０４により圧縮をおこなう。
【０１７２】
設定部３２０１は、圧縮処理をおこなう場合、圧縮対象文字コードを設定する機能を有する。具体的には、たとえば、入力されてくる圧縮対象文字コードや圧縮符号列を、ＣＰＵ４０１が内部のレジスタや外部のバッファに書き込む。
【０１７３】
図３３−１は、圧縮対象文字コード列の一例を示す説明図である。ここでは、「次の兎は」という文字列を圧縮対象文字列とし、その文字コード列を示している。なお、「兎」は低位文字コードであるため、上位８ビットと下位８ビットに分割される。
【０１７４】
図３３−２は、圧縮符号列の一例を示す説明図である。ここでも、「次の兎は」という文字列の圧縮符号列を示している。「兎」は上位８ビットと下位８ビットに分割されているため、圧縮符号も分割文字コードごとに割り当てられる。
【０１７５】
圧縮対象文字コード探索部３２０２は、高位の文字コード群の中から設定部３２０１によって設定された圧縮対象文字コードを探索する機能を有する。具体的には、たとえば、ＣＰＵ４０１が、レジスタにセットされた圧縮対象文字コードを、文字構造体５３０、すなわち、予約語の構造体１６００、高位文字コードの構造体１７００を走査することで探索する。
【０１７６】
予約語の構造体１６００、高位文字コードの構造体１７００により一致する文字コードが探索されなかった場合は、ＣＰＵ４０１は、分割部５０５により、圧縮対象文字コードを上位ビットと下位ビットに分割し、分割文字コードごとに、分割文字コードの構造体１８００を走査して探索する。
【０１７７】
ハフマン木探索部３２０３は、探索された文字コード等に対応付けられた葉Ｌ♯へのポインタを用いて、探索された文字コード等の圧縮符号を探索する機能を有する。具体的には、たとえば、ＣＰＵ４０１は、文字構造体５３０から、一致した文字コード等に対応付けられている葉Ｌ♯へのポインタを読み出して、当該葉Ｌ♯の構造体を特定する。そして、ポイントされた葉Ｌ♯の構造体に格納されている文字コードの圧縮符号を抽出する。
【０１７８】
たとえば、図２６を用いて説明すると、葉Ｌ２５６に対応する文字コードが高位文字コードとして探索された場合、葉Ｌ２５６へのポインタを高位文字コードの構造体１７００から読み出して、葉Ｌ２５６の構造体にアクセスする。この葉Ｌ２５６の構造体に格納されている文字コードの圧縮符号を葉Ｌ２５６の構造体から抽出する。
【０１７９】
圧縮符号格納部３２０４は、ハフマン木探索部３２０３によって探索された圧縮符号を所定の記憶領域に格納する機能を有する。具体的には、たとえば、ＣＰＵ４０１が、探索された圧縮符号を圧縮バッファ３２１１に書き込む。
【０１８０】
（圧縮処理の具体例）
ここで、圧縮符号マップ特定部３２０５〜圧縮符号マップ圧縮部３２０８の説明の前に、２ｍ分枝の無節点ハフマン木Ｈ２を用いた対象ファイル群Ｆｓの圧縮処理の具体例について説明する。２ｍ分枝の無節点ハフマン木Ｈ２を用いた圧縮処理では、ハフマン木探索において、内部節点がないため根に向かって探索する必要はなく、ポイントされた葉Ｌ♯の構造体に格納されている文字コードを抽出して、圧縮バッファ３２１１に書き込む。予約語へのポインタを抽出した場合は、ポイント先の予約語を抽出して、圧縮バッファ３２１１に書き込む。これにより、圧縮処理の高速化を図ることができる。
【０１８１】
図３４は、２ｍ分枝の無節点ハフマン木Ｈ２を用いた圧縮処理の具体例を示す説明図である。まず、対象ファイル群Ｆｓから１文字目の圧縮対象文字コードを取得し、対象ファイル３００上の位置を保持しておく。そして、予約語の構造体１６００に対して２分木探索をおこなう。予約語は２文字以上の文字コード列であるため、１文字目の圧縮対象文字コードがヒットした場合、２文字目の文字コードを圧縮対象文字コードとして取得する。
【０１８２】
そして、２文字目の文字コードは、１文字目の圧縮対象文字コードがヒットした位置から探索する。３文字目以降も、不一致の圧縮対象文字コードが出現するまで繰り返し２分木探索をおこなう。一致する予約語ｒａ（ａは葉の番号）が探索された場合、その葉Ｌａへのポインタにより葉Ｌａの構造体にアクセスする。そして、上述したハフマン木探索により、予約語ｒａの圧縮符号を探索して、圧縮バッファ３２１１に格納する。
【０１８３】
一方、不一致の圧縮文字コードが出現した場合、予約語の構造体１６００に対する２分木探索を終了し（ＥＯＴ（Ｅｎｄ  Ｏｆ  Ｔｒａｎｓｍｉｓｓｉｏｎ）まで進み）、１文字目の圧縮対象文字コードを再度レジスタにセットして、高位文字コードの構造体１７００に対する２分木探索をおこなう。
【０１８４】
一致する文字コードｅｂ（ｂは葉の番号）が探索された場合、その葉Ｌｂへのポインタにより葉Ｌｂの構造体にアクセスする。そして、上述したハフマン木探索により、文字コードｅｂの圧縮符号を探索して、圧縮バッファ３２１１に格納する。
【０１８５】
一方、一致する文字コードが出現せず２分木探索を終了した場合、圧縮対象文字コードは高位文字コードではないため、上位８ビットと下位８ビットに分割する。そして、上位８ビットの分割文字コードについて、分割文字コードの構造体１８００に対する２分木探索をおこなう。一致する分割文字コードＤｃ１（ｃ１は葉の番号）が探索された場合、その葉Ｌｃ１へのポインタにより葉Ｌｃ１の構造体にアクセスする。そして、上述したハフマン木探索により、分割文字コードＤｃ１の圧縮符号を探索して、圧縮バッファ３２１１に格納する。
【０１８６】
引き続き、下位８ビットの分割文字コードについて、分割文字コードの構造体１８００に対する２分木探索をおこなう。一致する分割文字コードＤｃ２（ｃ２は葉の番号）が探索された場合、その葉Ｌｃ２へのポインタにより葉Ｌｃ２の構造体にアクセスする。そして、上述したハフマン木探索により、分割文字コードＤｃ２の圧縮符号を探索して、分割文字コードＤｃ１の圧縮符号に続けて圧縮バッファ３２１１に格納する。
【０１８７】
（ファイル圧縮処理手順）
図３５は、情報処理装置５００が自動実行する２ｍ分枝の無節点ハフマン木Ｈ２を用いたファイル圧縮処理手順を示すフローチャートである。まず、ファイル番号：ｐをｐ＝１とし（ステップＳ３５０１）、対象ファイルＦｐを読み込む（ステップＳ３５０２）。つぎに、圧縮処理を実行して（ステップＳ３５０３）、ファイル番号：ｐをインクリメントする（ステップＳ３５０４）。そして、ｐ＞αであるか否かを判断する（ステップＳ３５０５）。αは対象ファイル群Ｆｓの総数である。ｐ＞αでない場合（ステップＳ３５０５：Ｎｏ）、ステップＳ３５０２に戻る。一方、ｐ＞αである場合（ステップＳ３５０５：Ｙｅｓ）、一連のファイル圧縮処理を終了する。
【０１８８】
図３６は、図３５に示した圧縮処理（ステップＳ３５０３）の詳細な処理手順を示すフローチャート（その１）である。図３６において、まず、対象ファイル群Ｆｓに圧縮対象文字コードがあるか否かを判断する（ステップＳ３６０１）。ある場合（ステップＳ３６０１：Ｙｅｓ）、圧縮対象文字コードを取得してレジスタにセットする（ステップＳ３６０２）。そして、先頭の圧縮対象文字コードか否かを判断する（ステップＳ３６０３）。
【０１８９】
ここで、先頭の圧縮対象文字コードとは、未圧縮の１文字目の文字コードをいう。先頭である場合（ステップＳ３６０３：Ｙｅｓ）、その圧縮対象文字コードの対象ファイル群Ｆｓ上の位置（先頭位置）となるポインタを取得し（ステップＳ３６０４）、ステップＳ３６０５に移行する。一方、先頭でない場合（ステップＳ３６０３：Ｎｏ）、先頭位置を取得せずにステップＳ３６０５に移行する。
【０１９０】
そして、予約語の構造体１６００に対して２分木探索をおこなう（ステップＳ３６０５）。圧縮対象文字コードが一致した場合（ステップＳ３６０６：Ｙｅｓ）、連続して一致した文字コード列が予約語（の文字コード列）に該当するか否かを判断する（ステップＳ３６０７）。該当しない場合（ステップＳ３６０７：Ｎｏ）、ステップＳ３６０２に戻って後続の文字コードを圧縮対象文字コードとして取得する。この場合、後続の文字コードは先頭ではないため、先頭位置は取得しないこととなる。
【０１９１】
一方、ステップＳ３６０７において、予約語に該当する場合（ステップＳ３６０７：Ｙｅｓ）、該当する予約語の葉Ｌ♯へのポインタにより葉Ｌ♯の構造体にアクセスする（ステップＳ３６０８）。そして、ポイントされた葉Ｌ♯の構造体に格納されている予約語の圧縮符号を抽出する（ステップＳ３６０９）。
【０１９２】
この後、抽出された圧縮符号を圧縮バッファ３２１１に格納して（ステップＳ３６１０）、ステップＳ３６０１に戻る。このループが予約語の圧縮処理の流れとなる。ステップＳ３６０１において、圧縮対象文字コードがない場合（ステップＳ３６０１：Ｎｏ）、対象ファイルＦｐから圧縮された圧縮ファイルｆｐを圧縮バッファ３２１１からファイル出力して保存する（ステップＳ３６１１）。そして、ステップＳ３５０４に移行する。一方、ステップＳ３６０６において不一致となった場合（ステップＳ３６０６：Ｎｏ）、１６ビットの文字コードの圧縮処理のループに入る。
【０１９３】
図３７は、図３５に示した圧縮処理（ステップＳ３５０３）の詳細な処理手順を示すフローチャート（その２）である。図３７において、ステップＳ３６０４で取得された先頭位置のポインタを参照して、対象ファイル群Ｆｓから圧縮対象文字コードを取得してレジスタにセットする（ステップＳ３７０１）。
【０１９４】
つぎに、圧縮対象文字コードについて、高位文字コードの構造体１７００に対して２分木探索をおこなう（ステップＳ３７０２）。一致した場合（ステップＳ３７０３：Ｙｅｓ）、該当する文字の葉Ｌ♯へのポインタにより葉Ｌ♯の構造体にアクセスする（ステップＳ３７０４）。そして、ポイントされた葉Ｌ♯の構造体に格納されている圧縮対象文字コードの圧縮符号を抽出する（ステップＳ３７０５）。
【０１９５】
この後、探索された圧縮符号を圧縮バッファ３２１１に格納して（ステップＳ３７０６）、ステップＳ３６０１に戻る。このループが１６ビットの文字コードの圧縮処理の流れとなる。一方、ステップＳ３７０３において一致する文字コードが存在しなかった場合（ステップＳ３７０３：Ｎｏ）、分割文字コードの圧縮処理のループに入る。
【０１９６】
図３８は、図３５に示した圧縮処理（ステップＳ３５０３）の詳細な処理手順を示すフローチャート（その３）である。図３８において、まず、圧縮対象文字コードを上位８ビットと下位８ビットとに分割し（ステップＳ３８０１）、上位８ビットの分割文字コードを抽出する（ステップＳ３８０２）。そして、分割文字コードの構造体１８００に対して２分木探索をおこなう（ステップＳ３８０３）。
【０１９７】
そして、探索された分割文字コードの葉Ｌ♯へのポインタにより葉Ｌ♯の構造体にアクセスする（ステップＳ３８０４）。そして、ポイントされた葉Ｌ♯の構造体に格納されている分割文字コードの圧縮符号を抽出する（ステップＳ３８０５）。この後、探索された圧縮符号を圧縮バッファ３２１１に格納する（ステップＳ３８０６）。
【０１９８】
つぎに、下位８ビットが探索済みか否かを判断し（ステップＳ３８０７）、探索済みでない場合（ステップＳ３８０７：Ｎｏ）、下位８ビットの分割文字コードを抽出して（ステップＳ３８０８）、ステップＳ３８０３〜Ｓ３８０６を実行する。一方、下位８ビットが探索済みである場合（ステップＳ３８０７：Ｙｅｓ）、ステップＳ３６０１に戻り、予約語の圧縮処理のループに入る。
【０１９９】
このように、２ｍ分枝の無節点ハフマン木Ｈ２を用いた圧縮処理では、内部節点がないため根に向かって探索する必要はなく、ポイントされた葉Ｌ♯の構造体に格納されている文字コードを抽出して、圧縮バッファ３２１１に書き込むだけでよい。したがって、圧縮処理の高速化を図ることができる。
【０２００】
また、圧縮対象文字コードが格納されている葉Ｌ♯の構造体を、予約語の構造体１６００、高位文字コードの構造体１７００および分割文字コードの構造体１８００により即座に特定することができる。したがって、２ｍ分枝の無節点ハフマン木Ｈ２の葉を探索する必要がなく、圧縮処理の高速化を図ることができる。また、低位文字コードを上位ビットコードと下位ビットコードに分割することで、６万種以上ある低位の文字コードをたかだか２５６種の分割文字コードの圧縮符号に圧縮することができる。したがって、圧縮率の向上を図ることができる。
【０２０１】
また、図３２に戻って、検出部３２０５〜圧縮符号マップ圧縮部３２０８について説明する。検出部３２０５は、圧縮部３２００によるハフマン木の葉へのアクセスを検出する機能を有する。具体的には、たとえば、ハフマン木探索部３２０３による葉Ｌ♯の構造体へのアクセスを検出する。
【０２０２】
圧縮符号マップ特定部３２０６は、圧縮符号マップ群Ｍｓの中から葉Ｌ♯の構造体に格納されている文字コード等に対応する圧縮符号マップＭ♯を特定する機能を有する。具体的には、たとえば、検出部３２０５によって、ハフマン木探索部３２０３による葉Ｌ♯の構造体へのアクセスが検出された場合、当該葉Ｌ＃の構造体から圧縮符号マップＭへのポインタを読み出す。そして、読み出された圧縮符号マップＭへのポインタにより、葉Ｌ♯の構造体に格納されている文字コード等に対応する圧縮符号マップＭにアクセスする。
【０２０３】
図３９−１は、圧縮符号マップ群Ｍｓの初期状態を示す説明図である。圧縮符号マップ群Ｍｓは、アドレス項目とビット列項目とを有する。そして、葉Ｌ♯の構造体ごとに、すなわち、高位文字コード、予約語、上位８ビット分割文字コード、下位８ビット分割文字コードごとに、アドレスとビット列とがレコード化されている。
【０２０４】
アドレス項目の区分項目は、葉Ｌ♯の構造体の符号区分を示す。また、アドレス項目のアドレス値は、葉Ｌ♯の構造体のアドレス値を示す。したがって、区分項目の値とアドレス値とが連結されたアドレスが、その圧縮符号マップＭ♯へのポインタによりポイントされる。
【０２０５】
ビット列項目は、ファイル番号順に並んだファイル数分のビット列により構成される。ビットの値が“１”であるファイル番号の対象ファイルには、アドレスにより指定される文字コード等が存在する。一方、ビットの値が“０”であるファイル番号の対象ファイルには、アドレスにより指定される文字コード等が存在しない。図３９−１では、初期状態を示しているため、すべてのビット列の値は“０”である。
【０２０６】
図３２において、圧縮符号マップ更新部３２０７は、ファイル番号のビットを“０”から“１”に更新する機能を有する。具体的には、圧縮符号マップ群Ｍｓの、圧縮符号マップＭ♯へのポインタによりポイントされた圧縮符号マップＭ♯のビット列のうち、現在圧縮処理中である対象ファイルのファイル番号のビットを“０”から“１”に更新する。
【０２０７】
図３９−２は、圧縮符号マップ更新部３２０７による更新後の圧縮符号マップ群Ｍｓを示す説明図である。たとえば、一行目のレコードに該当する文字コード等は、対象ファイルＦ１〜Ｆ４には存在せず、対象ファイルＦαには存在することを示している。
【０２０８】
圧縮符号マップ圧縮部３２０８は、図３９−２に示した更新後の圧縮符号マップ群Ｍｓを圧縮する機能を有する。圧縮符号マップ圧縮部３２０８は、ビット列圧縮部３２８１と非圧縮領域設定部３２８２とを有する。ビット列圧縮部３２８１は、圧縮符号マップ群Ｍｓの各ビット列を圧縮する。ファイル総数αが膨大（たとえば、α＝１００００）である場合、ビット列において“０”が連続する箇所も多くなる。また、出現頻度が高い文字については、これとは逆に“１”が連続する箇所が多くなる。したがって、文字の出現率に応じた出現率領域を設定する。出現率領域とは、出現率の範囲である。出現率領域に応じて、圧縮符号マップ群Ｍｓの圧縮用ハフマン木を割り当てる。
【０２０９】
図４０は、出現率と出現率領域との関係を示す説明図である。出現率が０〜１００％の範囲とすると、図４０に示したように、Ａ〜Ｅ領域およびＡ´〜Ｅ´領域に領域分割することができる。したがって、Ａ〜Ｅ領域およびＡ´〜Ｅ´領域で特定された出現率領域に応じて、圧縮符号マップ群Ｍｓの圧縮用ハフマン木を圧縮パターンとして割り当てる。
【０２１０】
図４１は、出現率領域別の圧縮パターンを有する圧縮パターンテーブルを示す説明図である。出現率領域は、図２８に示したように、葉Ｌ♯の構造体の第４領域２８０４に格納されているため、葉Ｌ♯の構造体が指定されることで、圧縮パターンテーブルを参照して、圧縮パターンが特定されることとなる。なお、Ａ領域およびＡ´領域は、非圧縮のため、圧縮パターンとなるハフマン木は存在しない。
【０２１１】
図４２−１は、Ｂ領域およびＢ´領域の場合の圧縮パターンを示す説明図である。圧縮パターン４２０１は、１６種のハフマン木となる。
【０２１２】
図４２−２は、Ｃ領域およびＣ´領域の場合の圧縮パターンを示す説明図である。圧縮パターン４２０２は、１６種＋１種のハフマン木となる。圧縮パターン４２０２では、Ｂ領域およびＢ´領域に比べて、“０”が連続する箇所または“１”が連続する箇所が確率的に多くなる。したがって、１６ビット連続して値が“０”であるビット列に、符号語“００”が割り当てられている。
【０２１３】
図４２−３は、Ｄ領域およびＤ´領域の場合の圧縮パターンを示す説明図である。圧縮パターン４２０３は、１６種＋１種のハフマン木となる。圧縮パターン４２０３では、Ｃ領域およびＣ´領域に比べて、“０”が連続する箇所または“１”が連続する箇所が確率的に多くなる。したがって、３２ビット連続して値が“０”であるビット列に、符号語“００”が割り当てられている。
【０２１４】
図４２−４は、Ｅ領域およびＥ´領域の場合の圧縮パターンを示す説明図である。圧縮パターン４２０４は、１６種＋１種のハフマン木となる。圧縮パターン４２０４では、Ｄ領域およびＤ´領域に比べて、“０”が連続する箇所または“１”が連続する箇所が確率的に多くなる。したがって、６４ビット連続して値が“０”であるビット列に、符号語“００”が割り当てられている。このように、出現率領域に応じて、文字コードが存在しないことを意味する“０”の連続数が増加するため、文字コードの出現率に応じて圧縮符号マップＭｓの圧縮効率の向上を図ることができる。
【０２１５】
図４３は、圧縮された圧縮符号マップ群Ｍｓを示す説明図である。圧縮符号マップ群Ｍｓでは、葉Ｌ♯の構造体に対応するレコードごとに、図４２−１〜図４２−４に示した圧縮パターン４２０１〜４２０４を用いてビット列が圧縮されている。
【０２１６】
また、図３２において、非圧縮領域設定部３２８２は、圧縮符号マップ群Ｍｓにおいて非圧縮領域を設定する機能を有する。具体的には、対象ファイルＦの追加が検出された場合、ファイル番号ｐが連続するように採番する。そして、文字コードごとに文字コードの追加ファイルでの存否をあらわすビット列を、対象ファイル群Ｆｓのファイル番号ｐと連続するように配列した非圧縮領域を設定する。
【０２１７】
たとえば、対象ファイルＦが後から追加されると、追加された対象ファイルＦβを圧縮する際、圧縮符号マップ群Ｍｓにも文字の存否を示すビット列を追加する必要がある。圧縮前の圧縮符号マップ群Ｍｓでは、ファイル番号：１〜αのビット列については、圧縮パターン４２０１〜４２０４により圧縮されてレコードごとに符号長が異なる。すなわち、可変長であるため圧縮領域となる。
【０２１８】
したがって、図４３に示したように、圧縮符号列の先頭（ファイル番号α側）は整列するが末尾が整列しない。仮に、ビット列の並びを、ファイル番号：１〜αの順に、アドレス項目側から割り当てると、追加ファイルのビット列は、圧縮符号列の末尾側に挿入することとなり、圧縮符号列と追加ファイルのビット列とが非連続となってしまう。したがって、あらかじめ、圧縮符号マップ群Ｍｓの圧縮領域のビット列を、先頭位置から末尾位置にかけて対象ファイル群Ｆｓのファイル番号ｐの降順に配列しておく。そして、非圧縮領域設定部３２８２は、圧縮符号マップ群Ｍｓにおいて、圧縮符号マップへのポインタと圧縮領域との間に非圧縮領域を設定する。
【０２１９】
図４４は、圧縮された圧縮符号マップ群ｍｓへのビット列追加を示す説明図である。図４４に示すように、ファイル番号；１〜αのうち圧縮符号列が整列する側にファイル番号：αのビットを割り当てる。これにより、ファイル番号；１〜αのビット列を圧縮した場合でも、非圧縮のファイル番号：α＋１〜βのビット列を挿入しても、ファイル番号順にビット列を連続させることができる。これにより、ファイル番号；１〜αのビット列が圧縮されても、追加ファイルのファイル番号とそのビットとのずれがなく、対象ファイルの絞込みを正確に実行することができる。なお、追加ファイルのビット列の追加は、圧縮符号マップ更新部３２０７により実行される。
【０２２０】
図４５は、削除マップを示す説明図である。対象ファイル群Ｆｓ（対象ファイルＦ１〜Ｆβ）の中には、途中で削除される対象ファイルもある。削除された対象ファイルＦを絞り込みによって得ても無駄であるため、削除マップＭｄを用意しておく。削除マップＭｄは、ファイル総数α（追加があった場合はβ）分のビット列であり、初期状態では、すべて“１”に設定されている。
【０２２１】
削除された対象ファイルがあった場合、削除マップＭｄ中、削除された対象ファイルのファイル番号：ｄのビットの値を“１”→“０”に変更する。削除マップＭｄは対象ファイルの絞込み時に利用される。このため、圧縮符号マップ群Ｍｓにおいて、ある文字コードについてある対象ファイルＦのビットが“１”であっても、削除マップＭｄでは“０”の場合、検索対象外となる。なお、削除マップＭｄの更新は、圧縮符号マップ更新部３２０７により実行される。
【０２２２】
（圧縮符号マップ生成処理手順）
つぎに、圧縮符号マップ生成処理について説明する。圧縮符号マップ生成処理は、図３４および図３５に示したファイル圧縮処理と並列に実行される処理である。具体的には、図３４を参照すると、ＣＰＵ４０１は、圧縮対象文字コードを圧縮する際に、葉Ｌ♯の構造体にアクセスする。圧縮符号マップ生成処理は、ファイル圧縮処理時における葉Ｌ♯の構造体へのアクセスの都度、実行される。これにより、対象ファイルＦを一回走査するだけで、対象ファイルＦの圧縮と対象ファイルＦに存在する文字の圧縮符号マップＭを同時に生成することができ、処理の高速化を図ることができる。なお、圧縮符号マップ群Ｍｓの初期状態は、図３９−１に示したとおりである。
【０２２３】
図４６は、圧縮符号マップ生成処理手順を示すフローチャートである。まず、葉Ｌ♯の構造体へのアクセスがあったか否かを判断する（ステップＳ４６０１）。葉Ｌ♯の構造体へのアクセスがあった場合（ステップＳ４６０１：Ｙｅｓ）、アクセスした葉Ｌ♯の構造体の第５領域２８０５内の情報（符号区分および圧縮符号マップ用のアドレス値）を取得する（ステップＳ４６０２）。取得された符号区分にアドレス値をつなげたアドレスが圧縮符号マップＭ♯へのポインタになる。取得された圧縮符号マップＭ♯へのポインタにより、該当する圧縮符号マップＭ♯にアクセスする（ステップＳ４６０３）。
【０２２４】
そして、ステップＳ４６０１における葉Ｌ♯の構造体にアクセスしたときのファイル番号ｐのビットが“０”であるか否かを判断する（ステップＳ４６０４）。“０”である場合（ステップＳ４６０４：Ｙｅｓ）、ファイル番号ｐのビットを“０”→“１”に設定し（ステップＳ４６０５）、ステップＳ４６０１に戻る。一方、ステップＳ４６０４において、“１”である場合（ステップＳ４６０４：Ｎｏ）、ステップＳ４６０５を実行せずに、ステップＳ４６０１に戻る。
【０２２５】
また、ステップＳ４６０１において、葉Ｌ♯の構造体へのアクセスがない場合（ステップＳ４６０１：Ｎｏ）、ステップＳ４６０６に移行する。ステップＳ４６０６において、対象ファイルの読込が終了したか否かを判断する（ステップＳ４６０６）。終了していない場合（ステップＳ４６０６：Ｎｏ）、ステップＳ４６０１に戻る。一方、終了した場合（ステップＳ４６０６：Ｙｅｓ）、圧縮符号マップ生成処理を終了する。このように、対象ファイルＦを一回走査するだけで、対象ファイルＦの圧縮と対象ファイルＦに存在する文字の圧縮符号マップＭを同時に生成することができ、処理の高速化を図ることができる。
【０２２６】
（圧縮符号マップ圧縮処理手順）
つぎに、圧縮符号マップ圧縮処理について説明する。圧縮符号マップ圧縮処理は、図３９−２に示したように、圧縮符号マップ生成処理にて生成された圧縮符号マップ群Ｍｓの圧縮領域であるファイル番号１〜αまでのビット列を圧縮する処理である。具体的には、図４１に示した圧縮パターンテーブルと図４２−１〜図４２−４に示した圧縮パターン（圧縮符号マップ用ハフマン木）を用いて、圧縮符号マップ群Ｍｓの圧縮領域のビット列を圧縮する。これにより、図４３に示したような圧縮後の圧縮符号マップ群Ｍｓを得ることができる。以下、圧縮符号マップ圧縮処理手順について説明する。
【０２２７】
図４７は、圧縮符号マップ圧縮処理手順を示すフローチャートである。図４７において、まず、圧縮符号マップ群Ｍｓにおいて、未選択のアドレス（圧縮符号マップへのポインタ）があるか否かを判断する（ステップＳ４７０１）。未選択のアドレスがある場合（ステップＳ４７０１：Ｙｅｓ）、未選択のアドレスを選択して葉Ｌ♯の構造体にアクセスし（ステップＳ４７０２）、葉Ｌ♯の構造体の第１領域２８０１の中から文字コードを取得する（ステップＳ４７０３）。そして、アクセス先の葉Ｌ♯の構造体の第４領域２８０４から出現率領域を取得することで、取得された文字コードの出現率領域を特定する（ステップＳ４７０４）。
【０２２８】
このあと、図４１の圧縮パターンテーブルを参照して、特定された出現率領域が非圧縮領域（たとえば、出現率領域Ａ、Ａ’）であるか否かを判断する（ステップＳ４７０５）。非圧縮領域である場合（ステップＳ４７０５：Ｙｅｓ）、ステップＳ４７０１に戻り、つぎのアドレスを選択する。
【０２２９】
一方、非圧縮領域でない場合（ステップＳ４７０５：Ｎｏ）、特定された出現率領域により、図４２−１〜図４２−４に示した圧縮符号マップ用ハフマン木の中から該当する圧縮符号マップ用ハフマン木を選択する（ステップＳ４７０６）。また、圧縮対象となる取得文字コードの圧縮符号マップＭにおける圧縮領域のビット列を抽出する（ステップＳ４７０７）。
【０２３０】
そして、取得文字コードの出現率が５０％以上であるか否かを判断する（ステップＳ４７０８）。出現率とは、上述したように、対象ファイル群Ｆｓ内の全ファイル数を母集団（分母）とし、当該文字コードまたは予約語が存在するファイル数を分子とした値である。出現率領域は、出現率に応じて決められているため（図４０を参照）、出現率領域がＡ〜Ｅである場合、取得文字コードの出現率が５０％以上でないと判断する。一方、出現率領域がＡ’〜Ｅ’である場合、取得文字コードの出現率が５０％以上であると判断する。
【０２３１】
そして、出現率が５０％以上である場合（ステップＳ４７０８：Ｙｅｓ）、圧縮効率を上げるために、ステップＳ４７０６で抽出されたビット列を反転する（ステップＳ４７０９）。たとえば、抽出されたビット列が“１１１０”である場合、“０００１”にして、“０”の個数を増やす。そして、反転後のビット列を、ステップＳ４７０６で選択したハフマン木を用いて圧縮して（ステップＳ４７１０）、ステップＳ４７０１に戻る。このように、ビット列反転をおこなうことで、出現率領域Ａ’〜Ｅ’の圧縮符号マップ用ハフマン木を用意する必要がないため、省メモリ化を図ることができる。
【０２３２】
一方、ステップＳ４７０８において、出現率が５０％以上でない場合（ステップＳ４７０８：Ｎｏ）、ビット列反転（ステップＳ４７０９）をおこなうことなく、ステップＳ４７０７で抽出されたビット列を、ステップＳ４７０６で選択したハフマン木を用いて圧縮して（ステップＳ４７１０）、ステップＳ４７０１に戻る。また、ステップＳ４７０１において、未選択のアドレスがない場合（ステップＳ４７０１：Ｎｏ）、圧縮符号マップ圧縮処理を終了する。
【０２３３】
このような圧縮符号マップ圧縮処理手順により、アドレスごとにファイル番号１〜αのビット列が、出現率に応じて圧縮され、図４３に示したような圧縮後の圧縮符号マップ群Ｍｓを得ることができる。
【０２３４】
（追加ファイル圧縮処理手順）
つぎに、追加ファイル圧縮処理について説明する。追加ファイル圧縮処理は、あとから対象ファイルＦが追加された場合、追加分の対象ファイルについての文字コード（厳密には圧縮符号マップへのポインタとなるアドレス）ごとに追加分の対象ファイルのビット列を追加する処理である。具体的には、ファイル番号α＋１〜βまでのビット列を追加することで、図４４に示したような圧縮符号マップ群Ｍｓが得られる。以下、圧縮後の圧縮符号マップ群Ｍｓを例に挙げて追加ファイル圧縮処理手順について説明する。なお、β個の追加分の対象ファイルについては、ファイル番号α＋１〜βを付加しておく。
【０２３５】
図４８は、追加ファイル圧縮処理手順を示すフローチャートである。まず、追加ファイル数β分のマップ領域を設定する（ステップＳ４８０１）。具体的には、圧縮符号マップ群Ｍｓのアドレスとファイル番号１〜αの圧縮符号列との間に追加ファイルのビット列（初期値は“０”）を確保する。
【０２３６】
つぎに、ファイル番号ｐをｐ＝α＋１とし（ステップＳ４８０２）、対象ファイルＦｐを読み込む（ステップＳ４８０３）。そして、圧縮処理を実行する（ステップＳ４８０４）。圧縮処理（ステップＳ４８０４）は、図３５および図３６に示した圧縮処理（ステップＳ３５０３）と同じ処理である。圧縮処理（ステップＳ４８０４）のあと、ファイル番号ｐをインクリメントし（ステップＳ４８０５）、ｐ＞βであるか否かを判断する（ステップＳ４８０６）。ｐ＞βでない場合（ステップＳ４８０６：Ｎｏ）、ステップＳ４８０３に戻る。一方、ｐ＞βである場合（ステップＳ４８０６：Ｙｅｓ）、追加ファイル圧縮処理を終了する。
【０２３７】
（削除マップ更新処理手順）
つぎに、削除マップ更新処理について説明する。削除マップ更新処理は、図４５に示した削除マップＭｄ内の選択されたビットを更新する処理である。
【０２３８】
図４９は、削除マップ更新処理手順を示すフローチャートである。まず、ファイル削除があるまで待ちうけ（ステップＳ４９０１：Ｎｏ）、ファイル削除があった場合（ステップＳ４９０１：Ｙｅｓ）、削除された対象ファイルのファイル番号ｄを検出する（ステップＳ４９０２）。そして、削除マップＭｄにおけるファイル番号ｄのビットを、“１”から“０”に更新する（ステップＳ４９０３）。これにより、削除マップ更新処理を終了する。削除マップＭｄは対象ファイルの絞込み時に利用される。このため、圧縮符号マップ群Ｍｓにおいて、ある文字コードについてある対象ファイルのビットが“１”であっても、削除マップＭｄでは“０”の場合、検索対象外となる。
【０２３９】
＜圧縮ファイルｆの検索と対象ファイルＦへの伸長までの処理の流れ＞
図５０は、圧縮ファイルｆの検索と対象ファイルＦへの伸長までの処理の流れを示す説明図である。図５０では、まず、（７）情報検索装置が、検索キーワードの入力を受け付けて読み込む。つぎに、（８）無節点ハフマン木Ｈ２により、検索キーワードを構成する各文字の文字コードを圧縮することで、圧縮符号群が得られる。そして、（９）各圧縮符号に対応する葉Ｌ♯の構造体から圧縮符号マップへのポインタを取得して圧縮符号マップ群Ｍｓにアクセスする。
【０２４０】
なお、圧縮符号マップ群Ｍｓの場合、（７）検索キーワードの読み込みを契機として、圧縮符号マップ用ハフマン木により圧縮符号マップ群Ｍｓを伸長し、圧縮符号マップ群Ｍｓを生成しておく。
【０２４１】
（１０）そして、各文字コードの圧縮符号マップＭのビット列をファイル番号ｐごとにＡＮＤ演算することで、検索キーワードを構成する文字をすべて含む圧縮ファイルｆ（特定圧縮ファイルｆｔ）を特定する。これにより、圧縮ファイル群ｆｓのまま検索キーワードについてファイル絞込みをおこなうことができる。
【０２４２】
（１１）最後に、（９）で特定圧縮ファイルｆｔを無節点ハフマン木Ｈ２を用いて伸長し、伸長された対象ファイルＦ（伸長ファイルＦｔ）内の文字列と検索キーワードとを照合し、ヒットした文字列を強調表示などの文字列置換をする。これにより、圧縮ファイルｆの伸長と検索キーワードの一致判定（照合）を一連の処理で実行することができる。
【０２４３】
（機能的構成４）
図５１は、実施の形態にかかる情報検索装置の機能的構成を示すブロック図である。図５１では、図５０に示した処理（７）〜（１１）を実行する機能的構成を示している。図５１において、情報検索装置５１００は、入力部５１０１と、検索キーワード圧縮部５１０２と、圧縮符号マップ伸長部５１０３と、圧縮符号マップ特定部５１０４と、圧縮ファイル特定部５１０５と、照合フラグ設定部５１０６と、抽出部５１０７と、葉特定部５１０８と、伸長コード格納部５１０９と、照合部５１１０と、文字列置換部５１１１と、出力部５１１２とを備える。
【０２４４】
入力部５１０１〜出力部５１１２は、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶されたプログラムをＣＰＵ４０１に実行させることにより、または、Ｉ／Ｆ４０９により、その機能を実現する。また、伸長バッファ５１２０は、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体によりその機能を実現する。なお、情報検索装置５１００は、上述した情報処理装置５００と同一装置であってもよく、異なる装置であってもよい。
【０２４５】
まず、入力部５１０１は、検索キーワードの入力を受け付ける機能を有する。入力部５１０１は、図５０に示した（７）に相当する機能である。
【０２４６】
検索キーワード圧縮部５１０２は、検索キーワードを圧縮する機能を有する。検索キーワード圧縮部５１０２は、図５０に示した（８）に相当する機能である。具体的には、図３４に示したように、検索キーワード（圧縮対象文字コード列）を順次圧縮する。すなわち、文字構造体５３０を参照して、入力部５１０１によって入力された検索キーワードを構成する文字コードごとに葉Ｌ♯へのポインタを特定する。そして、特定された葉Ｌ♯へのポインタにより葉Ｌ♯の構造体にアクセスして、当該アクセス先の葉Ｌ♯の構造体に格納されている圧縮符号を抽出する。圧縮された検索キーワードの圧縮符号群は、圧縮バッファに格納される。
【０２４７】
圧縮符号マップ伸長部５１０３は、圧縮処理された圧縮符号マップ群Ｍｓを伸長する機能を有する。具体的には、検索キーワードの入力を契機として、圧縮に用いた圧縮符号マップ用ハフマン木により、圧縮符号マップ群Ｍｓにおけるファイル番号１〜αの圧縮符号マップの圧縮符号列（図４３、図４４を参照）をハフマン伸長する。これにより、圧縮符号マップ群Ｍｓを復元することができる。
【０２４８】
圧縮符号マップ特定部５１０４は、圧縮符号マップ群Ｍｓのうち、検索キーワードを構成する文字の文字コードに対応する圧縮符号マップＭを特定する機能を有する。圧縮符号マップ特定部５１０４は、図５０に示した（９）に相当する機能である。圧縮符号マップ特定部５１０４では、検索キーワードの圧縮時にアクセスした葉Ｌ♯の構造体に格納されている圧縮符号マップへのポインタを取得する。そして、取得した圧縮符号マップへのポインタにより、該当する圧縮符号マップＭにアクセスする。
【０２４９】
圧縮ファイル特定部５１０５は、圧縮符号マップ特定部５１０４によって特定された圧縮符号マップＭを参照することにより、検索キーワード圧縮部５１０２によって圧縮された圧縮符号群をすべて含む圧縮ファイルを圧縮ファイル群から特定する機能を有する。圧縮ファイル特定部５１０５は、図５０に示した（１０）に相当する機能である。圧縮ファイル特定部５１０５では、圧縮ファイルごとに、検索キーワードを構成する各文字コードのビットをＡＮＤ演算する。そして、ＡＮＤ演算結果が“１”であれば、そのファイル番号ｐの圧縮ファイルｆｐに検索キーワードを構成する文字がすべて含まれていることとなる。これにより、圧縮ファイル群Ｆｓの絞込みをおこなうことができる。
【０２５０】
図５２は、圧縮ファイル特定部５１０５により特定例を示す説明図である。図５２では、例として検索キーワードを『増殖細胞』とする。そして、圧縮符号マップ特定部５１０４によって特定された圧縮符号マップＭを圧縮符号マップＭ１〜Ｍ４とする。また、図５２では、理解の容易のため、ファイル数αをα＝４とし、追加ファイル数βをβ＝０とする。
【０２５１】
圧縮符号マップＭ１〜Ｍ４のビット列および削除マップＭｄをファイル番号ごとの列でＡＮＤ演算する。ファイル番号１の列は、『増』，『殖』，『細』，『胞』がすべて存在しないため、ＡＮＤ演算結果は“０”である。ファイル番号２の列は、『増』，『殖』，『細』，『胞』がすべて存在するが、対象ファイルＦ２は削除されているため、削除マップＭｄのビットが“０”である。したがって、ＡＮＤ演算結果は“０”である。
【０２５２】
ファイル番号３の列は、『増』，『殖』，『細』，『胞』がすべて存在し、かつ、削除マップＭｄのビットが“１”である。したがって、ＡＮＤ演算結果は“１”である。ファイル番号４の列は、『殖』，『細』，『胞』が存在しないため、ＡＮＤ演算結果は“０”である。これにより、図５２の例では、圧縮ファイルｆ１〜ｆ４のうち、ファイル番号３の圧縮ファイルｆ３に絞り込まれることとなる。なお、圧縮ファイル特定部５１０５によって特定された圧縮ファイルｆ内の圧縮符号列は、ＣＰＵ４０１により、内部のレジスタや外部のバッファに書き込まれる。
【０２５３】
照合フラグ設定部５１０６は、圧縮ファイル特定部５１０５により葉Ｌ♯の構造体にアクセスされた際、葉Ｌ♯の構造体内の照合フラグをＯＮに設定する機能を有する。照合フラグは、その葉Ｌ♯の構造体に対応する文字コードが伸長バッファ５１２０に格納された場合、対象となる検索キーワード内の文字コードと照合するか否かを判断するフラグである。照合フラグがＯＮの場合は照合し、ＯＦＦの場合は照合しない。デフォルトはＯＦＦであり、検索結果が得られると、ＯＦＦにリセットされる。これにより、照合フラグがＯＮである葉Ｌ♯の構造体の文字コードのみと照合をおこなうことができ、無駄な照合を回避することができる。
【０２５４】
抽出部５１０７は、圧縮ファイル特定部５１０５によって特定された圧縮ファイルｆの中から葉Ｌ♯へのポインタと同じ長さとなる圧縮符号列を抽出する機能を有する。抽出された圧縮符号列は、根の構造体セルＣ（１，１）に格納されている葉Ｌ♯へのポインタ群のいずれかのポインタに一致することとなる。
【０２５５】
葉特定部５１０８は、抽出部５１０７によって抽出された圧縮符号列に基づいて、無節点ハフマン木Ｈ２により葉Ｌ♯の構造体を特定する機能を有する。具体的には、たとえば、抽出された圧縮符号を含む枝番号に一致する葉Ｌ♯へのポインタを、無節点ハフマン木Ｈ２の根の構造体セルＣ（１，１）の中から探索する。そして、探索された場合、ポイント先となる葉Ｌ♯の構造体に１パスでアクセスする。
【０２５６】
たとえば、葉Ｌ１の構造体に含まれている圧縮符号は“００００”、葉Ｌ１をポイントする葉Ｌ１へのポインタＬ１Ｐ（１）〜Ｌ１Ｐ（２５６）は、“００００００００００００”〜“００００１１１１１１１１”である。したがって、抽出された圧縮符号“００００”を含む葉Ｌ♯へのポインタが、“００００００００００００”〜“００００１１１１１１１１”である場合、そのポイント先である葉Ｌ１の構造体にアクセスする。
【０２５７】
伸長コード格納部５１０９は、葉特定部５１０８によってアクセスされた葉Ｌ♯の構造体に格納されている文字コード等を抽出して、伸長コードとして伸長バッファ５１２０に格納する機能を有する。具体的には、たとえば、上記の例では、葉Ｌ１の構造体にアクセスしているため、葉Ｌ１の構造体の第３領域２８０３に格納されている文字コードｅ１を伸長コードとして抽出する。そして、抽出された伸長コードを伸長バッファ５１２０に書き込む。ここで、伸長コードの格納の具体例について説明する。
【０２５８】
図５３−１〜図５３−５は、抽出部５１０７、葉特定部５１０８および伸長コード格納部５１０９による２ｍ分枝の無節点ハフマン木Ｈ２を用いた伸長処理の具体例を示す説明図である。図５３−１〜図５３−５では、図３３−２に示した圧縮符号列を伸長する例を示している。伸長処理では、レジスタに圧縮符号列をセットし、マスクパターンにより圧縮符号を抽出する。抽出した圧縮符号を、１パス（１枝分のアクセス）で２ｍ分枝の無節点ハフマン木Ｈ２の根から探索する。そして、アクセスした葉Ｌ♯の構造体に格納されている文字コードを読み出して伸長バッファ５１２０に格納する。
【０２５９】
圧縮符号を抽出するため、マスクパターンのマスク位置をオフセットする。また、マスクパターンの初期値を“０ｘＦＦＦ０００００”とする。このマスクパターンは先頭１２ビットが“１”であり、後続の２０ビットが“０”のビット列である。
【０２６０】
ＣＰＵ４０１はビットアドレスａｂｉとバイトオフセットｂｙｏｓとビットオフセットｂｉｏｓとを算出する。ビットアドレスａｂｉは、抽出された圧縮符号のビット位置を示す値であり、今回のビットアドレスａｂｉは、前回のビットアドレスａｂｉに前回抽出された圧縮符号の圧縮符号長ｌｅｇを加算した値となる。なお、初期状態では、ビットアドレスａｂｉはａｂｉ＝０とする。
【０２６１】
バイトオフセットｂｙｏｓは、メモリに保持されている圧縮符号列のバイト境界を示す値であり、ビットアドレスａｂｉ／８の商で求められる。たとえば、バイトオフセットｂｙｏｓ＝０のときは、メモリに記憶されている先頭からの圧縮符号列をレジスタにセットし、バイトオフセットｂｙｏｓ＝１のときは、メモリに記憶されている先頭１バイト目からの圧縮符号列をレジスタにセットする。
【０２６２】
また、ビットオフセットｂｉｏｓは、マスクパターンのマスク位置（“ＦＦＦ”）をオフセットする値であり、ビットアドレスａｂｉ／８の余りである。たとえば、ビットオフセットｂｉｏｓ＝０のときは、マスク位置はシフトされないこととなり、マスクパターンは、“０ｘＦＦＦ０００００”となる。一方、ビットオフセットｂｉｏｓ＝４のときは、マスク位置は末尾方向に４ビットシフトすることとなり、マスクパターンは、“０ｘ０ＦＦＦ００００”となる。
【０２６３】
レジスタシフト数ｒｓは、マスクパターンとのＡＮＤ演算後のレジスタ内の圧縮符号列を末尾方向にシフトするビット数であり、ｒｓ＝３２−１２−ｂｉｏｓで求められる。このシフトにより、シフト後のレジスタの末尾ｍビットのビット列を対象ビット列として抽出する。対象ビット列の抽出後はレジスタをクリアする。
【０２６４】
なお、図５３−１〜図５３−５において、メモリには図３４に示した圧縮符号列が保持されているものとする。また、図５３−１〜図５３−５のメモリ内のブロックは１バイトのビット列を示しており、内部の数字は、バイト境界となるバイト位置を示している。
【０２６５】
図５３−１は、初期状態（（Ａ）の状態）を示している。（Ａ）では、ビットアドレスａｂｉ＝０により、バイトオフセットｂｙｏｓ＝０、ビットオフセットｂｉｏｓ＝０となる。バイトオフセットｂｙｏｓ＝０により、メモリに保持されている圧縮符号列のうち先頭から４バイト分（図中、網掛け）の圧縮符号列をレジスタにセットする。
【０２６６】
また、ビットオフセットｂｉｏｓ＝０により、マスクパターンは、“０ｘＦＦＦ０００００”である。したがって、レジスタにセットされた圧縮符号列とマスクパターン “０
ｘＦＦＦ０００００”を論理積（ＡＮＤ）演算することにより、ＡＮＤ結果が得られる。
【０２６７】
また、ビットオフセットｂｉｏｓ＝０により、レジスタシフト数ｒｓは、ｒｓ＝３２−ｍ―ｂｉｏｓ＝３２−１２−０＝２０となる。したがって、レジスタ内のＡＮＤ結果を末尾方向に２０ビット分シフトする。このシフトによりレジスタには、“１１０００１００１１００”が残されるため、末尾１２ビットを対象ビット列として抽出する。この場合は、“１１０００１００１１００”が対象ビット列として抽出される。抽出後、レジスタはクリアされる。
【０２６８】
図２７に示したように、無節点ハフマン木Ｈ２の根の構造体セルＣ（１，１）には、葉Ｌ１〜Ｌ１２９５へのポインタが格納されている。したがって、無節点ハフマン木Ｈ２の根の構造体セルＣ（１，１）の中から、抽出された対象ビット列“１１０００１００１１００”と一致する葉Ｌ♯へのポインタ（枝番号）を探索する。この場合、葉Ｌ３４２１へのポインタ群の中の１つと一致するため、該当する葉Ｌ３４２１へのポインタを読み出して、葉Ｌ３４２１の構造体にアクセスする。
【０２６９】
葉Ｌ３４２１の構造体には、文字コード“０ｘ２１６Ｂ”（文字：「次」に相当）が格納されているため、当該文字コード“０ｘ２１６Ｂ”を抽出して伸長バッファ５１２０に格納する。また、葉Ｌ３４２１の構造体には、文字コード“０ｘ２１６Ｂ”の圧縮符号長ｌｅｇ（＝１２ビット）も格納されているため、文字コード“０ｘ２１６Ｂ”の圧縮符号長ｌｅｇも抽出する。この抽出された圧縮符号長ｌｅｇによりビットアドレスａｂｉを更新する。この場合、更新後のビットアドレスａｂｉはａｂｉ＝０＋１２＝１２となる。
【０２７０】
図５３−２は、図５３−１に示した（Ａ）の状態からレジスタをバイトオフセットｂｉｏｓ分シフトした場合の伸長処理（（Ｂ）の状態）を示している。前回である（Ａ）のビットアドレスａｂｉはａｂｉ＝０、圧縮符号長ｌｅｇは１２ビットであるため、（Ｂ）のビットアドレスａｂｉはａｂｉ＝１２ビットとなる。
【０２７１】
また、このビットアドレスａｂｉ＝１２により、バイトオフセットｂｙｏｓ＝１、ビットオフセットｂｉｏｓ＝４となる。バイトオフセットｂｙｏｓ＝１により、メモリに保持されている圧縮符号列のうち先頭１バイト目から４バイト分（図中、網掛け）の圧縮符号列をレジスタにセットする。
【０２７２】
また、ビットオフセットｂｉｏｓ＝４により、マスクパターンは、“０ｘ０ＦＦＦ００００”である。したがって、レジスタにセットされた圧縮符号列とマスクパターン“０ｘ０ＦＦＦ００００”を論理積（ＡＮＤ）演算することにより、ＡＮＤ結果が得られる。
【０２７３】
また、ビットオフセットｂｉｏｓ＝４により、レジスタシフト数ｒｓは、ｒｓ＝３２−ｍ―ｂｉｏｓ＝３２−１２−４＝１６となる。したがって、レジスタ内のＡＮＤ結果を末尾方向に１６ビット分シフトする。このシフトによりレジスタには、“０００００１０００１００１０１０”が残されるため、末尾１２ビットを対象ビット列として抽出する。この場合は、“０１０００１００１０１０”が対象ビット列として抽出される。抽出後、レジスタはクリアされる。
【０２７４】
図２７に示したように、無節点ハフマン木Ｈ２の根の構造体セルＣ（１，１）には、葉Ｌ１〜Ｌ１２９５へのポインタが格納されている。したがって、無節点ハフマン木Ｈ２の根の構造体セルＣ（１，１）の中から、抽出された対象ビット列“０１０００１００１０１０”と一致する葉Ｌ♯へのポインタ（枝番号）を探索する。この場合、対象ビット列“０１０００１００１０１０”が葉Ｌ２４へのポインタ群の中の１つと一致するため、該当する葉Ｌ２４へのポインタを読み出して、葉Ｌ２４の構造体にアクセスする。
【０２７５】
葉Ｌ２４の構造体には、文字コード“０ｘ６Ｅ３０”（文字：「の」に相当）が格納されているため、当該文字コード“０ｘ６Ｅ３０”を抽出して伸長バッファ５１２０に格納する。また、葉Ｌ２４の構造体には、文字コード“０ｘ６Ｅ３０”の圧縮符号長ｌｅｇ（＝８ビット）も格納されているため、文字コード“０ｘ６Ｅ３０”の圧縮符号長ｌｅｇも抽出する。この抽出された圧縮符号長ｌｅｇによりビットアドレスａｂｉを更新する。この場合、更新後のビットアドレスａｂｉはａｂｉ＝１２＋８＝２０となる。
【０２７６】
図５３−３は、図５３−２に示した（Ｂ）の状態からレジスタをバイトオフセットｂｉｏｓ分シフトした場合の伸長処理（（Ｃ）の状態）を示している。前回である（Ｂ）のビットアドレスａｂｉはａｂｉ＝１２、圧縮符号長ｌｅｇは８ビットであるため、（Ｃ）のビットアドレスａｂｉはａｂｉ＝２０ビットとなる。
【０２７７】
また、このビットアドレスａｂｉ＝２０により、バイトオフセットｂｙｏｓ＝２、ビットオフセットｂｉｏｓ＝４となる。バイトオフセットｂｙｏｓ＝２により、メモリに保持されている圧縮符号列のうち先頭２バイト目から４バイト分（図中、網掛け）の圧縮符号列をレジスタにセットする。
【０２７８】
また、ビットオフセットｂｉｏｓ＝４により、マスクパターンは、“０ｘ０ＦＦＦ００００”である。したがって、レジスタにセットされた圧縮符号列とマスクパターン“０ｘ０ＦＦＦ００００”を論理積（ＡＮＤ）演算することにより、ＡＮＤ結果が得られる。
【０２７９】
また、ビットオフセットｂｉｏｓ＝４により、レジスタシフト数ｒｓは、ｒｓ＝３２−ｍ―ｂｉｏｓ＝３２−１２−４＝１６となる。したがって、レジスタ内のＡＮＤ結果を末尾方向に１６ビット分シフトする。このシフトによりレジスタには、“００００１０１００１００００００”が残されるため、末尾１２ビットを対象ビット列として抽出する。この場合は、“１０１００１００００００”が対象ビット列として抽出される。抽出後、レジスタはクリアされる。
【０２８０】
図２７に示したように、無節点ハフマン木Ｈ２の根の構造体セルＣ（１，１）には、葉Ｌ１〜Ｌ１２９５へのポインタが格納されている。したがって、無節点ハフマン木Ｈ２の根の構造体セルＣ（１，１）の中から、抽出された対象ビット列“１０１００１００００００”と一致する葉Ｌ♯へのポインタ（枝番号）を探索する。この場合、対象ビット列“１０１００１００００００”が葉Ｌ１６７へのポインタ群の中の１つと一致するため、該当する葉Ｌ１６７へのポインタを読み出して、葉Ｌ１６７の構造体にアクセスする。
【０２８１】
葉Ｌ１６７の構造体には、分割文字コード“０ｘ５１”が格納されているため、当該文字コード“０ｘ５１”を抽出して伸長バッファ５１２０に格納する。また、葉Ｌ１６７の構造体には、文字コード“０ｘ５１”の圧縮符号長ｌｅｇ（＝１２ビット）も格納されているため、文字コード“０ｘ５１”の圧縮符号長ｌｅｇも抽出する。この抽出された圧縮符号長ｌｅｇによりビットアドレスａｂｉを更新する。この場合、更新後のビットアドレスａｂｉはａｂｉ＝２０＋１２＝３２となる。
【０２８２】
図５３−４は、図５３−３に示した（Ｃ）の状態からレジスタをバイトオフセットｂｉｏｓ分シフトした場合の伸長処理（（Ｄ）の状態）を示している。前回である（Ｃ）のビットアドレスａｂｉはａｂｉ＝２０、圧縮符号長ｌｅｇは１２ビットであるため、（Ｄ）のビットアドレスａｂｉはａｂｉ＝３２ビットとなる。
【０２８３】
また、このビットアドレスａｂｉ＝３２により、バイトオフセットｂｙｏｓ＝４、ビットオフセットｂｉｏｓ＝０となる。バイトオフセットｂｙｏｓ＝４により、メモリに保持されている圧縮符号列のうち先頭４バイト目から４バイト分（図中、網掛け）の圧縮符号列をレジスタにセットする。
【０２８４】
また、ビットオフセットｂｉｏｓ＝０により、マスクパターンは、“０ｘＦＦＦ０００００”である。したがって、レジスタにセットされた圧縮符号列とマスクパターン“０ｘＦＦＦ０００００”を論理積（ＡＮＤ）演算することにより、ＡＮＤ結果が得られる。
【０２８５】
また、ビットオフセットｂｉｏｓ＝０により、レジスタシフト数ｒｓは、ｒｓ＝３２−ｍ―ｂｉｏｓ＝３２−１２−０＝２０となる。したがって、レジスタ内のＡＮＤ結果を末尾方向に２０ビット分シフトする。このシフトによりレジスタには、“１０１０００１１０１０１”が残されるため、末尾１２ビットを対象ビット列として抽出する。この場合は、“１０１０００１１０１０１”が対象ビット列として抽出される。抽出後、レジスタはクリアされる。
【０２８６】
図２７に示したように、無節点ハフマン木Ｈ２の根の構造体セルＣ（１，１）には、葉Ｌ１〜Ｌ１２９５へのポインタが格納されている。したがって、無節点ハフマン木Ｈ２の根の構造体セルＣ（１，１）の中から、抽出された対象ビット列“１０１００１００００００”と一致する葉Ｌ♯へのポインタ（枝番号）を探索する。この場合、対象ビット列“１０１００１００００００”が葉Ｌ１５６へのポインタ群の中の一つと一致するため、葉Ｌ１５６へのポインタを読み出して、葉Ｌ１５６の構造体にアクセスする。
【０２８７】
葉Ｌ１５６の構造体には、分割文字コード“０ｘ４Ｅ”が格納されているため、当該文字コード“０ｘ４Ｅ”を抽出して伸長バッファ５１２０に格納する。また、葉Ｌ１５６の構造体には、文字コード“０ｘ４Ｅ”の圧縮符号長ｌｅｇ（＝１２ビット）も格納されているため、文字コード“０ｘ４Ｅ”の圧縮符号長ｌｅｇも抽出する。この抽出された圧縮符号長ｌｅｇによりビットアドレスａｂｉを更新する。この場合、更新後のビットアドレスａｂｉはａｂｉ＝３２＋１２＝４４となる。
【０２８８】
図５３−５は、図５３−４に示した（Ｄ）の状態からレジスタをバイトオフセットｂｉｏｓ分シフトした場合の伸長処理（（Ｅ）の状態）を示している。前回である（Ｄ）のビットアドレスａｂｉはａｂｉ＝３２、圧縮符号長ｌｅｇは１２ビットであるため、（Ｅ）のビットアドレスａｂｉはａｂｉ＝４４ビットとなる。
【０２８９】
また、このビットアドレスａｂｉ＝４４により、バイトオフセットｂｙｏｓ＝５、ビットオフセットｂｉｏｓ＝４となる。バイトオフセットｂｙｏｓ＝５により、メモリに保持されている圧縮符号列のうち先頭５バイト目から４バイト分（図中、網掛け）の圧縮符号列をレジスタにセットする。
【０２９０】
また、ビットオフセットｂｉｏｓ＝４により、マスクパターンは、“０ｘ０ＦＦＦ００００”である。したがって、レジスタにセットされた圧縮符号列とマスクパターン“０ｘ０ＦＦＦ００００”を論理積（ＡＮＤ）演算することにより、ＡＮＤ結果が得られる。
【０２９１】
また、ビットオフセットｂｉｏｓ＝４により、レジスタシフト数ｒｓは、ｒｓ＝３２−ｍ―ｂｉｏｓ＝３２−１２−４＝１６となる。したがって、レジスタ内のＡＮＤ結果を末尾方向に１６ビット分シフトする。このシフトによりレジスタには、“０００００１１１１０１１１１１１”が残されるため、末尾１２ビットを対象ビット列として抽出する。この場合は、“０１１１１０１１１１１１”が対象ビット列として抽出される。抽出後、レジスタはクリアされる。
【０２９２】
図２７に示したように、無節点ハフマン木Ｈ２の根の構造体セルＣ（１，１）には、葉Ｌ１〜Ｌ１２９５へのポインタが格納されている。したがって、無節点ハフマン木Ｈ２の根の構造体セルＣ（１，１）の中から、抽出された対象ビット列“０１１１１０１１１１１１”と一致する葉Ｌ♯へのポインタ（枝番号）を探索する。この場合、対象ビット列“０１１１１０１１１１１１”が葉Ｌ２０００へのポインタと一致するため、葉Ｌ２０００へのポインタを読み出して、葉Ｌ２０００の構造体にアクセスする。
【０２９３】
葉Ｌ２０００の構造体には、文字コード“０ｘ６Ｆ３０”が格納されているため、当該文字コード“０ｘ６Ｆ３０”を抽出して伸長バッファ５１２０に格納する。また、葉Ｌ２０００の構造体には、文字コード“０ｘ６Ｆ３０”の圧縮符号長ｌｅｇ（＝８ビット）も格納されているため、文字コード“０ｘ６Ｆ３０”の圧縮符号長ｌｅｇも抽出する。この抽出された圧縮符号長ｌｅｇによりビットアドレスａｂｉを更新する。この場合、更新後のビットアドレスａｂｉはａｂｉ＝４４＋８＝５２となる。
【０２９４】
また、図５１において、照合部５１１０は、検索キーワードの文字コード列と伸長バッファ５１２０に格納された伸長コード列とを照合する機能を有する。照合部５１１０は、伸長コード格納部５１０９により伸長コードが順次伸長バッファ５１２０に格納される都度、当該伸長コードに対し照合をおこなう。これにより、伸長処理と同時に検索キーワードとの照合を実行することができ、高速処理を実現することができる。
【０２９５】
照合部５１１０では、具体的には、たとえば、伸長バッファ５１２０に順次格納される伸長コードのうち、照合フラグがＯＮである伸長コードについて照合をおこなう。照合対象となる文字コードは、検索キーワード内の文字コードである。伸長コードとの照合対象は、伸長コードの伸長コード長により決定する。たとえば、伸長コードの伸長コード長が１６ビットである場合、同じように、１６ビットの文字コードが照合対象となる。一方、伸長コード長が８ビットである場合、同じように、８ビットの文字コード（分割文字コード）が照合対象となる。なお、照合対象の開始位置は、検索キーワードの先頭である。
【０２９６】
照合部５１１０は、照合一致する都度、照合対象となる文字コードを、後続の文字コードにシフトする。途中で、照合不一致の伸長コードが出現したり、照合フラグＯＦＦの伸長コードが出現したりすると、検索キーワードの先頭から照合をやり直す。
【０２９７】
文字列置換部５１１１は、照合部５１１０により検索キーワードと一致する文字列が照合された場合、照合された文字列を強調表示するように文字列置換する機能を有する。具体的には、たとえば、照合一致された伸長コード列を、強調表示するためのタグで挟み込む。これにより、検索結果を表示する際に、照合一致された伸長コード列に相当する文字列が強調表示されることとなる。
【０２９８】
出力部５１１２は、伸長バッファ５１２０に格納されている伸長コード列をファイル化して、伸長後の対象ファイル（伸長ファイル）として出力する。出力された伸長ファイルは、記憶装置に記憶されたり、ディスプレイに表示される。ディスプレイに表示される場合、検索キーワードに一致する伸長コード列は、文字列置換部５１１１により、強調表示するタグに挟まれているため、ディスプレイ表示時に強調表示される。
【０２９９】
図５４−１〜図５４−３は、照合処理の具体例を示す説明図である。入力バッファ５４００には検索キーワード『次の兎』の文字コード列である“２１６Ｂ６Ｅ３０５１４Ｅ”が格納されているものとする。
【０３００】
図５４−１の（Ａ）において、伸長バッファ５１２０に文字『次』の文字コード“０ｘ２１６Ｂ”が伸長コードとして格納された場合、伸長コード“０ｘ２１６Ｂ”を格納する葉Ｌ♯の構造体の照合フラグのＯＮ／ＯＦＦを判断する。この場合はＯＮであるため、伸長コード“０ｘ２１６Ｂ”について照合をおこなう。
【０３０１】
また、伸長コード“０ｘ２１６Ｂ”は１６ビット文字コードであるため、照合対象となる文字コードは、先頭から１６ビット分の文字コードとなる。本例の場合、文字『次』の文字コード“０ｘ２１６Ｂ”である。この場合、伸長コードと照合対象の文字コードは一致するため、次に伸長バッファ５１２０に格納される伸長コードについて同様の照合処理をおこなう。
【０３０２】
（Ｂ）において、伸長バッファ５１２０に文字『の』の文字コード“０ｘ６Ｅ３０”が伸長コードとして格納された場合、伸長コード“０ｘ６Ｅ３０”を格納する葉Ｌ♯の構造体の照合フラグのＯＮ／ＯＦＦを判断する。この場合はＯＮであるため、伸長コード“０ｘ６Ｅ３０”について照合をおこなう。
【０３０３】
また、伸長コード“０ｘ６Ｅ３０”は１６ビット文字コードであるため、照合対象となる文字コードは、文字コード“０ｘ２１６Ｂ”から１６ビット分シフトした文字コードとなる。本例の場合、文字『の』の文字コード“０ｘ６Ｅ３０”である。この場合、伸長コードと照合対象の文字コードは一致するため、次に伸長バッファ５１２０に格納される伸長コードについて同様の照合処理をおこなう。
【０３０４】
（Ｃ）において、伸長バッファ５１２０に文字『兎』の分割文字コード“０ｘ５１”が伸長コードとして格納された場合、伸長コード“０ｘ５１”を格納する葉Ｌ♯の構造体の照合フラグのＯＮ／ＯＦＦを判断する。この場合はＯＮであるため、伸長コード“０ｘ５１”について照合をおこなう。
【０３０５】
また、伸長コード“０ｘ５１”は８ビット文字コードであるため、照合対象となる文字コードは、文字コード“０ｘ６Ｅ３０”から８ビット分シフトした文字コードとなる。本例の場合、分割文字コード“０ｘ５１”である。この場合、伸長コードと照合対象の文字コードは一致するため、次に伸長バッファ５１２０に格納される伸長コードについて同様の照合処理をおこなう。
【０３０６】
（Ｄ）において、伸長バッファ５１２０に文字『兎』の分割文字コード“０ｘ４Ｅ”が伸長コードとして格納された場合、伸長コード“０ｘ４Ｅ”を格納する葉Ｌ♯の構造体の照合フラグのＯＮ／ＯＦＦを判断する。この場合はＯＮであるため、伸長コード“０ｘ４Ｅ”について照合をおこなう。
【０３０７】
また、伸長コード“０ｘ４Ｅ”は８ビット文字コードであるため、照合対象となる文字コードは、文字コード“０ｘ５１”から８ビット分シフトした文字コードとなる。本例の場合、分割文字コード“０ｘ４Ｅ”である。この場合、伸長コードと照合対象の文字コードは一致する。そして、検索キーワード内の文字コード列をすべて照合し、一致したため、伸長バッファ５１２０内の伸長コード列“２１６Ｂ６Ｅ３０５１４Ｅ”を強調表示用のタグで挟み込む。これにより、検索結果を表示する際に、検索キーワードに一致する文字列として強調表示することができる。
【０３０８】
図５４−２では、照合一致の途中で不一致となる文字コードの出現例１を示している。（Ｅ）では、図５４−１の（Ａ），（Ｂ）のように、伸長コード“２１６Ｂ”、“６Ｅ３０”が照合一致しているものとする。
【０３０９】
（Ｅ）において、伸長バッファ５１２０に文字『者』の文字コード“０ｘ０５８０”が伸長コードとして格納された場合、伸長コード“０ｘ０５８０”を格納する葉Ｌ♯の構造体の照合フラグのＯＮ／ＯＦＦを判断する。この場合はＯＦＦであるため、伸長コード“０ｘ０５８０”について照合をおこなわない。また、照合フラグがＯＦＦのため、照合対象となる文字コードは先頭に戻される。
【０３１０】
（Ｆ）において、伸長バッファ５１２０に文字『は』の文字コード“０ｘ６Ｆ３０”が伸長コードとして格納された場合、伸長コード“０ｘ６Ｆ３０”を格納する葉Ｌ♯の構造体の照合フラグのＯＮ／ＯＦＦを判断する。この場合はＯＦＦであるため、伸長コード“０ｘ６Ｆ３０”について照合をおこなわない。また、照合フラグがＯＦＦのため、照合対象となる文字コードは先頭に戻される。このように、照合フラグがＯＦＦである伸長コードについては照合がおこなわれないため、無駄な照合処理を防止することができ、照合処理の高速化を実現することができる。
【０３１１】
図５４−３では、照合一致の途中で不一致となる文字コードの出現例２を示している。（Ｇ）では、図５４−１の（Ａ），（Ｂ）のように、伸長コード“２１６Ｂ”、“６Ｅ３０”が照合一致しているものとする。
【０３１２】
（Ｇ）において、伸長バッファ５１２０に２回目の文字『次』の文字コード“０ｘ２１６Ｂ”が伸長コードとして格納された場合、伸長コード“０ｘ２１６Ｂ”を格納する葉Ｌ♯の構造体の照合フラグのＯＮ／ＯＦＦを判断する。この場合はＯＮであるため、伸長コード“０ｘ２１６Ｂ”について照合をおこなう。
【０３１３】
また、伸長コード“０ｘ２１６Ｂ”（２回目）は１６ビット文字コードであるため、照合対象となる文字コードは、文字コード“０ｘ６Ｅ３０”から１６ビット分シフトした文字コードとなる。本例の場合、文字『の』の文字コード“０ｘ５１４Ｅ”である。この場合、伸長コードと照合対象の文字コードは不一致であるが、伸長コード“０ｘ２１６Ｂ”（２回目）についての照合フラグはＯＮであり、また、１６ビット文字コードである。
【０３１４】
したがって、（Ｈ）において、照合対象を検索キーワードの先頭から１６ビットの文字コード“０ｘ２１６Ｂ”と照合する。この場合、一致するため、次に伸長バッファ５１２０に格納される伸長コードについて照合処理をおこなうことになる。
【０３１５】
（検索キーワード圧縮処理手順）
図５５は、検索キーワード圧縮処理手順を示すフローチャートである。まず、入力部５１０１が、検索キーワードが入力されるのを待ち受ける（ステップＳ５５０１：Ｎｏ）。そして、検索キーワードが入力された場合（ステップＳ５５０１：Ｙｅｓ）、入力部５１０１が、検索キーワードを単字分解して（ステップＳ５５０２）、検索キーワード圧縮部５１０２が、無節点ハフマン木Ｈ２により検索キーワードを構成する各文字をハフマン圧縮する圧縮処理を実行する（ステップＳ５５０３）。圧縮処理（ステップＳ５５０３）は、図３４および図３６〜図３８に示した処理と同一であるため、説明を省略する。これにより、検索キーワード圧縮処理を終了する。
【０３１６】
（ファイル絞込み処理手順）
図５６は、ファイル絞込み処理手順を示すフローチャートである。まず、図５５に示した圧縮処理（ステップＳ５５０３）において、葉Ｌ♯の構造体へのアクセスがあったか否かを判断する（ステップＳ５６０１）。葉Ｌ♯への構造体へのアクセスがあった場合（ステップＳ５６０１：Ｙｅｓ）、葉Ｌ♯の構造体の照合フラグをＯＮにする（ステップＳ５６０２）。そして、葉Ｌ♯の構造体から圧縮符号マップへのポインタと出現率領域を取得する（ステップＳ５６０３）。
【０３１７】
つぎに、取得した圧縮符号マップへのポインタにより圧縮符号マップにアクセスし（ステップＳ５６０４）、アクセス先の圧縮符号マップ伸長処理を実行して（ステップＳ５６０５）、ステップＳ５６０１に戻る。アクセス先の圧縮符号マップ伸長処理（ステップＳ５６０５）については後述する。ステップＳ５６０１において、葉Ｌ♯の構造体へのアクセスがない場合（ステップＳ５６０１：Ｎｏ）、図５５に示した検索キーワード圧縮処理が終了したか否かを判断する（ステップＳ５６０６）。
【０３１８】
終了していない場合（ステップＳ５６０６：Ｎｏ）、ステップＳ５６０１に戻る。一方、終了した場合（ステップＳ５６０６：Ｙｅｓ）、図５２に示したように、ＡＮＤ演算による圧縮ファイルの特定を実行する（ステップＳ５６０７）。このように特定された圧縮ファイルを「特定圧縮ファイル」と称す。これにより、ファイル絞込み処理を終了する。
【０３１９】
（アクセス先の圧縮符号マップ伸長処理手順）
図５７は、図５６に示したアクセス先の圧縮符号マップ伸長処理（ステップＳ５６０５）の詳細な処理手順を示すフローチャートである。まず、図４１に示した圧縮パターンテーブルを参照して、ステップＳ５６０３で取得した出現率領域が非圧縮領域であるか否かを判断する（ステップＳ５７０１）。非圧縮領域である場合（ステップＳ５７０１：Ｙｅｓ）、伸長処理を実行せずに、ステップＳ５６０１に戻る。
【０３２０】
一方、非圧縮領域でない場合（ステップＳ５７０１：Ｎｏ）、出現率領域に該当する圧縮符号マップ用ハフマン木を選択する（ステップＳ５７０２）。そして、ステップＳ５６０３で取得した圧縮符号マップへのポインタによるアクセス先の圧縮符号マップＭを、選択された圧縮符号マップ用ハフマン木によりハフマン伸長する（ステップＳ５７０３）。そして、出現率が５０％以上であるかを判断する（ステップＳ５７０４）。
【０３２１】
具体的には、出現率領域は、出現率に応じて決められているため（図４０を参照）、出現率領域がＡ〜Ｅである場合、取得文字コードの出現率が５０％以上でないと判断する。一方、出現率領域がＡ’〜Ｅ’である場合、取得文字コードの出現率が５０％以上であると判断する。
【０３２２】
そして、出現率が５０％以上である場合（ステップＳ５７０４：Ｙｅｓ）、ステップＳ４７０９にて反転させられているため、ステップＳ５７０３で伸長されたビット列を反転する（ステップＳ５７０５）。これにより、元のビット列に戻ることとなる。
【０３２３】
一方、ステップＳ５７０４において、出現率が５０％以上でない場合（ステップＳ５７０４：Ｎｏ）、ビット列反転（ステップＳ５７０５）をおこなうことなく、ステップＳ５６０１に戻る。
【０３２４】
このようなアクセス先の圧縮符号マップ伸長処理（ステップＳ５６０５）により、検索キーワードを構成する文字についての圧縮符号マップ内の圧縮符号列のみ伸長することができるため、検索に必要な圧縮符号列の伸長のみでよく、伸長効率の向上を図ることができる。
【０３２５】
（伸長処理手順）
図５８は、特定圧縮ファイル伸長処理手順を示すフローチャートである。まず、未処理の特定圧縮ファイルがあるか否かを判断する（ステップＳ５８０１）。未処理の特定圧縮ファイルがある場合（ステップＳ５８０１：Ｙｅｓ）、未処理の特定圧縮ファイルｆｔを１つ選択し（ステップＳ５８０２）、選択された特定圧縮ファイルｆｔをオープンする（ステップＳ５８０３）。そして、伸長処理を実行する（ステップＳ５８０４）。伸長処理（ステップＳ５８０４）の詳細については後述する。そして、選択された特定圧縮ファイルｆｔをクローズする（ステップＳ５８０５）。
【０３２６】
つぎに、選択された特定圧縮ファイルｆｔにおいて、ヒットしたか否かを判断する（ステップＳ５８０６）。具体的には、検索キーワードと一致する文字コード列があったか否かを判断する。ヒットした場合（ステップＳ５８０６：Ｙｅｓ）、特定圧縮ファイルを伸長した対象ファイル内に検索キーワードと一致する文字コード列が存在することとなり、伸長バッファ５１２０内のデータをファイル出力する（ステップＳ５８０７）。ヒットしなかった場合（ステップＳ５８０６：Ｎｏ）、ステップＳ５８０８に移行する。
【０３２７】
これにより、特定圧縮ファイルから伸長された対象ファイルを得ることができる。このあと、伸長バッファ５１２０をクリアして（ステップＳ５８０８）、ステップＳ５８０１に戻る。一方、ステップＳ５８０１において、未処理の特定圧縮ファイルがない場合（ステップＳ５８０１：Ｎｏ）、特定圧縮ファイル伸長処理を終了する。
【０３２８】
（伸長処理手順）
図５９および図６０は、無節点ハフマン木Ｈ２を用いた伸長処理手順を示すフローチャートである。図５９において、まず、ビットアドレスａｂｉをａｂｉ＝０とし（ステップＳ５９０１）、バイトオフセットｂｙｏｓを算出し（ステップＳ５９０２）、ビットオフセットｂｉｏｓを算出する（ステップＳ５９０３）。そして、バイトオフセットｂｙｏｓの位置からの圧縮符号列をレジスタにセットする（ステップＳ５９０４）。
【０３２９】
つぎに、マスクパターン“０ｘＦＦＦ０００００”をビットオフセットｂｉｏｓ分、末尾方向にシフトして（ステップＳ５９０５）、レジスタにセットされた圧縮符号列とのＡＮＤ演算をおこなう（ステップＳ５９０６）。このあと、レジスタシフト数ｒｓを算出して（ステップＳ５９０７）、ＡＮＤ演算後のレジスタをレジスタシフト数ｒｓ分、末尾にシフトする（ステップＳ５９０８）。
【０３３０】
ステップＳ５９０８のあと、図６０において、シフト後のレジスタから末尾ｍ（ｍ＝１２）ビットを対象ビット列として抽出する（ステップＳ６００１）。つぎに、無節点ハフマン木Ｈ２の根の構造体セルＣ（１，１）から枝番号となる葉Ｌ♯へのポインタを特定し（ステップＳ６００２）、ポイント先となる葉Ｌ♯の構造体に１パスでアクセスする（ステップＳ６００３）。そして、アクセス先の葉Ｌ♯の構造体から文字コードを抽出し（ステップＳ６００４）、抽出された文字コードを伸長バッファ５１２０に書き込む（ステップＳ６００５）。
【０３３１】
また、葉Ｌ♯の構造体から圧縮符号長ｌｅｇを抽出し（ステップＳ６００６）、ビットアドレスａｂｉを更新する（ステップＳ６００７）。このあと、メモリに圧縮符号列があるか否か、具体的には、マスクパターンによるマスク処理が施されていない圧縮符号列があるか否かを判断する（ステップＳ６００８）。たとえば、バイトオフセットｂｙｏｓに該当するバイト位置があるか否かにより判断する。圧縮符号列がある場合（ステップＳ６００８：Ｙｅｓ）、図５９のステップＳ５９０２に戻る。一方、圧縮符号列がない場合（ステップＳ６００８：Ｎｏ）、一連の伸長処理を終了する。
【０３３２】
このような伸長処理により、圧縮符号列からｍビット単位で圧縮符号を抽出することができ、さらに、無節点ハフマン木Ｈ２の根の構造体セルＣ（１，１）にアクセスすることで、該当する枝番号となる葉Ｌ♯へのポインタを特定することができる。そして、アクセス先となる葉Ｌ♯の構造体から文字コードを抽出することで、圧縮符号を伸長する。このように、無節点ハフマン木Ｈ２は、内部節点を有していないため、葉Ｌ♯へのポインタが特定されれば、１パスで葉Ｌ♯の構造体にアクセスすることができ、伸長速度の高速化を図ることができる。
【０３３３】
（照合処理手順）
図６１および図６２は、照合処理手順を示すフローチャートである。まず、図６１において、図５８のステップＳ５８０３における特定圧縮ファイルのオープンが検出されるまで待ち受け（ステップＳ６１０１：Ｎｏ）、特定圧縮ファイルのオープンが検出された場合（ステップＳ６１０１：Ｙｅｓ）、Ｃ＝０、Ｓ＝０に設定する（ステップＳ６１０２）。Ｃは、伸長バッファ５１２０内の現在位置であり、Ｓは、検索キーワードを保持している入力バッファ５４００内の現在位置である。
【０３３４】
そして、図６０のステップＳ６００３におけるポイント先となる葉Ｌ♯の構造体へのアクセスがあったか否かを判断する（ステップＳ６１０３）。アクセスがない場合（ステップＳ６１０３：Ｎｏ）、図５８のステップＳ５８０５において特定圧縮ファイルがクローズしたか否かを判断する（ステップＳ６１０４）。クローズしていない場合（ステップＳ６１０４：Ｎｏ）、ステップＳ６１０３に戻る。クローズした場合（ステップＳ６１０４：Ｙｅｓ）、照合処理を終了する。
【０３３５】
一方、葉Ｌ♯の構造体にアクセスがあった場合（ステップＳ６１０３：Ｙｅｓ）、アクセス先の葉Ｌ♯の構造体内の照合フラグがＯＮであるか否かを判断する（ステップＳ６１０５）。ＯＮでない場合（ステップＳ６１０５：Ｎｏ）、今回伸長バッファ５１２０に格納された伸長コード（アクセス先の葉Ｌ♯の構造体内の文字コードに一致）とは照合をおこなわないため、伸長バッファ５１２０内の現在位置Ｃに、今回伸長バッファ５１２０に格納された伸長コードの伸長コード長Ｌｃを加算することで、現在位置Ｃを更新する（ステップＳ６１０６）。これにより、再度、現在位置Ｃから照合をおこなうことができる。
【０３３６】
このあと、入力バッファ５４００内の現在位置ＳをＳ＝０、開始フラグＦｓをＦｓ＝０、開始フラグＦｓ＝１になったときの伸長バッファ５１２０の現在位置ＣｓをＣｓ＝０にして（ステップＳ６１０７）、ステップＳ６１０３に戻る。なお、開始フラグＦｓとは、検索キーワードの先頭文字の文字コードが一致したときに立てる（Ｆｓ＝１にする）フラグである。Ｃｓはそのときの現在位置Ｃである。これにより、図５４−２に示したような照合処理をおこなうことができる。一方、ステップＳ６１０５において、照合フラグがＯＮである場合（ステップＳ６１０５：Ｙｅｓ）、図６２のステップＳ６２０１に移行する。
【０３３７】
図６２において、照合対象を設定する（ステップＳ６２０１）。具体的には、検索キーワードの文字コード列のうち、現在位置Ｃから今回格納された伸長コードの文字コード長分の文字コードを、伸長コードとの照合対象に設定する。
【０３３８】
そして、位置Ｓからの伸長コードと位置Ｃからの照合対象の文字コードとを照合（一致判定）する（ステップＳ６２０２）。一致する場合（ステップＳ６２０２：Ｙｅｓ）、開始フラグＦｓがＦｓ＝１であるか否かを判断する（ステップＳ６２０３）。Ｆｓ＝１である場合（ステップＳ６２０３：Ｙｅｓ）、ステップＳ６２０６に移行する。一方、Ｆｓ＝１でない場合（ステップＳ６２０３：Ｎｏ）、開始フラグＦｓをＦｓ＝１にし（ステップＳ６２０４）、Ｃｓ＝Ｃに設定する（ステップＳ６２０５）。これにより、検索キーワードの先頭の文字コードと一致した伸長コードの位置を記憶することができる。
【０３３９】
ステップＳ６２０６において、入力バッファ５４００内の現在位置Ｓに今回伸長バッファ５１２０に格納された伸長コードの伸長コード長Ｌｃを加算することで、現在位置Ｓを更新する（ステップＳ６２０６）。そして、Ｓ＝Ｌｓであるか否かを判断する（ステップＳ６２０７）。Ｌｓは検索キーワードの文字コード長である。すなわち、現在位置Ｓが検索キーワードの末尾であるか否かを判断する。Ｓ＝Ｌｓである場合（ステップＳ６２０７：Ｙｅｓ）、検索キーワードと一致する文字列が伸長バッファ５１２０から得られたため、当該伸長コード列を文字列置換する（ステップＳ６２０８）。
【０３４０】
このあと、入力バッファ５４００内の現在位置ＳをＳ＝０、開始フラグＦｓをＦｓ＝０、開始フラグＦｓ＝１になったときの伸長バッファ５１２０の現在位置ＣｓをＣｓ＝０にする（ステップＳ６２０９）。そして、伸長バッファ５１２０内の現在位置Ｃを文字列置換後の最後尾に設定する（ステップＳ６２１０）。これにより、図５４−１に示したような照合処理をおこなうことができる。このあと、ステップＳ６１０３に戻る。
【０３４１】
また、ステップＳ６２０７において、Ｓ＝Ｌｓでない場合（ステップＳ６２０７：Ｎｏ）、伸長コード列の長さが検索キーワードの文字コード長に到達していないため、ステップＳ６２０８〜Ｓ６２１０を実行せずに、ステップＳ６１０３に戻る。
【０３４２】
また、ステップＳ６２０２において、位置Ｓからの伸長コードと位置Ｃからの照合対象の文字コードとが不一致である場合（ステップＳ６２０２：Ｎｏ）、伸長バッファ５１２０での現在位置ＣをＣ＝Ｃｓとし、入力バッファ５４００での現在位置ＳをＳ＝０にする（ステップＳ６２１１）。そして、ステップＳ６２０２と同様、照合対象を設定する（ステップＳ６２１２）。具体的には、検索キーワードの文字コード列のうち、現在位置Ｃ（Ｃ＝Ｃｓ）から今回格納された伸長コードの文字コード長分の文字コードを、伸長コードとの照合対象に設定する。これにより、図５４−３に示したような照合処理をおこなうことができる。
【０３４３】
このあと、ステップＳ６２０２と同様、位置Ｓからの伸長コードと位置Ｃからの照合対象の文字コードとを照合（一致判定）する（ステップＳ６２１３）。一致する場合（ステップＳ６２１３：Ｙｅｓ）、ステップＳ６２０３に移行する。
【０３４４】
一方、一致しない場合（ステップＳ６２１３：Ｎｏ）、入力バッファ５４００内の現在位置Ｓ（Ｓ＝０）に今回伸長バッファ５１２０に格納された伸長コードの伸長コード長Ｌｃを加算することで、現在位置Ｓを更新する（ステップＳ６２１４）。このあと、開始フラグＦｓをＦｓ＝０、ＣｓをＣｓ＝０にして（ステップＳ６２１５）、ステップＳ６１０３に移行する。
【０３４５】
このような照合処理により、伸長処理が終了してから照合するのではなく、伸長処理をしながら検索キーワードとの照合をおこなうことができ、照合処理の高速化を実現することができる。
【０３４６】
なお、上述の例では、伸長処理をしながら検索キーワードとの照合をおこなうこととしたが、たとえば、国際公開２００８／１４２８００号パンフレットのように、検索キーワードを圧縮した圧縮符号群（圧縮キーワード）のまま、照合をおこなって、照合した圧縮符号列を伸長することとしてもよい。このようにしても、照合処理の高速化を実現することができる。
【０３４７】
以上説明したように、本実施の形態によれば、文字種を約１３００に削減することで省メモリ化を図ることができる。また、文字種の削減により、無節点ハフマン木Ｈ２を生成することができる。この無節点ハフマン木Ｈ２を用いて圧縮伸長をおこなうことにより、１２ビット（つまり、１文字）をまとめて１回で判定することができ、圧縮処理や伸長処理の高速化を実現することができる。
【０３４８】
また、圧縮処理と圧縮符号マップ生成処理とをハフマン木探索で共通化することで、圧縮処理と連動して、圧縮符号マップ群Ｍｓの生成を並列実行することができる。したがって、プログラムステップと走行ステップの短縮化を図ることができ、対象ファイルＦｓの圧縮処理と圧縮符号マップ群Ｍｓの生成処理との高速化を図ることができる。また、出現頻度が低い低位文字コードは８ビットの分割文字コードに分割して圧縮処理が実行されるため、分割文字コードについても圧縮処理と連動して圧縮符号マップ群Ｍｓを生成することができる。
【０３４９】
また、圧縮符号マップ群Ｍｓの圧縮領域となるビット列を、該当する文字の出現率に応じた圧縮率で圧縮することで、圧縮効率の向上を図るとともに、省メモリ化を図ることができる。また、圧縮符号マップ用ハフマン木４２００において、出現率領域に応じて、文字コードが存在しないことを意味する“０”の連続数を多くしている。したがって、文字コードの出現率に応じて圧縮符号マップＭｓの圧縮効率の向上を図ることができる。
【０３５０】
また、圧縮領域となるビット列の配列を先頭からファイル番号ｐの降順にすることで、対象ファイルが追加されても、ファイル番号の連続性を保持したまま、圧縮領域となるビット列を圧縮することができる。これにより、対象ファイルＦの追加機能と圧縮符号マップ群Ｍｓの圧縮機能のいずれかを選ぶことなく、両機能を実装することができる。したがって、対象ファイルの追加という自由度の向上と圧縮符号マップ群Ｍｓの圧縮という省メモリ化を実現することができる。
【０３５１】
また、対象ファイルＦの削除の有無をあらわす削除マップＭｄを用いることで、圧縮符号マップ群を用いた圧縮ファイルの絞込み時において、削除された対象ファイルを絞り込みから除外することができる。これにより、圧縮ファイルの絞込み精度の向上を図るとともに、伸長処理の高速化を実現することができる。
【０３５２】
また、伸長処理に連動して、検索キーワードとの照合を並列実行することにより、検索キーワードとの一致判定の高速化を実現することができる。すなわち、圧縮ファイルｆの伸長中に検索キーワードの一致判定をおこなっているため、圧縮ファイルが伸長された時点で、検索キーワードに一致する伸長コード列があるか否かがわかることとなる。
【０３５３】
また、照合に先立って、検索キーワードを構成する文字コードを格納する葉Ｌ♯の構造体の照合フラグをＯＮに設定することで、照合処理の際、照合フラグがＯＮである葉Ｌ♯の構造体から得られた伸長コードとの照合を回避することができる。したがって、一致しないと分かっている伸長コードとの照合を実行する必要がないため、照合処理の高速化を実現することができる。
【０３５４】
なお、本実施の形態で説明した情報処理方法は、あらかじめ用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。このプログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。またこのプログラムは、インターネット等のネットワークを介して配布することが可能な媒体であってもよい。
【０３５５】
上述した実施の形態に関し、さらに以下の付記を開示する。
【０３５６】
（付記１）コンピュータを、
文字コードごとに当該文字コードの対象ファイル群での存否をあらわすビット列を有する圧縮符号マップ群と、前記文字コードに対応する葉に当該文字コードの圧縮符号マップへのポインタが格納されており前記文字コードを当該文字コードの圧縮符号に変換するハフマン木とを記憶する記憶手段、
前記対象ファイル群の中から選ばれた対象ファイルに記述されている圧縮対象文字コードを前記ハフマン木に従って順次圧縮する圧縮手段、
前記圧縮手段による前記ハフマン木の葉へのアクセスを検出する検出手段、
前記検出手段によって検出された葉に格納されているポインタにより、前記圧縮符号マップ群のうち、前記圧縮対象文字コードの圧縮符号マップを特定する圧縮符号マップ特定手段、
前記圧縮符号マップ特定手段によって特定された圧縮符号マップでの前記圧縮対象文字コードの存否をあらわすビットを更新する更新手段、
として機能させることを特徴とする情報処理プログラム。
【０３５７】
（付記２）前記記憶手段は、
前記文字コード、当該文字コードの圧縮符号、および前記文字コードの前記圧縮符号マップへのポインタを格納する葉と前記葉の数に応じた長さとなる葉へのポインタが前記各葉に対する枝として前記文字コードの出現率に応じた個数分割り当てられている根とを有する無節点ハフマン木と、前記文字コードごとに当該文字コードを格納する葉の構造体へのポインタを有する文字構造体と、を記憶しており、
前記圧縮手段は、
前記圧縮対象文字コードを前記文字構造体から探索して、前記圧縮対象文字コードを格納する葉へのポインタを前記文字構造体から抽出する圧縮対象文字コード探索手段と、
前記圧縮対象文字コード探索手段によって抽出された前記圧縮対象文字コードを格納する葉へのポインタを取得して、前記無節点ハフマン木のうち前記圧縮対象文字コードを格納する葉を指定し、当該指定された葉から前記圧縮対象文字コードの圧縮符号を抽出するハフマン木探索手段と、
前記ハフマン木探索手段によって抽出された圧縮符号を所定の記憶領域に格納する圧縮符号格納手段と、を備え、
前記検出手段は、
前記ハフマン木探索手段による前記葉への指定を検出し、
前記圧縮符号マップ特定手段は、
前記検出手段によって前記葉への指定が検出された場合、当該指定された葉に格納されている圧縮符号マップへのポインタを取得して、ポイント先となる圧縮符号マップを前記圧縮符号マップ群から特定することを特徴とする付記１に記載の情報処理プログラム。
【０３５８】
（付記３）前記記憶手段は、
節点の階層数がｋ階層（ｋはｋ≧２の自然数）、節点からその下位節点への枝数が２ｎ本（ｎはｎ≧２の自然数）、第ｉ階層（ｉは１≦ｉ≦ｋの自然数）の節点数が２ｎ（ｉ−１）であり、前記各節点が上位節点へのポインタを格納しており、かつ、葉または下位節点への２ｎ個のポインタを格納可能な節点集合を記憶しており、
前記コンピュータを、
前記対象ファイルに記述されている文字コードの出現頻度の集計結果を取得する取得手段、
前記取得手段によって取得された集計結果に基づいて、前記文字コードを出現確率Ｐ（Ｐは１／２ｎｉ≦Ｐ＜１／２ｎ（ｉ−１）。ただし、ｉ＝１のときは１／２ｎｉ≦Ｐ＜１、ｉ＝ｎのときはＰ＜１／２ｎ（ｉ−１））に応じて階層別に分類する分類手段、
前記分類手段によって分類された前記第ｉ階層の文字コード数に基づいて、前記第ｉ階層の葉へのポインタ数を算出するとともに、当該第ｉ階層の葉へのポインタ数に基づいて、（ｉ＋１）階層の節点をリンク先とする前記第ｉ階層の下位節点へのポインタ数と前記第ｉ階層の節点の使用数とを算出する算出手段、
前記算出手段によって算出された算出結果に基づいて、２ｎ分枝ハフマン木を生成する２ｎ分枝ハフマン木生成手段、
前記２ｎ分枝ハフマン木生成手段によって生成された２ｎ分枝ハフマン木を、２ｍ分枝（ただし、ｍ＝ｎ×ｋ）の無節点ハフマン木に変換して、前記記憶手段に記憶する変換手段、
として機能させることを特徴とする付記２に記載の情報処理プログラム。
【０３５９】
（付記４）前記２ｎ分枝ハフマン木生成手段は、
前記算出手段によって算出された算出結果に基づいて、前記第ｉ階層の葉へのポインタと前記第ｉ階層の下位節点へのポインタを生成するポインタ生成手段、
前記第ｉ階層の使用数分の節点に、前記ポインタ生成手段によって生成された前記第ｉ階層の葉へのポインタと前記第ｉ階層の下位節点へのポインタとを格納するポインタ格納手段、
前記分類手段によって分類された前記第ｉ階層の文字ごとに、前記ポインタ格納手段によって前記第ｉ階層の節点に格納された葉へのポインタにより前記第ｉ階層の節点のリンク先となる葉を、前記文字コードごとに生成する葉生成手段、
前記葉生成手段によって生成された葉に、当該葉の番号に対応付けられた文字コードを格納することにより、２ｎ分枝ハフマン木を生成する文字コード格納手段を備えることを特徴とする付記３に記載の情報処理プログラム。
【０３６０】
（付記５）前記コンピュータを、
前記２ｎ分枝ハフマン木において前記第ｉ階層の葉へのポインタ数と第（ｉ−１）階層の空き節点内の空きポインタ数とを検出する検出手段、
前記検出手段によって検出された前記第ｉ階層の葉へのポインタ数と第（ｉ−１）階層の空き節点内の空きポインタ数とに基づいて、前記第ｉ階層から前記第（ｉ−１）階層の空き節点への移動対象となる前記第ｉ階層の葉へのポインタ（以下、「移動対象ポインタ」という）を特定する特定手段、
前記特定手段によって特定された移動対象ポインタを格納する節点へのポインタを前記第（ｉ−１）階層の節点から削除し、前記移動対象ポインタを前記第（ｉ−１）階層の節点に移動させる最適化手段として機能させ、
前記変換手段は、
前記最適化手段によって最適化された２ｎ分枝ハフマン木を、前記２ｍ分枝の無節点ハフマン木に変換して、前記記憶手段に記憶することを特徴とする付記４に記載の情報処理プログラム。
【０３６１】
（付記６）前記変換手段は、
前記２ｎ分枝ハフマン木の階層数と前記第ｉ階層の葉の数に基づいて、前記第ｉ階層の葉ごとに葉へのポインタの種類数を決定する決定手段と、
前記２ｎ分枝ハフマン木の葉を複製する複製手段と、
２ｍ個の葉へのポインタを格納可能な根を生成して、前記記憶手段に格納する根生成手段と、
前記決定手段によって決定された種類数に基づいて、前記複製手段によって複製された葉ごとに当該葉へのポインタを生成して、前記根生成手段によって生成された根に格納する第１の構築手段と、
前記葉に対する当該葉へのポインタ群に共通のビット列からなる圧縮符号を抽出し、当該圧縮符号およびその圧縮符号長を前記葉に格納して前記葉を再構築することにより、前記根および前記葉からなる無節点ハフマン木を生成する第２の構築手段と、
を備えることを特徴とする付記３〜５のいずれか一つに記載の情報処理プログラム。
【０３６２】
（付記７）前記コンピュータを、
前記文字コードを出現頻度の降順にソートするソート手段、
前記ソート手段によってソートされた結果、前記文字コードのうち前記出現頻度の高位の文字コードと低位の文字コードとに分け、前記低位の文字コードを上位ビットコードと下位ビットコードに分割する分割手段、
前記分割手段によって分割された上位ビットコードおよび下位ビットコードの出現頻度を集計する集計手段として機能させ、
前記分類手段は、
前記高位の文字コードの集計結果と前記集計手段によって集計された集計結果とに基づいて、前記文字コードを出現確率Ｐに応じて階層別に分類することを特徴とする付記３〜６のいずれか一つに記載の情報処理プログラム。
【０３６３】
（付記８）前記コンピュータを、
前記圧縮対象文字コードをビット数が同数となるように２つに分割する分割手段として機能させ、
前記圧縮符号マップ群は、
出現頻度が所定頻度以上の高位文字コードごとに当該文字コードの対象ファイル群での存否をあらわすビット列を有する圧縮符号マップと、出現頻度が前記所定頻度未満の低位文字コードを分割した分割文字コードの前記対象ファイル群での存否をあらわすビット列を有する圧縮符号マップとを有し、
前記無節点ハフマン木は、
前記高位文字コード、当該高位文字コードの圧縮符号、および前記高位文字コードの前記対象ファイル群での存否をあらわす圧縮符号マップへのポインタを格納する葉と、前記分割文字コード、当該分割文字コードの圧縮符号、および前記分割文字コードの前記対象ファイル群での存否をあらわす圧縮符号マップへのポインタを格納する葉と、前記葉へのポインタを格納する根とを有し、
前記文字構造体は、
前記高位文字コードごとに当該高位文字コードを格納する葉の構造体へのポインタを有する高位文字コード構造体と、前記分割文字コードごとに当該分割文字コードを格納する葉へのポインタを有する分割文字コード構造体とを有し、
前記分割手段は、
前記圧縮対象文字コード探索手段により、前記圧縮対象文字コードが前記高位文字コード構造体になかった場合、前記圧縮対象文字コードを分割して、上位の圧縮対象分割文字コードと下位の圧縮対象分割文字コードを生成し、
前記圧縮対象文字コード探索手段は、
前記分割手段によって分割された圧縮対象分割文字コードごとに当該圧縮対象文字コードを前記分割文字コード構造体から探索して、前記圧縮対象分割文字コードを格納する葉へのポインタを前記分割文字コード構造体から抽出し、
前記ハフマン木探索手段は、
前記圧縮対象文字コード探索手段によって抽出された前記圧縮対象分割文字コードを格納する葉へのポインタを取得して、前記圧縮対象分割文字コードを格納する葉を指定し、当該指定された葉から前記圧縮対象分割文字コードの圧縮符号を抽出し、
前記圧縮符号格納手段は、
前記ハフマン木探索手段によって抽出された前記分割文字コードの圧縮符号を前記所定の記憶領域に格納することを特徴とする付記２〜７のいずれか１つに記載の情報処理プログラム。
【０３６４】
（付記９）前記圧縮符号マップ群のビット列は、
先頭位置から末尾位置にかけて前記対象ファイルのファイル番号の降順に配列された圧縮領域であり、
前記記憶手段は、
所定ビット数により表現されるパターンをすべて網羅した複数種類の記号列と前記所定ビット数よりもビット数が多い特殊記号列とをリーフとする圧縮符号マップ用ハフマン木を記憶しており、
前記コンピュータを、
前記対象ファイルの追加が検出された場合、前記ファイル番号が連続するように採番し、前記文字コードごとに当該文字コードの前記追加された対象ファイルでの存否をあらわすビット列を、前記対象ファイルのファイル番号と連続するように配列した非圧縮領域を設定する非圧縮領域設定手段、
前記圧縮領域のビット列群の中から選ばれた任意のビット列を、前記圧縮符号マップ用ハフマン木を用いて圧縮するビット列圧縮手段、
として機能させることを特徴とする付記８に記載の情報処理プログラム。
【０３６５】
（付記１０）前記記憶手段は、
前記対象ファイル群での前記文字コードの出現率に応じた圧縮率となる複数種類の圧縮符号マップ用ハフマン木と、前記出現率と前記複数種類の圧縮符号マップ用ハフマン木との対応付けるテーブルとを記憶しており、
前記ビット列圧縮手段は、
前記圧縮符号マップごとに、前記テーブルを参照して、前記複数種類の圧縮符号マップ用ハフマン木の中から、前記圧縮符号マップに対応する文字コードの出現率に応じた圧縮率となる圧縮符号マップ用ハフマン木を抽出し、当該抽出された圧縮符号マップ用ハフマン木を用いて、前記圧縮符号マップの圧縮領域のビット列を圧縮することを特徴とする付記９に記載の情報処理プログラム。
【０３６６】
（付記１１）前記特殊記号列は、前記文字コードが出現しないことを意味する記号が連続する記号列であることを特徴とする付記９または１０に記載の情報処理プログラム。
【０３６７】
（付記１２）前記複数種類の圧縮符号マップ用ハフマン木は、
５０％未満の出現率に応じた圧縮率となるハフマン木の集合であり、
前記ビット列圧縮手段は、
前記文字コードの出現率Ｑが５０％以上である場合、当該文字コードに対応する圧縮符号マップの圧縮領域のビット列を反転し、前記テーブルを参照して、前記複数種類の圧縮符号マップ用ハフマン木の中から、（１００−Ｑ）％の出現率に応じた圧縮率となる圧縮符号マップ用ハフマン木を抽出し、当該抽出された圧縮符号マップ用ハフマン木を用いて、前記反転されたビット列を圧縮することを特徴とする付記９〜１１のいずれか１つに記載の情報処理プログラム。
【０３６８】
（付記１３）コンピュータを、
文字コードごとに当該文字コードの対象ファイル群での存否をあらわすビット列を有する圧縮符号マップ群と、前記文字コード、当該文字コードの圧縮符号、および前記文字コードの前記対象ファイル群での存否をあらわす圧縮符号マップへのポインタを格納する葉と前記葉の数に応じた長さとなる葉へのポインタが前記各葉に対する枝として前記文字コードの出現率に応じた個数分割り当てられている根とを有する無節点ハフマン木と、前記文字コードごとに当該文字コードを格納する葉の構造体へのポインタを有する文字構造体と、前記無節点ハフマン木を用いて前記対象ファイル群から圧縮された圧縮ファイル群と、を記憶する記憶手段、
検索キーワードの入力を受け付ける入力手段、
前記文字構造体を参照して、前記入力手段によって入力された検索キーワードを構成する文字コードごとに葉へのポインタを取得して、当該葉へのポインタにより葉にアクセスして、当該アクセス先の葉に格納されている圧縮符号を抽出する検索キーワード圧縮手段、
前記アクセス先の葉に格納されている圧縮符号マップへのポインタを取得して、前記検索キーワードを構成する文字コードごとに圧縮符号マップを特定する圧縮符号マップ特定手段、
前記圧縮符号マップ特定手段によって特定された圧縮符号マップを参照することにより、前記検索キーワードを構成する文字コードごとに、前記圧縮ファイル群の中から、前記検索キーワードを構成する文字コードが存在する対象ファイルの圧縮ファイルを特定する圧縮ファイル特定手段、
前記圧縮ファイル特定手段によって特定された圧縮ファイルの中から前記葉へのポインタと同じ長さとなる圧縮符号列を抽出する抽出手段、
前記抽出手段によって抽出された圧縮符号列と一致する葉へのポインタを前記無節点ハフマン木の根から特定し、前記抽出された圧縮符号列と一致する葉へのポインタのポイント先となる葉を特定する葉特定手段、
前記葉特定手段によって特定された葉の中の文字コードを伸長コードとして抽出して、前記所定の記憶領域に格納する伸長コード格納手段、
として機能させることを特徴とする情報検索プログラム。
【０３６９】
（付記１４）前記記憶手段は、
前記圧縮ファイルの存否をあらわすビット列を有する削除マップを記憶しており、
前記圧縮ファイル特定手段は、
前記圧縮符号マップ群を参照することにより、前記入力手段によって入力された検索キーワードを構成する文字コードごとに、前記圧縮ファイル群の中から、前記検索キーワードを構成する文字コードが存在し、かつ、削除されていない対象ファイルの圧縮ファイルを特定することを特徴とする付記１３に記載の情報検索プログラム。
【０３７０】
（付記１５）前記記憶手段は、
所定ビット数により表現されるパターンをすべて網羅した複数種類の記号列と前記所定ビット数よりもビット数が多い特殊記号列とをリーフとする圧縮符号マップ用ハフマン木を記憶しており、
前記圧縮符号マップ群は、
前記圧縮符号マップ用ハフマン木を用いて前記ビット列が圧縮された圧縮領域を有し、
前記コンピュータを、
前記圧縮符号マップ特定手段によって特定された圧縮符号マップの圧縮領域を、前記圧縮符号マップ用ハフマン木を用いて伸長する圧縮符号マップ伸長手段として機能させ、
前記圧縮ファイル特定手段は、
前記圧縮符号マップ伸長手段によって伸長された圧縮符号マップを参照することにより、前記検索キーワードを構成する文字コードごとに、前記圧縮ファイル群の中から、前記検索キーワードを構成する文字コードが存在する対象ファイルの圧縮ファイルを特定することを特徴とする付記１３または１４に記載の情報検索プログラム。
【０３７１】
（付記１６）前記コンピュータを、
順次格納される伸長コードと照合する照合対象文字コードを、前記伸長コードとの一致回数に基づいて前記検索キーワードの中から設定し、前記順次格納される伸長コードと前記照合文字コードとを逐次照合し、順次格納された伸長コード列と前記検索キーワードとが一致するか否かを判定する照合手段、
前記照合手段によって照合された照合結果を出力する出力手段、
として機能させることを特徴とする付記１３〜１５のいずれか１つに記載の情報検索プログラム。
【０３７２】
（付記１７）前記葉は、前記照合手段による照合の可否をあらわす照合フラグを有し、
前記コンピュータを、
前記圧縮符号マップ特定手段により、前記検索キーワード圧縮手段によって圧縮された圧縮符号ごとに前記葉へのポインタを特定したときに、特定先の葉の照合フラグを照合許可をあらわす値に設定する照合フラグ設定手段として機能させ、
前記照合手段は、
前記葉特定手段によって特定された葉の照合フラグに基づいて、照合許可をあらわす葉から順次格納される伸長コードと前記照合フラグ設定手段によって設定された文字コードとを逐次照合し、順次格納された伸長コード列と前記検索キーワードとが一致するか否かを判定することを特徴とする付記１６に記載の情報検索プログラム。
【０３７３】
（付記１８）文字コードごとに当該文字コードの対象ファイル群での存否をあらわすビット列を有する圧縮符号マップ群と、前記文字コードに対応する葉に当該文字コードの圧縮符号マップへのポインタが格納されており前記文字コードを当該文字コードの圧縮符号に変換するハフマン木とを記憶する記憶手段と、
前記対象ファイル群の中から選ばれた対象ファイルに記述されている圧縮対象文字コードを前記ハフマン木に従って順次圧縮する圧縮手段と、
前記圧縮手段による前記ハフマン木の葉へのアクセスを検出する検出手段と、
前記検出手段によって検出された葉に格納されているポインタにより、前記圧縮符号マップ群のうち、前記圧縮対象文字コードの圧縮符号マップを特定する圧縮符号マップ特定手段と、
前記圧縮符号マップ特定手段によって特定された圧縮符号マップでの前記圧縮対象文字コードの存否をあらわすビットを更新する更新手段と、
を備えることを特徴とする情報処理装置。
【０３７４】
（付記１９）文字コードごとに当該文字コードの対象ファイル群での存否をあらわすビット列を有する圧縮符号マップ群と、前記文字コード、当該文字コードの圧縮符号、および前記文字コードの前記対象ファイル群での存否をあらわす圧縮符号マップへのポインタを格納する葉と前記葉の数に応じた長さとなる葉へのポインタが前記各葉に対する枝として前記文字コードの出現率に応じた個数分割り当てられている根とを有する無節点ハフマン木と、前記文字コードごとに当該文字コードを格納する葉の構造体へのポインタを有する文字構造体と、前記無節点ハフマン木を用いて前記対象ファイル群から圧縮された圧縮ファイル群と、を記憶する記憶手段と、
検索キーワードの入力を受け付ける入力手段と、
前記文字構造体を参照して、前記入力手段によって入力された検索キーワードを構成する文字コードごとに葉へのポインタを取得して、当該葉へのポインタにより葉にアクセスして、当該アクセス先の葉に格納されている圧縮符号を抽出する検索キーワード圧縮手段と、
前記アクセス先の葉に格納されている圧縮符号マップへのポインタを取得して、前記検索キーワードを構成する文字コードごとに圧縮符号マップを特定する圧縮符号マップ特定手段と、
前記圧縮符号マップ特定手段によって特定された圧縮符号マップを参照することにより、前記検索キーワードを構成する文字コードごとに、前記圧縮ファイル群の中から、前記検索キーワードを構成する文字コードが存在する対象ファイルの圧縮ファイルを特定する圧縮ファイル特定手段と、
前記圧縮ファイル特定手段によって特定された圧縮ファイルの中から前記葉へのポインタと同じ長さとなる圧縮符号列を抽出する抽出手段と、
前記抽出手段によって抽出された圧縮符号列と一致する葉へのポインタを前記無節点ハフマン木の根から特定し、前記抽出された圧縮符号列と一致する葉へのポインタのポイント先となる葉を特定する葉特定手段と、
前記葉特定手段によって特定された葉の中の文字コードを伸長コードとして抽出して、前記所定の記憶領域に格納する伸長コード格納手段と、
を備えることを特徴とする情報検索装置。
【符号の説明】
【０３７５】
５００  情報処理装置
５０１  入力部
５０２  取得部
５０３  集計部
５０４  ソート部
５０５  分割部
５０６  分類部
５０７  算出部
５０８  ポインタ生成部
５０９  ポインタ格納部
５１０  葉生成部
５１１  文字コード格納部
５１２  検出部
５１３  特定部
５１４  最適化部
５１５  文字構造体生成部
５２０  算出結果テーブル
５３０  文字構造体
６００  文字出現頻度集計テーブル
３２０１  設定部
３２０２  圧縮対象文字コード探索部
３２０３  ハフマン木探索部
３２０４  圧縮符号格納部
３２０５  検出部
３２０６  圧縮符号マップ特定部
３２０７  圧縮符号マップ更新部
３２０８  圧縮符号マップ圧縮部
３２８１  ビット列圧縮部
３２８２  非圧縮領域設定部
５１００  情報検索装置
５１０１  入力部
５１０２  検索キーワード圧縮部
５１０３  圧縮符号マップ伸長部
５１０４  圧縮符号マップ特定部
５１０５  圧縮ファイル特定部
５１０６  照合フラグ設定部
５１０７  抽出部
５１０８  葉特定部
５１０９  伸長コード格納部
５１１０  照合部
５１１１  文字列置換部
５１１２  出力部
【図１】
2011100320.tif 000003
【図２−１】
2011100320.tif 000004
【図２−２】
2011100320.tif 000005
【図３】
2011100320.tif 000006
【図４】
2011100320.tif 000007
【図５】
2011100320.tif 000008
【図６】
2011100320.tif 000009
【図７】
2011100320.tif 000010
【図８】
2011100320.tif 000011
【図９−１】
2011100320.tif 000012
【図９−２】
2011100320.tif 000013
【図９−３】
2011100320.tif 000014
【図１０】
2011100320.tif 000015
【図１１】
2011100320.tif 000016
【図１２】
2011100320.tif 000017
【図１３−１】
2011100320.tif 000018
【図１３−２】
2011100320.tif 000019
【図１３−３】
2011100320.tif 000020
【図１４】
2011100320.tif 000021
【図１５】
2011100320.tif 000022
【図１６】
2011100320.tif 000023
【図１７】
2011100320.tif 000024
【図１８】
2011100320.tif 000025
【図１９】
2011100320.tif 000026
【図２０】
2011100320.tif 000027
【図２１】
2011100320.tif 000028
【図２２】
2011100320.tif 000029
【図２３】
2011100320.tif 000030
【図２４】
2011100320.tif 000031
【図２５】
2011100320.tif 000032
【図２６】
2011100320.tif 000033
【図２７】
2011100320.tif 000034
【図２８】
2011100320.tif 000035
【図２９】
2011100320.tif 000036
【図３０】
2011100320.tif 000037
【図３１−１】
2011100320.tif 000038
【図３１−２】
2011100320.tif 000039
【図３２】
2011100320.tif 000040
【図３３−１】
2011100320.tif 000041
【図３３−２】
2011100320.tif 000042
【図３４】
2011100320.tif 000043
【図３５】
2011100320.tif 000044
【図３６】
2011100320.tif 000045
【図３７】
2011100320.tif 000046
【図３８】
2011100320.tif 000047
【図３９−１】
2011100320.tif 000048
【図３９−２】
2011100320.tif 000049
【図４０】
2011100320.tif 000050
【図４１】
2011100320.tif 000051
【図４２−１】
2011100320.tif 000052
【図４２−２】
2011100320.tif 000053
【図４２−３】
2011100320.tif 000054
【図４２−４】
2011100320.tif 000055
【図４３】
2011100320.tif 000056
【図４４】
2011100320.tif 000057
【図４５】
2011100320.tif 000058
【図４６】
2011100320.tif 000059
【図４７】
2011100320.tif 000060
【図４８】
2011100320.tif 000061
【図４９】
2011100320.tif 000062
【図５０】
2011100320.tif 000063
【図５１】
2011100320.tif 000064
【図５２】
2011100320.tif 000065
【図５３−１】
2011100320.tif 000066
【図５３−２】
2011100320.tif 000067
【図５３−３】
2011100320.tif 000068
【図５３−４】
2011100320.tif 000069
【図５３−５】
2011100320.tif 000070
【図５４−１】
2011100320.tif 000071
【図５４−２】
2011100320.tif 000072
【図５４−３】
2011100320.tif 000073
【図５５】
2011100320.tif 000074
【図５６】
2011100320.tif 000075
【図５７】
2011100320.tif 000076
【図５８】
2011100320.tif 000077
【図５９】
2011100320.tif 000078
【図６０】
2011100320.tif 000079
【図６１】
2011100320.tif 000080
【図６２】
2011100320.tif 000081