(57)【要約】  対象ファイルを圧縮した圧縮ファイルを圧縮状態のまま、検索文字列の圧縮文字列に一致する圧縮符号列と照合する。そして、照合の結果、不一致となった圧縮符号列については、そのまま伸長する。一方、一致した圧縮符号列については、あらかじめ作成しておいた照合／置換テーブル内の置換文字列に置換する。たとえば、基礎単語ではない検索文字列「婚活」が与えられた場合、「結婚」や「活動」ではヒットしないため、単一文字「婚」、「活」のＡＮＤ検索でヒットさせることとなる。この場合、文字通り「婚活」という文字列のほか、「婚」および「活」が単独でそれぞれヒットすることとなる。すなわち、たまたま対象ファイル内で「婚活」と記述されていれば、「婚活」がヒットするが、それ以外では、「婚」および「活」は、単独でヒットすることとなる。
2012117544.tif 000002
【特許請求の範囲】
【請求項１】
対象ファイルに出現する文字情報群内の各文字および２以上の文字からなる単語の生起確率に応じた圧縮符号長の圧縮符号を葉とする最大枝数２Nの２N分枝無節点ハフマン木と、前記文字情報群の文字情報および前記単語の集合内の単語ごとに前記２N分枝無節点ハフマン木の対応する葉を関連付けたデータベースと、前記対象ファイルを前記２N分枝無節点ハフマン木で圧縮した圧縮ファイルと、を記憶する記憶装置にアクセス可能なコンピュータに、
２個以上の文字からなる検索文字列の入力を受け付ける入力工程と、
前記入力工程によって入力された検索文字列を前記データベースから検索する第１の検索工程と、
前記第１の検索工程によって検索されなかった場合、前記検索文字列の先頭文字を末尾文字とする先行単語と、前記検索文字列の末尾文字を先頭文字とする後続単語と、を前記データベースの単語の集合から検索する第２の検索工程と、
前記第２の検索工程によって前記先行単語および前記後続単語が検索された場合、前記２N分枝無節点ハフマン木のうち前記先行単語の圧縮符号を前記先行単語に関連付けされた葉から抽出するとともに、前記２N分枝無節点ハフマン木のうち前記後続単語の圧縮符号を前記後続単語に関連付けされた葉から抽出する抽出工程と、
前記先行単語の圧縮符号と前記後続単語の圧縮符号とを連結させた連結圧縮符号と、前記先行単語および前記後続単語からなりかつ前記先行単語の末尾文字と前記後続単語の先頭文字とを特徴付ける情報を埋め込んだ置換文字列と、を関連付けて記憶するテーブルを作成する作成工程と、
前記圧縮ファイル内の圧縮符号列が前記作成工程によって作成されたテーブル内の連結圧縮符号と一致するか否かを判定する判定工程と、
前記判定工程によって一致すると判定された場合、前記連結圧縮符号に関連付けられた前記置換文字列を伸長先に書き出す伸長工程と、
を実行させることを特徴とする検索プログラム。
【請求項２】
前記抽出工程は、
さらに、前記検索文字列を構成する文字に関連付けられた葉から圧縮符号を抽出し、
前記作成工程は、
さらに、前記検索文字列を構成する文字について前記抽出工程によって抽出された圧縮符号と、前記検索文字列を構成する文字を特徴付ける情報を埋め込んだ前記検索文字列を構成する文字情報の置換文字と、を関連付けて、前記テーブルに格納し、
前記判定工程は、
前記圧縮ファイル内の圧縮符号列が前記作成工程によって作成されたテーブル内の前記検索文字列を構成する文字の圧縮符号と一致するか否かを判定し、
前記伸長工程は、
前記判定工程によって前記検索文字列を構成する文字の圧縮符号と一致すると判定された場合、前記検索文字列を構成する文字の圧縮符号に関連付けられた前記置換文字を前記伸長先に書き出すことを特徴とする請求項１に記載の検索プログラム。
【請求項３】
前記抽出工程は、
前記第１の検索工程によって前記検索文字列が前記データベースから検索された場合、前記検索文字列に一致する単語に関連付けられた葉から圧縮符号を抽出し、
前記作成工程は、
前記検索文字列に一致する単語について前記抽出工程によって抽出された圧縮符号と、前記検索文字列に一致する単語を特徴付ける情報を埋め込んだ前記検索文字列に一致する単語の置換文字列と、を関連付けて、前記テーブルに格納し、
前記判定工程は、
前記圧縮ファイル内の圧縮符号列が前記作成工程によって作成されたテーブル内の前記検索文字列に一致する単語の圧縮符号と一致するか否かを判定し、
前記伸長工程は、
前記判定工程によって前記検索文字列に一致する単語の圧縮符号と一致すると判定された場合、前記検索文字列に一致する単語の圧縮符号に関連付けられた前記置換文字を前記伸長先に書き出すことを特徴とする請求項１に記載の検索プログラム。
【請求項４】
前記伸長工程は、
前記圧縮ファイル内の前記判定工程によって前記連結圧縮符号と不一致な圧縮符号については、当該不一致な圧縮符号を有する葉に関連付けされた文字を前記データベースから抽出して、前記伸長先に書き出すことを特徴とする請求項１〜３のいずれか一つに記載の検索プログラム。
【請求項５】
前記対象ファイルに出現する前記文字および前記単語を含む文字情報群内の各文字情報の出現率に応じた生起確率で規定される圧縮符号長ごとに、前記文字情報の種類数を集計する集計工程と、
前記対象ファイルに出現する前記文字情報の総種類数に基づいて、最小圧縮符号長から最大圧縮符号長までの圧縮符号長群の中から、前記文字情報に割り当てられる圧縮符号長の上限長Ｎを決定する決定工程と、
前記集計工程によって集計された圧縮符号長ごとの前記文字情報の種類数のうち、前記決定工程によって決定された上限長Ｎを圧縮符号長とする前記文字情報の種類数を、前記上限長Ｎ以上の圧縮符号長での前記文字情報の種類数の総和に補正する補正工程と、
前記補正工程によって補正された補正後の前記圧縮符号長ごとの前記文字情報の種類数に基づいて、前記上限長Ｎを最大枝数とし、前記文字情報の各々の生起確率に応じた圧縮符号長の圧縮符号を葉とする２N分枝無節点ハフマン木を構築し、前記文字情報群の文字情報および前記単語の集合内の単語ごとに前記２N分枝無節点ハフマン木の葉を関連付けることで、前記データベースを構築して、前記２N分枝無節点ハフマン木および前記データベースを前記記憶装置に格納する構築工程と、
前記対象ファイルを前記２N分枝無節点ハフマン木で圧縮することにより、前記圧縮ファイルを前記記憶装置に格納する圧縮工程と、
を前記コンピュータに実行させることを特徴とする請求項１〜４のいずれか一つに記載の検索プログラム。
【請求項６】
前記決定工程は、
前記文字情報の総種類数が２K-1個より大きく２K個以下である場合は、前記上限長ＮをＫビットに決定することを特徴とする請求項５に記載の検索プログラム。
【請求項７】
前記決定工程は、
前記文字情報の総種類数が２10個より大きく２11個以下である場合は、前記上限長Ｎを１１ビットに決定することを特徴とする請求項６に記載の検索プログラム。
【請求項８】
前記決定工程は、
前記文字情報の総種類数が２11個より大きく２12個以下である場合は、前記上限長Ｎを１２ビットに決定することを特徴とする請求項６に記載の検索プログラム。
【請求項９】
前記決定工程は、
前記文字情報の総種類数が２12個より大きく２13個以下である場合は、前記上限長Ｎを１３ビットに決定することを特徴とする請求項６に記載の検索プログラム。
【請求項１０】
前記補正工程による補正後の前記上限長Ｎまでの各圧縮符号長での前記文字情報の種類数に基づいて、前記上限長Ｎまでの各圧縮符号長を規定する各生起確率の総和を算出する算出工程と、
前記算出工程によって算出された総和がしきい値以上１以下であるか否かを判断する判断工程と、
前記判断工程によって前記しきい値以上１以下であると判断された場合、前記上限長Ｎまでの圧縮符号長と、前記上限長Ｎまでの圧縮符号長ごとの前記文字情報の種類数と、前記文字情報の出現率と、に基づいて、前記文字情報に圧縮符号を割り当てた葉の構造体を生成する生成工程と、
前記上限長Ｎまでの圧縮符号長に基づいて、前記生成工程によって生成された葉の構造体１つ当たりの枝数を、前記上限長Ｎまでの圧縮符号長ごとに特定する特定工程と、を前記コンピュータに実行させ、
前記構築工程は、
前記葉の構造体内の圧縮符号に前記特定工程によって特定された枝数分の枝番号をあらわす各ビット列を連結した葉へのポインタ群を、葉の構造体ごとに生成することにより、前記各葉の構造体についての前記葉へのポインタ群を根とする２N分枝無節点ハフマン木を構築することを特徴とする請求項５〜９のいずれか一つに記載の検索プログラム。
【請求項１１】
前記判断工程によって前記しきい値以上１以下でないと判断された場合、前記上限長Ｎまでの各圧縮符号長の前記文字情報の種類数を、前記総和で割ることにより、前記上限長Ｎまでの各圧縮符号長の前記文字情報の種類数を更新する更新工程を前記コンピュータに実行させ、
前記算出工程は、
前記更新工程による更新後における前記上限長Ｎまでの各圧縮符号長の前記文字情報の種類数に基づいて、前記総和を再算出し、
前記判断工程は、
前記算出工程によって再算出された総和が１以下の最大値であるか否かを判断し、
前記生成工程は、
前記判断工程によって前記再算出された総和が前記最大値であると判断された場合、前記上限長Ｎまでの圧縮符号長と、前記上限長Ｎまでの圧縮符号長ごとの更新後における前記文字情報の種類数と、前記文字情報の出現率と、に基づいて、前記文字情報に圧縮符号を割り当てた葉の構造体を生成することを特徴とする請求項１０に記載の検索プログラム。
【請求項１２】
前記判断工程によって前記しきい値以上１以下でないと判断された場合、前記上限長Ｎまでの各圧縮符号長のうち第１の圧縮符号長の前記文字情報の種類数を所定数減少させ、当該第１の圧縮符号長よりも大きい第２の圧縮符号長の前記文字情報の種類数を前記所定数増加させることにより、前記上限長Ｎまでの各圧縮符号長の前記文字情報の種類数を更新する更新工程を前記コンピュータに実行させ、
前記算出工程は、
前記更新工程による更新後における前記上限長Ｎまでの各圧縮符号長の前記文字情報の種類数に基づいて、前記総和を再算出し、
前記判断工程は、
前記算出工程によって再算出された総和が１以下の最大値であるか否かを判断し、
前記生成工程は、
前記判断工程によって前記再算出された総和が１以下の最大値であると判断された場合、前記上限長Ｎまでの圧縮符号長と、前記上限長Ｎまでの圧縮符号長ごとの更新後における前記文字情報の種類数と、前記文字情報の出現率と、に基づいて、前記文字情報に圧縮符号を割り当てた葉の構造体を生成することを特徴とする請求項１０に記載の検索プログラム。
【請求項１３】
前記再算出された総和が１以下の最大値となるまで、前記更新工程による更新、前記算出工程による更新後における前記上限長Ｎまでの各圧縮符号長の前記文字情報の種類数に基づく前記総和の再算出、および、前記判断工程による再算出された総和が１以下の最大値であるか否かの判断を、前記コンピュータに繰り返し実行させることを特徴とする請求項１１または１２に記載の検索プログラム。
【請求項１４】
対象ファイルに出現する文字情報群内の各文字および２以上の文字からなる単語の生起確率に応じた圧縮符号長の圧縮符号を葉とする最大枝数２Nの２N分枝無節点ハフマン木と、前記文字情報群の文字情報および前記単語の集合内の単語ごとに前記２N分枝無節点ハフマン木の対応する葉を関連付けたデータベースと、前記対象ファイルを前記２N分枝無節点ハフマン木で圧縮した圧縮ファイルと、を記憶する記憶装置にアクセス可能な検索装置であって、
２個以上の文字からなる検索文字列の入力を受け付ける入力手段と、
前記入力手段によって入力された検索文字列を前記データベースから検索する第１の検索手段と、
前記第１の検索手段によって検索されなかった場合、前記検索文字列の先頭文字を末尾文字とする先行単語と、前記検索文字列の末尾文字を先頭文字とする後続単語と、を前記データベースの単語の集合から検索する第２の検索手段と、
前記第２の検索手段によって前記先行単語および前記後続単語が検索された場合、前記２N分枝無節点ハフマン木のうち前記先行単語の圧縮符号を前記先行単語に関連付けされた葉から抽出するとともに、前記２N分枝無節点ハフマン木のうち前記後続単語の圧縮符号を前記後続単語に関連付けされた葉から抽出する抽出手段と、
前記先行単語の圧縮符号と前記後続単語の圧縮符号とを連結させた連結圧縮符号と、前記先行単語および前記後続単語からなりかつ前記先行単語の末尾文字と前記後続単語の先頭文字とを特徴付ける情報を埋め込んだ置換文字列と、を関連付けて記憶するテーブルを作成する作成手段と、
前記圧縮ファイル内の圧縮符号列が前記作成手段によって作成されたテーブル内の連結圧縮符号と一致するか否かを判定する判定手段と、
前記判定手段によって一致すると判定された場合、前記連結圧縮符号に関連付けられた前記置換文字列を伸長先に書き出す伸長手段と、
を備えることを特徴とする検索装置。
【請求項１５】
対象ファイルに出現する文字情報群内の各文字および２以上の文字からなる単語の生起確率に応じた圧縮符号長の圧縮符号を葉とする最大枝数２Nの２N分枝無節点ハフマン木と、前記文字情報群の文字情報および前記単語の集合内の単語ごとに前記２N分枝無節点ハフマン木の対応する葉を関連付けたデータベースと、前記対象ファイルを前記２N分枝無節点ハフマン木で圧縮した圧縮ファイルと、を記憶する記憶装置にアクセス可能なコンピュータが、
２個以上の文字からなる検索文字列の入力を受け付ける入力工程と、
前記入力工程によって入力された検索文字列を前記データベースから検索する第１の検索工程と、
前記第１の検索工程によって検索されなかった場合、前記検索文字列の先頭文字を末尾文字とする先行単語と、前記検索文字列の末尾文字を先頭文字とする後続単語と、を前記データベースの単語の集合から検索する第２の検索工程と、
前記第２の検索工程によって前記先行単語および前記後続単語が検索された場合、前記２N分枝無節点ハフマン木のうち前記先行単語の圧縮符号を前記先行単語に関連付けされた葉から抽出するとともに、前記２N分枝無節点ハフマン木のうち前記後続単語の圧縮符号を前記後続単語に関連付けされた葉から抽出する抽出工程と、
前記先行単語の圧縮符号と前記後続単語の圧縮符号とを連結させた連結圧縮符号と、前記先行単語および前記後続単語からなりかつ前記先行単語の末尾文字と前記後続単語の先頭文字とを特徴付ける情報を埋め込んだ置換文字列と、を関連付けて記憶するテーブルを作成する作成工程と、
前記圧縮ファイル内の圧縮符号列が前記作成工程によって作成されたテーブル内の連結圧縮符号と一致するか否かを判定する判定工程と、
前記判定工程によって一致すると判定された場合、前記連結圧縮符号に関連付けられた前記置換文字列を伸長先に書き出す伸長工程と、
を実行することを特徴とする検索方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ハフマン木を用いて検索する検索プログラム、検索装置、および検索方法に関する。
【背景技術】
【０００２】
従来、利用者が、本来検索したいキーワードを想定できず、本来のキーワードのある部分文字列を入力して検索をおこなう方法が開示されている（たとえば、下記特許文献１，２を参照。）。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特許第３４２７６７９号公報
【特許文献２】特開平８−１９４７１９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかしながら、たとえば、基礎単語である「結婚」と「活動」で構成される「結婚活動」に関し、その略語「婚活」といった未登録単語を検索文字列として入力して検索をおこなう場合、「婚活」では検索結果は得られず、「婚」、「活」というように、文字ごとに検索をかけることとなる。また、「婚」、「活」と別々に検索した結果、「結婚生活」なども検索結果として得られることとなり、検索精度が低いという問題があった。【０００５】
本発明は、上述した従来技術による問題点を解消するため、基礎単語として登録されていない未登録単語であっても高精度な検索をおこなうことができる検索プログラム、検索装置、および検索方法を提供することを目的とする。
【課題を解決するための手段】
【０００６】
上述した課題を解決し、目的を達成するため、本発明の一観点として、対象ファイルのテキストデータを構成する単一文字、基礎単語、および予約語（以下、文字情報と呼ぶ）に出現する各文字および２以上の文字からなる単語の生起確率に応じた圧縮符号長の圧縮符号を葉とする最大枝数２Nの２N分枝無節点ハフマン木と、前記文字情報群の文字情報および前記単語の集合内の単語ごとに前記２N分枝無節点ハフマン木の対応する葉を関連付けたデータベースと、前記対象ファイルを前記２N分枝無節点ハフマン木で圧縮した圧縮ファイルと、を記憶する記憶装置にアクセス可能であり、２個の文字からなる検索文字列の入力を受け付け、入力された検索文字列を前記データベースから検索する場合、前記検索文字列の先頭文字を末尾文字とする先行単語と、前記検索文字列の末尾文字を先頭文字とする後続単語と、を前記データベースの単語の集合から検索し、前記先行単語および前記後続単語が検索された場合、前記２N分枝無節点ハフマン木のうち前記先行単語の圧縮符号を前記先行単語に関連付けされた葉から抽出するとともに、前記２N分枝無節点ハフマン木のうち前記後続単語の圧縮符号を前記後続単語に関連付けされた葉から抽出し、前記先行単語の圧縮符号と前記後続単語の圧縮符号とを連結させた連結圧縮符号と、前記先行単語および前記後続単語からなり、かつ、前記先行単語の末尾文字と前記後続単語の先頭文字とを特徴付ける情報を埋め込んだ置換文字列と、を関連付けて記憶するテーブルを作成し、前記圧縮ファイル内の圧縮符号列がテーブル内の連結圧縮符号と一致するか否かを判定し、一致すると判定された場合、前記連結圧縮符号に関連付けられた前記置換文字列を伸長先に書き出す検索プログラム、検索装置、および検索方法が提案される。
【発明の効果】
【０００７】
本発明にかかる検索プログラム、検索装置、および検索方法によれば、未登録単語であっても高精度な検索をおこなうことができるという効果を奏する。
【図面の簡単な説明】
【０００８】
【図１】図１は、本実施の形態にかかる情報検索例を示す説明図である。
【図２】図２は、基礎単語ではない検索文字列「婚活」が与えられた場合の照合／置換テーブルＴの作成例（その１）を示す説明図である。
【図３】図３は、基礎単語ではない検索文字列「婚活」が与えられた場合の照合／置換テーブルＴの作成例（その２）を示す説明図である。
【図４】図４は、基礎単語ではない検索文字列「婚活」が与えられた場合の照合／置換テーブルＴの作成例（その３）を示す説明図である。
【図５】図５は、基礎単語ではない検索文字列「婚活」が与えられた場合の照合／置換テーブルＴの作成例（その４）を示す説明図である。
【図６】図６は、基礎単語ではない検索文字列「婚活」が与えられた場合の照合／置換テーブルＴの作成例（その５）を示す説明図である。
【図７】図７は、基礎単語ではない検索文字列「婚活」が与えられた場合の照合／置換テーブルＴの作成例（その６）を示す説明図である。
【図８】図８は、基礎単語ではない検索文字列「婚活」が与えられた場合の照合／置換テーブルＴの作成例（その７）を示す説明図である。
【図９】図９は、基礎単語「結婚」が検索文字列として与えられた場合の照合／置換テーブルＴの作成例（その１）を示す説明図である。
【図１０】図１０は、基礎単語「結婚」が検索文字列として与えられた場合の照合／置換テーブルＴの作成例（その２）を示す説明図である。
【図１１】図１１は、基礎単語「結婚」が検索文字列として与えられた場合の照合／置換テーブルＴの作成例（その３）を示す説明図である。
【図１２】図１２は、２N分枝無節点ハフマン木のサイズ決定方法の一例を示す説明図である。
【図１３】図１３は、２N分枝無節点ハフマン木の生成までの流れを示す説明図である。
【図１４】図１４は、図２の（１）出現回数の集計の詳細を示す説明図である。
【図１５】図１５は、文字情報が高位文字である場合の出現マップ群１５０１を示す説明図である。
【図１６】図１６は、文字情報が分割文字コードである場合の出現マップ群１５０２を示す説明図である。
【図１７】図１７は、文字情報が特殊単語である場合の出現マップ群１５０３を示す説明図である。
【図１８】図１８は、図１３の（２）圧縮符号長算出の詳細（Ｎ＝１１）を示す説明図である。
【図１９】図１９は、図１３の（３）葉数特定〜（５）葉の構造体生成の詳細（Ｎ＝１１）を示す説明図である。
【図２０】図２０は、文字情報ごとの補正結果を示す説明図である。
【図２１】図２１は、葉へのポインタ生成の詳細（Ｎ＝１１）を示す説明図である。
【図２２】図２２は、図１３の（７）２N分枝無節点ハフマン木の構築の詳細（Ｎ＝１１）を示す説明図である。
【図２３】図２３は、図１３の（３）葉数特定〜（５）葉の構造体生成の詳細（Ｎ＝１２）を示す説明図である。
【図２４】図２４は、葉へのポインタ生成の詳細（Ｎ＝１２）を示す説明図である。
【図２５】図２５は、（７）２N分枝無節点ハフマン木の構築の詳細（Ｎ＝１２）を示す説明図である。
【図２６】図２６は、図１３の（３）葉数特定〜（５）葉の構造体生成の詳細（Ｎ＝１３）を示す説明図である。
【図２７】図２７は、葉へのポインタ生成の詳細（Ｎ＝１３）を示す説明図である。
【図２８】図２８は、図１３の（７）２N分枝無節点ハフマン木の構築の詳細（Ｎ＝１３）を示す説明図である。
【図２９】図２９は、葉の構造体を示す説明図である。
【図３０】図３０は、高位文字コードの構造体５００を示す説明図である。
【図３１】図３１は、分割文字コードの構造体６００を示す説明図である。
【図３２】図３２は、特殊単語の構造体１００を示す説明図（その１）である。
【図３３】図３３は、特殊単語の構造体１００を示す説明図（その２）である。
【図３４】図３４は、実施の形態にかかるコンピュータのハードウェア構成例を示すブロック図である。
【図３５】図３５は、コンピュータの機能的構成例を示すブロック図（その１）である。
【図３６】図３６は、ＵＴＦ１６での文字情報の分類例を示す説明図である。
【図３７】図３７は、ＡＳＣＩＩコードでの文字情報の分類例を示す説明図である。
【図３８】図３８は、シフトＪＩＳコードでの文字情報の分類例を示す説明図である。
【図３９】図３９は、２N分枝無節点ハフマン木の生成処理手順（前半）を示すフローチャートである。
【図４０】図４０は、２N分枝無節点ハフマン木の生成処理手順（後半）を示すフローチャートである。
【図４１】図４１は、図３９に示した第１集計処理（ステップＳ３９０１）の詳細な処理手順を示すフローチャートである。
【図４２】図４２は、図４１に示した対象ファイルＦｉの集計処理（ステップＳ４１０３）の詳細な処理手順を示すフローチャートである。
【図４３】図４３は、図４２に示した特殊単語集計処理（ステップＳ４２０２）の詳細な処理手順を示すフローチャートである。
【図４４】図４４は、図４３に示した最長一致検索処理（ステップＳ４３０１）の詳細な処理手順を示すフローチャートである。
【図４５】図４５は、図４３に示した特殊単語の出現マップ生成処理（ステップＳ４３０４）の詳細な処理手順を示すフローチャートである。
【図４６】図４６は、図４２に示した対象文字の出現マップ生成処理（ステップＳ４２０４）の詳細な処理手順を示すフローチャートである。
【図４７】図４７は、図３９に示した第２集計処理（ステップＳ３９０２）の詳細な処理手順を示すフローチャートである。
【図４８】図４８は、図４０に示した補正Ｂ+処理（ステップＳ４００３）の詳細な処理手順を示すフローチャートである。
【図４９】図４９は、図４０に示した補正Ｂ-処理（ステップＳ４００４）の詳細な処理手順を示すフローチャートである。
【図５０】図５０は、図４８および図４９に示した更新処理（ステップＳ４８０１）の詳細な処理手順を示すフローチャートである。
【図５１】図５１は、図４０に示した枝数特定処理（ステップＳ４００６）の詳細な処理手順を示すフローチャートである。
【図５２】図５２は、図４０に示した構築処理（ステップＳ４００７）の詳細な処理手順を示すフローチャートである。
【図５３】図５３は、図５２に示した葉へのポインタ生成処理（ステップＳ５２０３）の詳細な処理手順を示すフローチャートである。
【図５４】図５４は、補正Ｂ+処理（ステップＳ４００３）の他の例の詳細な処理手順を示すフローチャートである。
【図５５】図５５は、補正Ｂ-処理（ステップＳ４００４）の他の例の詳細な処理手順を示すフローチャートである。
【図５６】図５６は、図５４に示した補正Ｂ+処理の他の例を適用した場合における、図１３の（３）葉数特定〜（５）葉の構造体生成の詳細（Ｎ＝１２）を示す説明図である。
【図５７】図５７は、上述した補正Ｂ-処理の他の例を適用した場合における、図１３の（３）葉数特定〜（５）葉の構造体生成の詳細（Ｎ＝１１）を示す説明図である。
【図５８】図５８は、圧縮対象文字列の一例を示す説明図である。
【図５９】図５９は、図５８に示した圧縮対象文字列の圧縮符号を示す説明図である。
【図６０】図６０は、２N分枝無節点ハフマン木を用いた圧縮処理の具体例を示す説明図である。
【図６１】図６１は、コンピュータが自動実行する２N分枝無節点ハフマン木を用いたファイル圧縮処理手順を示すフローチャートである。
【図６２】図６２は、図６１に示した圧縮処理（ステップＳ６１０３）の詳細な処理手順を示すフローチャート（その１）である。
【図６３】図６３は、図６１に示した圧縮処理（ステップＳ６１０３）の詳細な処理手順を示すフローチャート（その２）である。
【図６４】図６４は、図６１に示した圧縮処理（ステップＳ６１０３）の詳細な処理手順を示すフローチャート（その３）である。
【図６５】図６５は、圧縮ファイルの絞込み例を示す説明図である。
【図６６】図６６は、圧縮符号列の伸長処理例を示す説明図（その１）である。
【図６７】図６７は、圧縮符号列の伸長処理例を示す説明図（その２）である。
【図６８】図６８は、圧縮符号列の伸長処理例を示す説明図（その３）である。
【図６９】図６９は、圧縮符号列の伸長処理例を示す説明図（その４）である。
【図７０】図７０は、圧縮符号列の伸長処理例を示す説明図（その５）である。
【図７１】図７１は、圧縮符号列の伸長処理例を示す説明図（その６）である。
【図７２】図７２は、本実施の形態にかかるコンピュータの機能的構成例（その２）を示すブロック図である。
【図７３】図７３は、本実施の形態にかかる検索処理手順を示すフローチャートである。
【図７４】図７４は、図７３に示したファイル絞込み処理（ステップＳ７３０２）の詳細な処理手順を示すフローチャート（その１）である。
【図７５】図７５は、図７３に示したファイル絞込み処理（ステップＳ７３０２）の詳細な処理手順を示すフローチャート（その２）である。
【図７６】図７６は、図７３に示した照合／置換テーブルＴ作成処理（ステップＳ７３０３）の詳細な処理手順を示すフローチャートである。
【図７７】図７７は、図７６に示した特殊単語設定処理（ステップＳ７６０３）の詳細な処理手順を示すフローチャートである。
【図７８】図７８は、図７６に示した非特殊単語設定処理（ステップＳ７６０７）の詳細な処理手順を示すフローチャート（その１）である。
【図７９】図７９は、図７６に示した非特殊単語設定処理（ステップＳ７６０７）の詳細な処理手順を示すフローチャート（その２）である。
【図８０】図８０は、図７６に示した文字コード設定処理（ステップＳ７６０８）の詳細な処理手順を示すフローチャートである。
【図８１】図８１は、図８０に示した分割文字コード設定処理（ステップＳ８００８）の詳細を示すフローチャートである。
【図８２】図８２は、２N分枝無節点ハフマン木を用いた伸長処理手順を示すフローチャート（その１）である。
【図８３】図８３は、図７３に示した２N分枝無節点ハフマン木を用いた伸長処理（ステップＳ７３０４）の詳細な処理手順を示すフローチャート（その２）である。
【図８４】図８４は、図８３に示した照合置換処理（ステップＳ８３０４）の詳細な処理手順を示すフローチャートである。
【発明を実施するための形態】
【０００９】
以下に添付図面を参照して、本発明にかかる検索プログラム、検索装置、および検索方法の実施の形態を詳細に説明する。なお、本明細書において、「文字情報」とは、テキストデータを構成する、単一文字、基礎単語、予約語などである。単一文字とは１つの文字コードで表現される文字である。単一文字の文字コード長は、文字コード種により異なる。
【００１０】
たとえば、ＵＴＦ（Ｕｎｉｃｏｄｅ  Ｔｒａｎｓｆｏｒｍａｔｉｏｎ  Ｆｏｒｍａｔ）１６の場合は１６ビットコード、ＡＳＣＩＩ（Ａｍｅｒｉｃａｎ  Ｓｔａｎｄａｒｄ  Ｃｏｄｅ  ｆｏｒ  Ｉｎｆｏｒｍａｔｉｏｎ  Ｉｎｔｅｒｃｈａｎｇｅ）コードの場合は８ビットコード、シフトＪＩＳ（Ｊａｐａｎｅｓｅ  Ｉｎｄｕｓｔｒｉａｌ  Ｓｔａｎｄａｒｄ）コードの場合は８ビットコードである。シフトＪＩＳコードで日本語の文字を表現する場合は、２個の８ビットコードを組み合わせることとなる。
【００１１】
また、単一文字以外に、たとえば、特定の文字列で表現される単語や予約語が挙げられる。単語としては、児童や生徒が学校教育で学習すべき数百〜数千の基礎単語が挙げられる。基礎単語は出現頻度が高い文字列である。予約語とは、予め決められた文字列であり、たとえば、ＨＴＭＬのタグ（たとえば、＜ｂｒ＞）が挙げられる。基礎単語および予約語を「特殊単語」と称す。なお、本実施の形態では、文字コードとしてＵＴＦ１６を例に挙げて説明する。
【００１２】
＜情報検索例＞
まず、本実施の形態にかかる情報検索例について説明する。本実施の形態では、対象ファイルを圧縮した圧縮ファイルを圧縮状態のまま、検索文字列の圧縮文字列に一致する圧縮符号列と照合する。そして、照合の結果、不一致となった圧縮符号列については、そのまま伸長する。一方、一致した圧縮符号列については、あらかじめ作成しておいた照合／置換テーブル内の置換文字列に置換する。
【００１３】
すなわち、本実施の形態では、情報検索に先立って、照合／置換テーブルを作成する作成処理を実行する。そして、作成された照合／置換テーブルを用いて、対象ファイルを圧縮した圧縮ファイルを圧縮状態のまま、照合、置換（不一致の場合は置換せず）しながら伸長する伸長処理を実行する。
【００１４】
特に、本実施の形態では、検索文字列の圧縮文字列が基礎単語の圧縮符号に一致しなかった場合であっても、検索文字列がヒットしたとして伸長後の対象ファイルで強調表示する。たとえば、４文字熟語「結婚活動」のうち「結婚」と「活動」が基礎単語として登録されており、「結婚活動」の略語「婚活」は基礎単語として登録されていないとする。
【００１５】
ここで、基礎単語ではない検索文字列「婚活」が与えられた場合、「結婚」や「活動」ではヒットしないため、単一文字「婚」、「活」のＡＮＤ検索でヒットさせることとなる。この場合、文字通り「婚活」という文字列のほか、「婚」および「活」が単独でそれぞれヒットすることとなる。すなわち、たまたま対象ファイル内で「婚活」と記述されていれば、「婚活」がヒットするが、それ以外では、「婚」および「活」は、単独でヒットすることとなる。
【００１６】
したがって、本実施の形態では、検索文字列のいわゆる『泣き別れ』を防止することで、伸長処理ひいては検索処理の効率化を図る。
【００１７】
図１は、本実施の形態にかかる情報検索例を示す説明図である。図１では、上述した「婚活」が検索文字列として与えられた例を示している。
【００１８】
（Ａ）例として、検索文字列「婚活」が与えられると、まず、コンピュータは、特殊単語の構造体１００を２分探索する。特殊単語の構造体１００とは、特殊単語と当該特殊単語に対応する２N分枝無節点ハフマン木の葉へのポインタとを、特殊単語ごとに格納したデータ構造体である。特殊単語の構造体１００の詳細については、図５１および図５２で後述する。検索文字列「婚活」は基礎単語ではないため、特殊単語の構造体１００ではヒットしない。
【００１９】
また、２N分枝無節点ハフマン木とは、根から分岐する枝が２N本あり、１または複数本の枝で葉を直接ポイントするハフマン木である。節点（内部節点）はない。節点がなく直接葉にヒットするため、節点を有する通常のハフマン木に比べて、伸長速度の高速化を図ることができる。葉は、該当する文字情報とその圧縮符号を含む構造体である。葉の構造体とも呼ぶ。葉に割り当てられる枝数は、割当先の葉に存在する圧縮符号の圧縮符号長に依存する。これらの詳細については、後述する。
【００２０】
（Ｂ）検索文字列「婚活」が特殊単語の構造体１００でヒットしなかった場合、コンピュータは、検索文字列「婚活」の先頭文字「婚」を末尾文字とする基礎単語と、検索文字列「婚活」の末尾文字「活」を先頭文字とする基礎単語とを探索する。この場合、先頭文字「婚」を末尾文字とする基礎単語「結婚」と末尾文字「活」を先頭文字とする基礎単語「活動」がヒットしたとする。
【００２１】
（Ｃ）基礎単語「結婚」および基礎単語「活動」がヒットした場合、特殊単語の構造体１００内の基礎単語「結婚」の葉へのポインタにより、２N分枝無節点ハフマン木の葉（結婚）がポイントされる。同様に、特殊単語の構造体１００内の基礎単語「活動」の葉へのポインタにより、２N分枝無節点ハフマン木の葉（活動）がポイントされる。そして、コンピュータは、ポイントされた葉のうち、先頭文字「婚」を末尾文字とする基礎単語「結婚」の葉の構造体内にある照合フラグをＯＮにする。照合フラグとは、その葉がポイントされた場合に、照合／置換テーブルを用いて照合をおこなうか否かを識別するフラグである。
【００２２】
そして、コンピュータは、連続単語「結婚」「活動」の圧縮符号列と、連続単語「結婚」「活動」の置換文字列と、を含む照合／置換テーブルＴを作成する。連続単語とは、先行の基礎単語の末尾に後続の基礎単語の先頭を連結させた文字列である。本例では、基礎単語「結婚」に基礎単語「活動」を連結した文字列「結婚活動」となる。
【００２３】
また、連続単語の圧縮符号列とは、先行の基礎単語の圧縮符号の末尾に後続の基礎単語の圧縮符号の先頭を連結させた圧縮符号列である。本例では、基礎単語「結婚」の圧縮符号に基礎単語「活動」の圧縮符号を連結した圧縮符号列となる。すなわち、連続単語「結婚活動」の圧縮符号となる。
【００２４】
連続単語の置換文字列とは、連続単語であり、かつ、連続単語のうち検索文字列に一致する文字列に特定の置換指示情報を埋め込んだ文字列である。本例の場合、連続単語「結婚活動」のうち検索文字列「婚活」に特定の置換指示情報を埋め込んだこととなる。特定の置換指示情報とは、検索文字列以外の表示形式とは異なる表示形式に置換する情報である。
【００２５】
たとえば、検索文字列に一致する文字列を他の文字列とは異なる色にしたり、検索文字列に一致する文字列の背景色を他の文字列の背景色とは異なる色にしたりするために埋め込まれるタグである。たとえば、連続単語「結婚」「活動」については、置換文字列「結＜ｃｏｌｏｒ＞婚活＜／ｃｏｌｏｒ＞動」とする。照合／置換テーブルＴの作成の詳細については図２〜図１２で後述する。
【００２６】
（Ｄ）また、コンピュータは、対象ファイル群を２N分枝無節点ハフマン木で圧縮した圧縮ファイル群ｆｓから、検索文字列「婚活」を構成する「婚」および「活」を含む圧縮ファイルｆｉを絞り込む。圧縮ファイルの絞込みの詳細については後述する。
【００２７】
（Ｅ）このあと、コンピュータは、（Ｄ）で絞り込まれた圧縮ファイルを２N分枝無節点ハフマン木を用いて伸長後の文字列を伸長バッファに書き込む。この伸長中に、コンピュータは、圧縮ファイルから取り出された圧縮符号についての葉の構造体で照合フラグがＯＮである場合、照合／置換テーブルＴを参照する。本例の場合、基礎単語「結婚」の圧縮符号が取り出された場合、葉の構造体で照合フラグがＯＮであるため、照合／置換テーブルＴを参照する。
【００２８】
そして、後続の圧縮符号までの圧縮符号列と照合／置換テーブルＴ内の圧縮符号列とが一致した場合、置換文字列を伸長バッファに書き込む。本例の場合、基礎単語「活動」の圧縮符号が、基礎単語「結婚」の圧縮符号の後続圧縮符号であるとすると、圧縮ファイルから連続して取り出された基礎単語「結婚」の圧縮符号とその後続の基礎単語「活動」の圧縮符号からなる圧縮符号列が、照合／置換テーブルＴにあるか否かを判断する。
【００２９】
本例では、連続単語「結婚」「活動」の圧縮符号列が照合／置換テーブルＴに存在するため、連続単語「結婚」「活動」の置換文字列「結＜ｃｏｌｏｒ＞婚活＜／ｃｏｌｏｒ＞動」を伸長バッファに書き込むこととなる。そして、伸長が完了すると、検索結果として伸長バッファの内容を表示することで、検索文字列「婚活」が他の文字列に対し強調表示されることとなる。
【００３０】
＜照合／置換テーブルＴの作成例＞
つぎに、図１（Ａ）〜（Ｃ）での照合／置換テーブルＴの作成例について説明する。図２〜図８では、基礎単語ではない検索文字列の例として「婚活」が与えられた場合の照合／置換テーブルＴの作成例を示す。また、比較するために、図９〜図１２では、基礎単語の例として「結婚」が検索文字列として与えられた場合の照合／置換テーブルＴの作成例を示す。なお、照合／置換テーブルＴの符号の末尾には、照合／置換テーブルＴの作成の時系列を示す番号を０から昇順に付すこととする。たとえば、初期状態はＴ０とし、Ｔ０から更新されたらＴ１、Ｔ１から更新されたらＴ２、…とする。
【００３１】
図２は、基礎単語ではない検索文字列「婚活」が与えられた場合の照合／置換テーブルＴの作成例（その１）を示す説明図である。図２のＴ０は、初期化された照合／置換テーブルＴである。照合／置換テーブルＴ０では、ポインタのアドレスｐ１、ｐ２、…ごとに、圧縮符号長項目、圧縮符号項目、置換文字列項目からなるレコードが設定されているが、初期状態なので各項目内にはまだ値が設定されていない。
【００３２】
（１）まず、検索文字列「婚活」が与えられると、コンピュータは、特殊単語の構造体１００を２分探索する。
【００３３】
（２）検索文字列「婚活」は特殊単語の構造体１００には登録されていないため、コンピュータは、つぎに、特殊単語の構造体１００において、検索文字列「婚活」の先頭文字「婚」を末尾文字とする基礎単語を２分探索する。
【００３４】
（３）そして、コンピュータは、特殊単語の構造体１００から、検索文字列「婚活」の先頭文字「婚」を末尾文字とする基礎単語「結婚」を特定する。
【００３５】
（４）つぎに、（３）の２分探索でヒットした基礎単語「結婚」の葉Ｌ＃へのポインタにより、２N分枝無節点ハフマン木の葉Ｌ＃（結婚）の構造体が指定される。葉Ｌ＃の構造体には、圧縮符号、圧縮符号長、対応する文字構造体へのポインタ、照合フラグ（デフォルトはＯＦＦ）が格納されている。図２の葉Ｌ＃（結婚）の構造体には、あらかじめ、基礎単語「結婚」の圧縮符号“０１０１００１００００００”、その圧縮符号長１３ビット、特殊単語の構造体１００の「結婚」へのポインタが格納されている。ここで、（３）で２分探索されたことで、照合フラグがＯＦＦからＯＮになる。
【００３６】
（５）また、コンピュータは、照合／置換テーブルＴの空きポインタｐ１を、葉Ｌ＃（結婚）における照合／置換テーブルＴへのポインタとして設定する。
【００３７】
（６）そして、コンピュータは、照合／置換テーブルＴのポインタｐ１で指定されるレコードの圧縮符号長項目に、葉Ｌ＃（結婚）の構造体の圧縮符号長１３ビットを書き込む。また、コンピュータは、照合／置換テーブルＴのポインタｐ１で指定されるレコードの圧縮符号項目に、葉Ｌ＃（結婚）の構造体の圧縮符号“０１０１００１００００００”を書き込む。さらに、コンピュータは、照合／置換テーブルＴのポインタｐ１で指定されるレコードの置換文字列項目に、「結婚」の置換文字列「結＜ｃｏｌｏｒ＞婚＜／ｃｏｌｏｒ＞」を書き込む。
【００３８】
ここでの置換文字列「結＜ｃｏｌｏｒ＞婚＜／ｃｏｌｏｒ＞」は、検索文字列「婚活」の先頭文字、すなわち、（３）でヒットした基礎単語「結婚」の末尾文字「婚」に特定の置換指示情報が埋め込まれた文字列となる。これにより、照合／置換テーブルＴ０は照合／置換テーブルＴ１に更新される。
【００３９】
図３は、基礎単語ではない検索文字列「婚活」が与えられた場合の照合／置換テーブルＴの作成例（その２）を示す説明図である。
【００４０】
（７）図２の（６）のあと、コンピュータは、特殊単語の構造体１００において、検索文字列「婚活」の末尾文字「活」を先頭文字とする基礎単語を２分探索する。
【００４１】
（８）そして、コンピュータは、特殊単語の構造体１００から、検索文字列「婚活」の末尾文字「活」を先頭文字とする基礎単語「活用」を特定する。コンピュータは、基礎単語「活用」が特定されると、基礎単語「活用」についての葉Ｌ＃（活用）へのポインタにより、葉Ｌ＃（活用）の構造体をポイントする。
【００４２】
（９）つぎに、コンピュータは、照合／置換テーブルＴへのポインタｐ１で指定されるレコードの値（圧縮符号長１３ビット、圧縮符号“０１０１００１００００００”置換文字列「結＜ｃｏｌｏｒ＞婚＜／ｃｏｌｏｒ＞」）を、空きポインタｐ２のレコードにコピーする。これにより、照合／置換テーブルＴ１は照合／置換テーブルＴ２に更新される。
【００４３】
（１０）そして、コンピュータは、照合／置換テーブルＴへのポインタｐ１で特定される圧縮符号長１３ビットに、葉Ｌ＃（活用）の構造体に格納されている圧縮符号長１３ビットを加算して２６ビットとする。
【００４４】
また、コンピュータは、照合／置換テーブルＴへのポインタｐ１で特定される圧縮符号“０１０１００１００００００”の末尾に、葉Ｌ＃（活用）の構造体に格納されている圧縮符号“０１０１００１０００００１”を連結する。さらに、コンピュータは、照合／置換テーブルＴへのポインタｐ１で特定される置換文字列「結＜ｃｏｌｏｒ＞婚＜／ｃｏｌｏｒ＞」の末尾に、基礎単語「活用」の置換文字列「＜ｃｏｌｏｒ＞活＜／ｃｏｌｏｒ＞用」を連結する。
【００４５】
ここで、置換文字列「＜ｃｏｌｏｒ＞活＜／ｃｏｌｏｒ＞用」は、検索文字列「婚活」の末尾文字、すなわち、（８）でヒットした基礎単語「活用」の先頭文字「活」に特定の置換指示情報が埋め込まれた文字列となる。連結後の置換文字列は、以下のようになる。
【００４６】
「結＜ｃｏｌｏｒ＞婚＜／ｃｏｌｏｒ＞＜ｃｏｌｏｒ＞活＜／ｃｏｌｏｒ＞用」
【００４７】
この場合、冗長さを回避するため、「婚」と「活」との間の「＜／ｃｏｌｏｒ＞＜ｃｏｌｏｒ＞」を削除して、「結＜ｃｏｌｏｒ＞婚活＜／ｃｏｌｏｒ＞用」を連結後の置換文字列とする。すなわち、終了タグと開始タグが連続した場合には削除する。これにより、照合／置換テーブルＴ２は照合／置換テーブルＴ３に更新される。
【００４８】
図４は、基礎単語ではない検索文字列「婚活」が与えられた場合の照合／置換テーブルＴの作成例（その３）を示す説明図である。
【００４９】
（１１）図３の（８）のあと、さらに、コンピュータは、検索文字列「婚活」の末尾文字「活」を先頭文字とする基礎単語について、特殊単語の構造体１００の２分探索を続け、検索文字列「婚活」の末尾文字「活」を先頭文字とする基礎単語「活動」を特定する。コンピュータは、基礎単語「活動」が特定されると、基礎単語「活動」についての葉Ｌ＃（活動）へのポインタにより、葉Ｌ＃（活動）の構造体をポイントする。
【００５０】
（１２）つぎに、コンピュータは、図３の（９）でコピー対象となった照合／置換テーブルＴへのポインタｐ２を、葉Ｌ＃（結婚）の構造体（葉Ｌ＃（活動）の構造体ではなく）に格納する。
【００５１】
（１３）これにより、葉Ｌ＃（結婚）の構造体は、照合／置換テーブルＴにおけるポインタｐ１のレコードおよびｐ２のレコードに指定することができる。
【００５２】
（１４）このあと、コンピュータは、照合／置換テーブルＴへのポインタｐ２で特定される圧縮符号長１３ビットに、葉Ｌ＃（活動）の構造体に格納されている圧縮符号長１３ビットを加算して２６ビットとする。
【００５３】
また、コンピュータは、照合／置換テーブルＴへのポインタｐ２で特定される圧縮符号“０１０１００１００００００”の末尾に、葉Ｌ＃（活動）の構造体に格納されている圧縮符号“０１０１００１００００１０”を連結する。さらに、コンピュータは、照合／置換テーブルＴへのポインタｐ２で特定される置換文字列「結＜ｃｏｌｏｒ＞婚＜／ｃｏｌｏｒ＞」の末尾に、基礎単語「活動」の置換文字列「＜ｃｏｌｏｒ＞活＜／ｃｏｌｏｒ＞動」を連結する。
【００５４】
ここで、置換文字列「＜ｃｏｌｏｒ＞活＜／ｃｏｌｏｒ＞動」は、検索文字列「婚活」の末尾文字、すなわち、（１１）でヒットした基礎単語「活動」の先頭文字「活」に特定の置換指示情報が埋め込まれた文字列となる。連結後の置換文字列は、以下のようになる。
【００５５】
「結＜ｃｏｌｏｒ＞婚＜／ｃｏｌｏｒ＞＜ｃｏｌｏｒ＞活＜／ｃｏｌｏｒ＞動」
【００５６】
この場合、冗長さを回避するため、「婚」と「活」との間の「＜／ｃｏｌｏｒ＞＜ｃｏｌｏｒ＞」を削除して、「結＜ｃｏｌｏｒ＞婚活＜／ｃｏｌｏｒ＞動」を連結後の置換文字列とする。これにより、照合／置換テーブルＴ３は照合／置換テーブルＴ４に更新される。これにより、検索文字列「婚活」についての更新は完了し、図５〜図８では、単一文字「婚」、「活」についての更新を説明する。
【００５７】
図５は、基礎単語ではない検索文字列「婚活」が与えられた場合の照合／置換テーブルＴの作成例（その４）を示す説明図である。
【００５８】
（１５）まず、コンピュータは、高位文字コードの構造体５００において、検索文字列「婚活」のうち先頭文字「婚」を２分探索する。高位文字コードの構造体５００は、高位文字コードｅ♯とその葉Ｌ♯へのポインタを格納するデータ構造体である。高位文字コードとは、対象ファイル群に記述されている文字の出現回数を集計した結果、上位所定番目（たとえば、１０２４位）までの文字群をいう。すなわち、高位文字コードの構造体５００でヒットした文字は、上位所定番目に入る高出現頻度の文字である。本例の文字「婚」は、高位文字コードの構造体５００でヒットしなかったものとする。
【００５９】
（１６）コンピュータは、高位文字コードの構造体５００でヒットしなかった低出現頻度の文字「婚」の文字コード「５Ａ５Ａ」を上位８ビット「０ｘ５Ａ」と下位８ビット「０ｘ５Ａ」とに分割する。ＵＴＦ１６ビットコードの文字は、８ビットコードの組み合わせで表現されるため、低出現頻度の文字については分割することで、低出現頻度の文字の総数を、たかだか２５６個に抑えることができる。
【００６０】
図６は、基礎単語ではない検索文字列「婚活」が与えられた場合の照合／置換テーブルＴの作成例（その５）を示す説明図である。
【００６１】
（１７）コンピュータは、分割文字コードの構造体において、図５の（１６）で分割された上位分割文字コード「０ｘ５Ａ」を２分探索する。分割文字コードの構造体は、分割文字コードとその葉Ｌ♯へのポインタを格納するデータ構造体である。分割文字コードの構造体６００についての２分探索では、かならずヒットすることとなる。
【００６２】
（１８）そして、分割文字コード「０ｘ５Ａ」がヒットするため、対応する葉Ｌ＃（０ｘ５Ａ）へのポインタにより、２N分枝無節点ハフマン木の葉Ｌ＃（０ｘ５Ａ）の構造体が指定される。図６の葉Ｌ＃（０ｘ５Ａ）の構造体には、あらかじめ、分割文字コード「０ｘ５Ａ」の圧縮符号“０１０１００１１０１１０”、その圧縮符号長１２ビット、分割文字コードの構造体６００の「０ｘ５Ａ」へのポインタが格納されている。
【００６３】
（１９）そして、コンピュータは、指定された葉Ｌ＃（０ｘ５Ａ）の構造体の照合フラグをＯＮにする。
【００６４】
（２０）また、コンピュータは、照合／置換テーブルＴの空きポインタｐ３を、葉Ｌ＃（０ｘ５Ａ）の構造体内の照合／置換テーブルＴへのポインタとして設定する。コンピュータは、これにより照合／置換テーブルＴのポインタｐ３で指定されるレコードにアクセスすることができる。
【００６５】
（２１）そして、コンピュータは、照合／置換テーブルＴのポインタｐ３で指定されるレコードの圧縮符号長項目に、葉Ｌ＃（０ｘ５Ａ）の構造体の圧縮符号長１２ビットを書き込む。また、コンピュータは、照合／置換テーブルＴのポインタｐ３で指定されるレコードの圧縮符号項目に、葉Ｌ＃（０ｘ５Ａ）の構造体の圧縮符号“０１０１００１１０１１０”を書き込む。さらに、コンピュータは、照合／置換テーブルＴのポインタｐ３で指定されるレコードの置換文字列項目に、「０ｘ５Ａ」の置換文字列「＜ｃｏｌｏｒ＞０ｘ５Ａ＜／ｃｏｌｏｒ＞」を書き込む。これにより、照合／置換テーブルＴ４は照合／置換テーブルＴ５に更新される。
【００６６】
図７は、基礎単語ではない検索文字列「婚活」が与えられた場合の照合／置換テーブルＴの作成例（その６）を示す説明図である。
【００６７】
（２２）コンピュータは、分割文字コードの構造体６００において、図５の（１６）で分割された下位分割文字コード「０ｘ５Ａ」を２分探索する。
【００６８】
（２３）そして、分割文字コード「０ｘ５Ａ」がヒットするため、対応する葉Ｌ＃（０ｘ５Ａ）へのポインタにより、２N分枝無節点ハフマン木の葉Ｌ＃（０ｘ５Ａ）の構造体が指定される。
【００６９】
（２４）そして、コンピュータは、上位分割文字コード「０ｘ５Ａ」の構造体で設定された照合／置換テーブルＴのポインタｐ３で特定される圧縮符号長１２ビットに、葉Ｌ＃（０ｘ５Ａ）の構造体に格納されている圧縮符号長１２ビットを加算して２４ビットとする。
【００７０】
また、コンピュータは、照合／置換テーブルＴへのポインタｐ３で特定される圧縮符号“０１０１００１１０１１０”の末尾に、葉Ｌ＃（０ｘ５Ａ）の構造体に格納されている圧縮符号“０１０１００１１０１１０”を連結する。さらに、コンピュータは、照合／置換テーブルＴへのポインタｐ３で特定される置換文字列「＜ｃｏｌｏｒ＞０ｘ５Ａ＜／ｃｏｌｏｒ＞」の末尾に、下位分割文字コード「０ｘ５Ａ」の置換文字列「＜ｃｏｌｏｒ＞０ｘ５Ａ＜／ｃｏｌｏｒ＞」を連結する。連結後の置換文字列は、以下のようになる。
【００７１】
「＜ｃｏｌｏｒ＞０ｘ５Ａ＜／ｃｏｌｏｒ＞＜ｃｏｌｏｒ＞０ｘ５Ａ＜／ｃｏｌｏｒ＞」
【００７２】
この場合、冗長さを回避するため、上位分割文字コード「０ｘ５Ａ」と下位分割文字コード「０ｘ５Ａ」との間の「＜／ｃｏｌｏｒ＞＜ｃｏｌｏｒ＞」を削除して、「＜ｃｏｌｏｒ＞婚＜／ｃｏｌｏｒ＞」を連結後の置換文字列とする。これにより、照合／置換テーブルＴ５は照合／置換テーブルＴ６に更新される。これにより、単一文字「婚」についての更新は完了する。
【００７３】
図８は、基礎単語ではない検索文字列「婚活」が与えられた場合の照合／置換テーブルＴの作成例（その７）を示す説明図である。
【００７４】
（２５）まず、コンピュータは、高位文字コードの構造体５００において、検索文字列「婚活」のうち末尾文字「活」を２分探索する。
【００７５】
（２６）そして、末尾文字「活」は高出現頻度の文字であるため、高位文字コードの構造体５００でヒットすることとなる。
【００７６】
（２７）そして、対応する葉Ｌ＃（活）へのポインタにより、２N分枝無節点ハフマン木の葉Ｌ＃（活）の構造体が指定される。図８の葉Ｌ＃（活）の構造体には、あらかじめ、高位文字「活」の圧縮符号“００１１１００１０”、その圧縮符号長９ビット、高位文字コードの構造体５００の「活」へのポインタが格納されている。そして、コンピュータは、指定された葉Ｌ＃（活）の構造体の照合フラグをＯＮにする。
【００７７】
（２８）また、コンピュータは、照合／置換テーブルＴの空きポインタｐ４を、葉Ｌ＃（活）の構造体内の照合／置換テーブルＴへのポインタとして設定する。コンピュータは、これにより照合／置換テーブルＴのポインタｐ４で指定されるレコードにアクセスすることができる。
【００７８】
（２９）そして、コンピュータは、照合／置換テーブルＴのポインタｐ４で指定されるレコードの圧縮符号長項目に、葉Ｌ＃（活）の構造体の圧縮符号長９ビットを書き込む。また、コンピュータは、照合／置換テーブルＴのポインタｐ４で指定されるレコードの圧縮符号項目に、葉Ｌ＃（活）の構造体の圧縮符号“００１１１００１０”を書き込む。さらに、コンピュータは、照合／置換テーブルＴのポインタｐ４で指定されるレコードの置換文字列項目に、「活」の置換文字列「＜ｃｏｌｏｒ＞活＜／ｃｏｌｏｒ＞」を書き込む。これにより、照合／置換テーブルＴ６は照合／置換テーブルＴ７に更新される。
【００７９】
図９は、基礎単語「結婚」が検索文字列として与えられた場合の照合／置換テーブルＴの作成例（その１）を示す説明図である。
【００８０】
（１）まず、コンピュータは、特殊単語の構造体１００において、検索文字列「結婚」を２分探索する。
【００８１】
（２）検索文字列「結婚」は特殊単語の構造体１００に登録されているため、ヒットする。そして、対応する葉Ｌ＃（結婚）へのポインタにより、２N分枝無節点ハフマン木の葉Ｌ＃（結婚）の構造体が指定される。図９の葉Ｌ＃（結婚）の構造体には、あらかじめ、基礎単語「結婚」の圧縮符号“０１０１００１００００００”、その圧縮符号長１３ビット、特殊単語の構造体１００の「結婚」へのポインタが格納されている。
【００８２】
（３）そして、コンピュータは、指定された葉Ｌ＃（結婚）の構造体の照合フラグをＯＮにする。
【００８３】
（４）また、コンピュータは、照合／置換テーブルＴの空きポインタｐ１を、葉Ｌ＃（結婚）の構造体内の照合／置換テーブルＴへのポインタとして設定する。コンピュータは、これにより照合／置換テーブルＴのポインタｐ１で指定されるレコードにアクセスすることができる。
【００８４】
（５）そして、コンピュータは、照合／置換テーブルＴのポインタｐ１で指定されるレコードの圧縮符号長項目に、葉Ｌ＃（結婚）の構造体の圧縮符号長１３ビットを書き込む。また、コンピュータは、照合／置換テーブルＴのポインタｐ１で指定されるレコードの圧縮符号項目に、葉Ｌ＃（結婚）の構造体の圧縮符号“０１０１００１００００００”を書き込む。さらに、コンピュータは、照合／置換テーブルＴのポインタｐ１で指定されるレコードの置換文字列項目に、「結婚」の置換文字列「＜ｃｏｌｏｒ＞結婚＜／ｃｏｌｏｒ＞」を書き込む。これにより、照合／置換テーブルＴ０は照合／置換テーブルＴ１に更新される。
【００８５】
図１０は、基礎単語「結婚」が検索文字列として与えられた場合の照合／置換テーブルＴの作成例（その２）を示す説明図である。
【００８６】
（６）つぎに、検索文字列「結婚」を単一文字「結」，「婚」に分割する。
【００８７】
（７）そして、コンピュータは、高位文字コードの構造体５００において、先頭の単一文字「結」を２分探索する。単一文字「結」は高出現頻度の文字であるため、高位文字コードの構造体５００でヒットすることとなる。このあと、対応する葉Ｌ＃（結）へのポインタにより、２N分枝無節点ハフマン木の葉Ｌ＃（結）の構造体が指定される。図１０の葉Ｌ＃（結）の構造体には、あらかじめ、高位文字「結」の圧縮符号“００００１００”、その圧縮符号長７ビット、高位文字コードの構造体５００の「結」へのポインタが格納されている。
【００８８】
（８）そして、コンピュータは、指定された葉Ｌ＃（結）の構造体の照合フラグをＯＮにする。
【００８９】
（９）また、コンピュータは、照合／置換テーブルＴの空きポインタｐ２を、葉Ｌ＃（結婚）の構造体内の照合／置換テーブルＴへのポインタとして設定する。コンピュータは、これにより照合／置換テーブルＴのポインタｐ２で指定されるレコードにアクセスすることができる。
【００９０】
（１０）そして、コンピュータは、照合／置換テーブルＴのポインタｐ２で指定されるレコードの圧縮符号長項目に、葉Ｌ＃（結）の構造体の圧縮符号長７ビットを書き込む。また、コンピュータは、照合／置換テーブルＴのポインタｐ２で指定されるレコードの圧縮符号項目に、葉Ｌ＃（結）の構造体の圧縮符号“００００１００”を書き込む。さらに、コンピュータは、照合／置換テーブルＴのポインタｐ２で指定されるレコードの置換文字列項目に、「結」の置換文字列「＜ｃｏｌｏｒ＞結＜／ｃｏｌｏｒ＞」を書き込む。これにより、照合／置換テーブルＴ１は照合／置換テーブルＴ２に更新される。
【００９１】
図１１は、基礎単語「結婚」が検索文字列として与えられた場合の照合／置換テーブルＴの作成例（その３）を示す説明図である。図１０の（１０）のあと、コンピュータは、高位文字コードの構造体５００において、検索文字列「結婚」のうち末尾文字「婚」を２分探索するが、図５に示したように、単一文字「婚」は低出現頻度の文字であるため、高位文字コードの構造体５００でヒットしない。
【００９２】
（１１）したがって、コンピュータは、高位文字コードの構造体５００でヒットしなかった低出現頻度の文字「婚」の文字コード「５Ａ５Ａ」を上位８ビット「０ｘ５Ａ」と下位８ビット「０ｘ５Ａ」とに分割する。ＵＴＦ１６ビットコードの文字は、８ビットコードの組み合わせで表現されるため、低出現頻度の文字については分割することで、低出現頻度の文字の総数を、たかだか２５６個に抑えることができる。
【００９３】
（１２）コンピュータは、分割文字コードの構造体６００において、（１１）で分割された上位分割文字コード「０ｘ５Ａ」を２分探索する。この場合、分割文字コード「０ｘ５Ａ」がヒットするため、対応する葉Ｌ＃（０ｘ５Ａ）へのポインタにより、２N分枝無節点ハフマン木の葉Ｌ＃（０ｘ５Ａ）の構造体が指定される。図１１の葉Ｌ＃（０ｘ５Ａ）の構造体には、あらかじめ、分割文字コード「０ｘ５Ａ」の圧縮符号“０１０１００１１０１１０”、その圧縮符号長１２ビット、分割文字コードの構造体６００の「０ｘ５Ａ」へのポインタが格納されている。
【００９４】
（１３）そして、コンピュータは、指定された葉Ｌ＃（０ｘ５Ａ）の構造体の照合フラグをＯＮにする。
【００９５】
（１４）また、コンピュータは、照合／置換テーブルＴの空きポインタｐ３を、葉Ｌ＃（０ｘ５Ａ）の構造体内の照合／置換テーブルＴへのポインタとして設定する。コンピュータは、これにより照合／置換テーブルＴのポインタｐ３で指定されるレコードにアクセスすることができる。
【００９６】
（１５）そして、コンピュータは、照合／置換テーブルＴのポインタｐ３で指定されるレコードの圧縮符号長項目に、葉Ｌ＃（０ｘ５Ａ）の構造体の圧縮符号長１２ビットを書き込む。また、コンピュータは、照合／置換テーブルＴのポインタｐ３で指定されるレコードの圧縮符号項目に、葉Ｌ＃（０ｘ５Ａ）の構造体の圧縮符号“０１０１００１１０１１０”を書き込む。さらに、コンピュータは、照合／置換テーブルＴのポインタｐ３で指定されるレコードの置換文字列項目に、「０ｘ５Ａ」の置換文字列「＜ｃｏｌｏｒ＞０ｘ５Ａ＜／ｃｏｌｏｒ＞」を書き込む。これにより、照合／置換テーブルＴ２は照合／置換テーブルＴ３に更新される。
【００９７】
下位分割文字コード「０ｘ５Ａ」についても、図６および図７のように、（１２）、（１４）、（１５）の処理をおこなう。具体的には、（１５）において、コンピュータは、上位分割文字コード「０ｘ５Ａ」の構造体で設定された照合／置換テーブルＴのポインタｐ３で特定される圧縮符号長１２ビットに、葉Ｌ＃（０ｘ５Ａ）の構造体に格納されている圧縮符号長１２ビットを加算して２４ビットとする。
【００９８】
また、コンピュータは、照合／置換テーブルＴへのポインタｐ３で特定される圧縮符号“０１０１００１１０１１０”の末尾に、葉Ｌ＃（０ｘ５Ａ）の構造体に格納されている圧縮符号“０１０１００１１０１１０”を連結する。さらに、コンピュータは、照合／置換テーブルＴへのポインタｐ３で特定される置換文字列「＜ｃｏｌｏｒ＞０ｘ５Ａ＜／ｃｏｌｏｒ＞」の末尾に、下位分割文字コード「０ｘ５Ａ」の置換文字列「＜ｃｏｌｏｒ＞０ｘ５Ａ＜／ｃｏｌｏｒ＞」を連結する。連結後の置換文字列は、以下のようになる。
【００９９】
「＜ｃｏｌｏｒ＞０ｘ５Ａ＜／ｃｏｌｏｒ＞＜ｃｏｌｏｒ＞０ｘ５Ａ＜／ｃｏｌｏｒ＞」
【０１００】
この場合、冗長さを回避するため、上位分割文字コード「０ｘ５Ａ」と下位分割文字コード「０ｘ５Ａ」との間の「＜／ｃｏｌｏｒ＞＜ｃｏｌｏｒ＞」を削除して、「＜ｃｏｌｏｒ＞婚＜／ｃｏｌｏｒ＞」を連結後の置換文字列とする。すなわち、終了タグと開始タグが連続した場合には削除する。これにより、照合／置換テーブルＴ２は照合／置換テーブルＴ３に更新される。これにより、単一文字「婚」についての更新は完了する。
【０１０１】
＜２N分枝無節点ハフマン木のサイズ決定方法＞
図１２は、２N分枝無節点ハフマン木のサイズ決定方法の一例を示す説明図である。文字情報群の総種類数Ｘが、どの範囲にあるかで、適用される２N分枝無節点ハフマン木のサイズが決定される。２N分枝無節点ハフマン木のサイズとは、最大枝数２Nである。べき数Ｎは、圧縮符号長の上限となる。したがって、２N分枝無節点ハフマン木のサイズを決定する場合は、べき数Ｎを文字情報群の総種類数Ｘに応じて決定すればよい。
【０１０２】
具体的には、文字情報群の総種類数Ｘが２x-2＜Ｘ≦２x-1である場合、少なくとも最大枝数２Nが２x-1本あればハフマン木が構築できる。サイズを最小限にするには、Ｎ＝ｘ−１とすればよい。また、文字情報群の総種類数Ｘが２x-1＜Ｘ≦２xである場合、少なくとも最大枝数２Nが２x本あればハフマン木が構築できる。サイズを最小限にするには、Ｎ＝ｘとすればよい。また、文字情報群の総種類数Ｘが２x＜Ｘ≦２x+1である場合、少なくとも最大枝数２Nが２x+1本あればハフマン木が構築できる。サイズを最小限にするには、Ｎ＝ｘ＋１とすればよい。
【０１０３】
たとえば、文字情報群の総種類数Ｘ＝１３０５個である場合、２10＜Ｘ≦２11となるため、最大枝数２Nのべき数Ｎは、Ｎ＝１１となる。したがって、２11分枝無節点ハフマン木が生成され、最大でも１１ビットの圧縮符号長の圧縮符号で文字情報を圧縮することができる。
【０１０４】
また、文字情報群の総種類数Ｘ＝３０４８個である場合、２11＜Ｘ≦２12となるため、最大枝数２Nのべき数Ｎは、Ｎ＝１２となる。したがって、２12分枝無節点ハフマン木が生成され、最大でも１２ビットの圧縮符号長の圧縮符号で文字情報を圧縮することができる。
【０１０５】
さらに、文字情報群の総種類数Ｘ＝５４０１個である場合、２12＜Ｘ≦２13となるため、最大枝数２Nのべき数Ｎは、Ｎ＝１３となる。したがって、２13分枝無節点ハフマン木が生成され、最大でも１３ビットの圧縮符号長の圧縮符号で文字情報を圧縮することができる。
【０１０６】
＜２N分枝無節点ハフマン木の生成までの流れ＞
図１３は、２N分枝無節点ハフマン木の生成までの流れを示す説明図である。
【０１０７】
（１）出現回数の集計
まず、コンピュータは、対象ファイル群に存在する文字情報の出現回数を計数する。計数対象となる対象ファイル群は、たとえば、文書ファイル、Ｗｅｂページなどの電子データであり、たとえば、テキスト形式、ＨＴＭＬ（ＨｙｐｅｒＴｅｘｔ  Ｍａｒｋｕｐ  Ｌａｎｇｕａｇｅ）形式、ＸＭＬ（Ｅｘｔｅｎｓｉｂｌｅ  Ｍａｒｋｕｐ  Ｌａｎｇｕａｇｅ）形式の電子データである。また、単一の対象ファイルを計数対象としてもよい。集計結果は、出現回数の降順にソートされ、出現回数の大きい方から昇順の順位がつけられる。なお、ここでは、文字情報の総種類数は、例として１３０５個（＜２０４８（＝２11））とする。
【０１０８】
（２）圧縮符号長算出
つぎに、（１）で得られた集計結果を基にして、コンピュータは、文字情報ごとの圧縮符号長を算出する。具体的には、コンピュータは、文字情報ごとに、出現率を算出する。出現率は、文字情報の出現回数を全文字情報の総出現回数で割ることで得られる。そして、コンピュータは、出現率に対応する生起確率を求め、生起確率から圧縮符号長を導き出す。
【０１０９】
生起確率は、１／２xで表現される。ｘはべき数である。圧縮符号長は、生起確率のべき数ｘとなる。具体的には、出現率が生起確率の以下のどの範囲であるかで圧縮符号長が決定される。ＡＲは出現率である。
１／２0＞ＡＲ≧１／２1・・・圧縮符号長は１ビット。
１／２1＞ＡＲ≧１／２2・・・圧縮符号長は２ビット。
１／２2＞ＡＲ≧１／２3・・・圧縮符号長は３ビット。
１／２3＞ＡＲ≧１／２4・・・圧縮符号長は４ビット。
・
・
・
１／２N-1＞ＡＲ≧１／２N・・・圧縮符号長はＮビット。
【０１１０】
（３）葉数特定
つぎに、コンピュータは、圧縮符号長ごとに葉数を集計することで圧縮符号長ごとの葉数を特定する。図１３では、最大圧縮符号長は１７ビットとする。また、葉数とは、文字情報の種類数である。したがって、圧縮符号長５ビットの葉数が２である場合、５ビットの圧縮符号が割り当てられる文字情報が２つ存在することを示している。
【０１１１】
（４）葉数補正
つぎに、コンピュータは、葉数を補正する。具体的には、コンピュータは、枝数の上限２Nのべき数Ｎが最大圧縮符号長となるように補正する。たとえば、べき数Ｎ＝１１の場合、圧縮符号長１１ビット〜１７ビットまでの葉数の総和を、補正後の圧縮符号長１１ビットの葉数にする。そして、コンピュータは、圧縮符号長ごとに葉当たりの枝数を割り当てる。具体的には、補正後の圧縮符号長に対し、その降順に、２0、２1、２2、２3、２4、２5、２6、２7として葉当たりの枝数を決定する。
【０１１２】
たとえば、図１３では、圧縮符号長１１ビットの圧縮符号が割り当てられる文字情報の総数（葉数）は１２１５個であるが、その葉当たりの枝数は１である。圧縮符号長１１ビットの圧縮符号が割り当てられる文字情報については、それぞれ１本の枝しか割り当てられないこととなる。一方、圧縮符号長６ビットの圧縮符号が割り当てられる文字情報の総数（葉数）は６個であるが、その葉当たりの枝数は３２である。圧縮符号長６ビットの圧縮符号が割り当てられる文字情報については、それぞれ３２本の枝が割り当てられることとなる。
【０１１３】
（５）葉の構造体生成
つぎに、コンピュータは、葉の構造体を生成する。葉の構造体とは、文字情報とその圧縮符号長とその圧縮符号長での圧縮符号が対応付けられたデータ構造体である。たとえば、出現順位が１位である文字「０」の圧縮符号長は６ビットであり、圧縮符号は「００００００」となる。図１３の例では、文字情報の種類数（葉数）は１３０５個であるため、葉Ｌ１の構造体〜葉Ｌ１３０５の構造体が生成されることとなる。
【０１１４】
（６）葉へのポインタ生成
つぎに、コンピュータは、葉の構造体ごとに葉へのポインタを生成する。葉へのポインタは、そのポイント先となる葉の構造体内の圧縮符号に、その葉当たりの枝数分の番号に相当するビット列を連結したビット列である。たとえば、葉Ｌ１である文字「０」に割り当てられた圧縮符号「００００００」の圧縮符号長は６ビットであるため、葉Ｌ１当たりの枝数は３２本である。
【０１１５】
したがって、葉Ｌ１へのポインタの先頭６ビットは、圧縮符号「００００００」となる。後続ビット列は、葉Ｌ１当たりの枝数で表現される３２（＝２5）種のビット列となる。すなわち、３２種の５ビットのビット列が圧縮符号「００００００」の後続ビット列となる。したがって、葉Ｌ１へのポインタは、先頭６ビットが「００００００」で固定された３２種の１１ビットのビット列となる。なお、葉当たりの枝数が１本の場合は、葉へのポインタは１個であり、圧縮符号とその葉へのポインタは同一ビット列となる。
【０１１６】
（７）２N分枝無節点ハフマン木の構築
最後に、コンピュータは、２N分枝無節点ハフマン木を構築する。具体的には、葉のポインタを根とすることで、葉の構造体を直接指定する２N分枝無節点ハフマン木が構築される。圧縮符号列が、先頭６ビットが「００００００」の１１ビットのビット列である場合、後続の５ビットが３２種のいずれのビット列であっても、２N分枝無節点ハフマン木により文字「０」の葉Ｌ１の構造体をポイントすることができる。
【０１１７】
＜（１）出現回数の集計の詳細＞
図１４は、図２の（１）出現回数の集計の詳細を示す説明図である。コンピュータは、対象ファイル群Ｆｓ内の文字コードについて出現回数を集計して降順にソートする。そして、高位（たとえば、１〜１０２４位まで）の文字コードと低位（１０２５位以下）の文字コードに分ける。
【０１１８】
高位の文字コードは出現頻度が高いため、１６ビットコードとして圧縮符号を割り当てる。低位の文字コードは、上位８ビットと下位８ビットに分割する。１６ビットコードでは最大で６５５３６（２５６×２５６）種の文字を扱えるが、低位の文字コードを、８ビットで分割することにより、６万種以上ある低位の文字コードを２５６種の分割文字コードに抑えることができる。
【０１１９】
たとえば、漢字の「兎」の１６ビットの文字コードは“０ｘ５１４Ｅ”であるため、上位８ビット“０ｘ５１”と下位８ビット“０ｘ４Ｅ”に分割する。同様に、漢字の「兆」の１６ビットの文字コードは“０ｘ５１４６”であるため、上位８ビット“０ｘ５１”と下位８ビット“０ｘ４６”に分割する。そして、分割された８ビットの分割文字コードの出現頻度を集計する。この「兎」および「兆」の例では、分割文字コード“０ｘ５１”の出現頻度は２回、分割文字コード“０ｘ４Ｅ”，“０ｘ４６”は１回となる。
【０１２０】
また、＜ｐ＞や＜ｐ／＞といったタグなどを予約語とする。予約語は数十種（例として２５種）決めておく。また、必要に応じて基礎単語も決めておく。基礎単語は例として４０９６種としておく。そして、高位文字コード群、分割文字コード群および予約語群、基礎単語群を混在させて出現頻度を再集計し、出現頻度の降順に再ソートする。再ソート結果が図１３の集計結果となる。
【０１２１】
基礎単語群を集計しない場合、出現頻度の降順にソートされた１３０５種の文字情報が得られる。文字情報の種類数をこの程度の数に抑えることで、１６ビットの文字コードを１２ビット以下の圧縮符号に圧縮し、圧縮符号を１６ビットの文字コードに伸長することが可能となる。
【０１２２】
また、基礎単語群を集計する場合、出現頻度の降順にソートされた５４０１種の文字情報が得られる。４０９６種の基礎単語を集計すると、１６ビットの文字コードを１３ビット以下の圧縮符号に圧縮することができ、圧縮符号を１６ビットの文字コードに伸長することが可能となる。また、基礎単語は１６ビットコードが複数連結された文字列であるため、文字数がｎ個である場合、ｎ×１６ビットコードをたかだか１３ビット以下の圧縮符号に圧縮でき、その圧縮符号をｎ×１６ビットコードの基礎単語に伸長することができる。
【０１２３】
つぎに、出現マップ群１５０１〜１５０３について説明する。出現マップ群とは、出現マップの集合である。出現マップ群は、高位文字、分割文字コード、特殊単語ごとに用意される。各出現マップ群を構成する出現マップは、文字情報ごとに存在する対象ファイルの番号に対応するビットをＯＮ（たとえば、１）にし、存在しない対象ファイルの番号に対応するビットをＯＦＦ（たとえば、０）にしたビット列である。出現マップは、対象ファイル群Ｆｓを対象ファイルごとに集計する際に生成される。
【０１２４】
図１５は、文字情報が高位文字である場合の出現マップ群１５０１を示す説明図である。図１５の出現マップ群１５０１では、高位文字ごとに、対象ファイル数ｎ個分のビット列が設定されている。ビット列のうち「１」になっているファイル番号の対象ファイルに、その高位文字が少なくとも１回出現したことを示している。たとえば、高位文字「結」は、対象ファイルＦ１、Ｆ３に少なくとも１回出現し、対象ファイルＦ２，Ｆｎには１回も出現しない。
【０１２５】
図１６は、文字情報が分割文字コードである場合の出現マップ群１５０２を示す説明図である。図１６の出現マップ群１５０２では、分割文字コードごとに、対象ファイル数ｎ個分のビット列が設定されている。ビット列のうち「１」になっているファイル番号の対象ファイルに、その分割文字コードが少なくとも１回出現したことを示している。たとえば、分割文字コード「０ｘ５Ａ」は、対象ファイルＦ１〜Ｆ３に少なくとも１回出現し、対象ファイルＦｎには１回も出現しない。すなわち、分割文字コード「０ｘ５Ａ」を上位ビットまたは下位ビットとする文字が対象ファイルＦ１〜Ｆ３に存在する。
【０１２６】
図１７は、文字情報が特殊単語である場合の出現マップ群１５０３を示す説明図である。図１７の出現マップ群１５０３では、特殊単語ごとに、対象ファイル数ｎ個分のビット列が設定されている。ビット列のうち「１」になっているファイル番号の対象ファイルに、その特殊単語が少なくとも１回出現したことを示している。たとえば、特殊単語「結婚」は、対象ファイルＦ３に少なくとも１回出現し、対象ファイルＦ１，Ｆ２，Ｆｎには１回も出現しない。
【０１２７】
＜（２）圧縮符号長算出の詳細（Ｎ＝１１）＞
図１８は、図１３の（２）圧縮符号長算出の詳細（Ｎ＝１１）を示す説明図である。図１８の文字情報テーブルは、図１４の集計結果を反映したテーブルであり、文字情報ごとに順位項目、伸長種別項目、コード項目、文字項目、出現回数項目、総回数項目、出現率項目、補正前での生起確率項目および圧縮符号長項目が設定されている。このうち、順位項目〜総回数項目までが図３の再ソート結果で得られた情報である。
【０１２８】
ここで、順位項目には、文字情報の出現回数の降順に順位（昇順）が書き込まれている。文字情報項目のうち伸長種別項目には、文字情報の種別が書き込まれる。「１６」は１６ビットコード（の単一文字）を示している。「８」は８ビットの分割文字コードを示している。「特」は特殊単語（基礎単語または予約語）を示している。
【０１２９】
文字情報項目のうちコード項目には、高位文字コードまたは分割文字コードが書き込まれている。特殊単語の場合は空欄とする。文字情報項目のうち文字項目には、文字や特殊単語が書き込まれている。分割文字コードの場合は空欄とする。出現回数項目には、対象ファイル群Ｆｓでの文字情報の出現回数が書き込まれている。総回数項目には、全文字情報の総出現回数が書き込まれている。
【０１３０】
出現率項目には、出現回数を総回数で割り算した値が出現率として書き込まれている。補正前項目の生起確率項目には、出現率に対応する生起確率が書き込まれている。圧縮符号長項目には、生起確率に応じた圧縮符号長、すなわち、生起確率１／２yのべき数ｙが圧縮符号長として書き込まれている。
【０１３１】
＜（３）葉数特定〜（５）葉の構造体生成の詳細（Ｎ＝１１）＞
図１９は、図１３の（３）葉数特定〜（５）葉の構造体生成の詳細（Ｎ＝１１）を示す説明図である。図１８の文字情報テーブルを圧縮符号長単位で葉数（文字情報の総種類数）を集計した結果が、図１９における補正前の葉数となる。ここで、補正Ａとは、圧縮符号長の上限長Ｎ（すなわち、２N分枝無節点ハフマン木の最大枝数２Nのべき数Ｎ）以上の圧縮符号長に割り当てられた葉数を、圧縮符号長の上限長Ｎに集約する補正である。この場合、補正前での最大圧縮符号長は１７ビットであるが、文字情報の総種類数が１３０５種であるため、圧縮符号長の上限長Ｎは、Ｎ＝１１となる。したがって、補正Ａでは、圧縮符号長１１ビットの葉数が、圧縮符号長が１１ビット〜１７ビットの葉数の総和（１１９０個）となる。
【０１３２】
そして、コンピュータは、生起確率総和を求める。圧縮符号長ごとの生起確率は決められているため（５ビットなら１／２5）、圧縮符号長ごとに生起確率を葉数で乗じることで、圧縮符号長ごとの乗算結果が得られる。たとえば、補正Ａにおける圧縮符号長５ビットの葉数は２である。圧縮符号長５ビットの生起確率は、１／２5である。したがって、補正Ａにおける圧縮符号長５ビットの生起確率は、２×（１／２5）＝１／２4となる。圧縮符号長６ビット以降も同様に補正Ａにおける圧縮符号長生起確率を求める。そして、補正Ａ後における各圧縮符号長の生起確率を合計することで、補正Ａでの生起確率総和が得られる。
【０１３３】
そして、コンピュータは、生起確率総和が１以下であるか否かを判断する。しきい値ｔは０＜ｔ≦１である。しきい値ｔを設けたくない場合は、ｔ＝１とすればよい。しきい値ｔ未満であれば、補正Ｂに移行する。しきい値ｔ以上１以下である場合は、補正Ｂに移行せず、この時点での圧縮符号長ごとの葉数で確定する。
【０１３４】
補正Ｂは、補正Ａでの圧縮符号長群（５ビット〜１２ビット）は変えずに、葉数を更新する補正である。具体的には、補正Ａでの生起確率総和が、しきい値ｔ以上１以下でない場合におこなわれる補正である。より具体的には、補正Ｂは２種類ある。
【０１３５】
１つ目は、生起確率総和がしきい値ｔ未満である場合、生起確率総和が１以下の最大値が得られるまで、たとえば、最大漸近値に収束するまで、生起確率総和を増加させる補正（以下、補正Ｂ+）である。もう１つは、生起確率総和が１より大きい場合、生起確率総和が１以下に割り込んでから１以下の最大値が得られるまで、たとえば、最大漸近値に収束するまで、生起確率総和を減少させる補正（以下、補正Ｂ-）である。
【０１３６】
図１９に示した例では、補正Ａでの生起確率総和が「１．１４６」であるため、補正Ｂ-をおこなうこととなる。なお、補正Ｂ+および補正Ｂ-のいずれの補正Ｂであっても、葉数を生起確率総和で割るという同じ補正をおこなう。
【０１３７】
まず、補正Ｂ-の１回目（補正Ｂ-１）では、圧縮符号長ごとの補正Ａでの葉数を、前回の補正（この場合は補正Ａ）の生起確率の総和（１．１４６）で割ることで、葉数を更新する。なお、小数点以下は切り捨てでも、四捨五入でもよい。なお、補正Ａでの圧縮符号長の上限長Ｎ（Ｎ＝１１ビット）については、前回の補正（この場合は補正Ａ）の生起確率総和（１．１４６）で割ることはせず、葉の総数（１３０５個）から、補正Ｂ-１での圧縮符号長ごとの葉の総数（圧縮符号長の上限長Ｎの葉数除く）を引くことで、圧縮符号長の上限長Ｎの葉数を求める。この場合は、１２０８個である。
【０１３８】
このあと、コンピュータは、補正Ａの場合と同様の計算処理により、補正Ｂ-１での生起確率総和を求める。そして、コンピュータは、補正Ｂ-１での生起確率総和が１以下の最大漸近値に収束したか否かを判断する。補正Ｂ-１での生起確率総和が１以下の最大漸近値に収束していなければ、補正Ｂ-の２回目（補正Ｂ-２）に移行する。最大漸近値に収束した場合は、補正Ｂ-２に移行せず、この時点での圧縮符号長ごとの葉数で確定する。補正Ｂ-１で更新された生起確率総和「１．０４２」は１より大きいため、最大漸近値に収束しておらず、補正Ｂ-２に移行する。
【０１３９】
補正Ｂ-２では、圧縮符号長ごとの補正Ｂ-１での葉数を、前回の補正（この場合は補正Ｂ-１）の生起確率総和（１．０４２）で割ることで、葉数を更新する。なお、小数点以下は切り捨てでも、四捨五入でもよい。なお、補正Ｂ-１での圧縮符号長の上限長Ｎ（Ｎ＝１１ビット）については、前回の補正（この場合は補正Ｂ-１）の生起確率総和（１．０４２）で割ることはせず、葉の総数（１３０５個）から、補正Ｂ-２での圧縮符号長ごとの葉の総数（圧縮符号長の上限長Ｎの葉数除く）を引くことで、圧縮符号長の上限長Ｎの葉数を求める。この場合は、１２１５個である。
【０１４０】
このあと、コンピュータは、補正Ｂ-１の場合と同様の計算処理により、補正Ｂ-２での生起確率総和を求める。そして、コンピュータは、補正Ｂ-２での生起確率総和が１以下の最大漸近値に収束したか否かを判断する。補正Ｂ-２での生起確率総和が１以下の最大漸近値に収束していなければ、補正Ｂ-の３回目（補正Ｂ-３）に移行する。最大漸近値に収束した場合は、補正Ｂ-３に移行せず、この時点での圧縮符号長ごとの葉数で確定する。補正Ｂ-２で更新された生起確率総和「０．９８２」は１以下であるが、最大漸近値に収束しているかが不明であるため、補正Ｂ-３に移行する。
【０１４１】
補正Ｂ-３では、圧縮符号長ごとの補正Ｂ-２での葉数を、前回の補正（この場合は補正Ｂ-２）の生起確率総和（０．９８２）で割ることで、葉数を更新する。なお、小数点以下は切り捨てでも、四捨五入でもよい。なお、補正Ｂ-２での圧縮符号長の上限長Ｎ（Ｎ＝１１ビット）については、前回の補正（この場合は補正Ｂ-２）の生起確率総和（０．９８２）で割ることはせず、葉の総数（１３０５個）から、補正Ｂ-３での圧縮符号長ごとの葉の総数（圧縮符号長の上限長Ｎの葉数除く）を引くことで、圧縮符号長の上限長Ｎの葉数を求める。この場合は、１２１５個である。
【０１４２】
このあと、コンピュータは、補正Ｂ-２の場合と同様の計算処理により、補正Ｂ-３での生起確率総和を求める。そして、コンピュータは、補正Ｂ-３での生起確率総和が１以下の最大漸近値に収束したか否かを判断する。補正Ｂ-３での生起確率総和が１以下の最大漸近値に収束していなければ、補正Ｂ-の４回目（補正Ｂ-４）に移行する。最大漸近値に収束した場合は、補正Ｂ-４に移行せず、この時点での圧縮符号長ごとの葉数で確定する。補正Ｂ-３で更新された生起確率総和「０．９８２」は、補正Ｂ-２で更新された生起確率総和「０．９８２」と同じ値である。すなわち、補正Ｂ-３での各圧縮符号長の葉数と補正Ｂ-２での各圧縮符号長の葉数とは同じである。この場合、コンピュータは、生起確率総和が最大漸近値に収束したと判断し、葉数が確定する。
【０１４３】
このようにして、葉数が確定するまで補正Ｂ-を継続することとなる。図１９の例では、補正Ｂ-３で圧縮符号長ごとの葉数が確定したこととなる。このあと、コンピュータは、圧縮符号長ごとに、葉当たりの枝数を算出することとなる。葉当たりの枝数の算出は、上述したように、圧縮符号長の上限長Ｎ（この場合はＮ＝１１ビット）から降順に、２0、２1、２2、２3、２4、２5、２6として葉当たりの枝数を割り当てることとなる。なお、枝数の小計は、圧縮符号長ごとに、葉当たりの枝数に確定した葉数を乗じた乗算結果である。
【０１４４】
図２０は、文字情報ごとの補正結果を示す説明図である。図２０において、文字情報テーブルには、補正Ａ、補正Ｂ-１〜補正Ｂ-２までの補正結果が追加されている。図１９に示したように、補正により圧縮符号長別の葉数が更新されるため、順位項目の１位の文字情報から短い圧縮符号長が割り当てられることとなる。
【０１４５】
たとえば、補正Ｂ-２で確定した場合、圧縮符号長６ビットでは葉数が６、圧縮符号長７ビットでは葉数が１８、…、圧縮符号長１１ビットでは葉数が１２１５となっている。したがって、順位が１位から６位までの文字情報（葉数６個分）については６ビットの圧縮符号長、順位が７位から２４位までの文字情報（葉数１８個分）については７ビットの圧縮符号長、…、順位が９１位から１３０５位までの文字情報（葉数１２１５個分）については１１ビットの圧縮符号長が割り当てられる。
【０１４６】
そして、コンピュータは、文字情報と文字情報に割り当てられた圧縮符号長と圧縮符号長ごとの葉数とに基づいて、文字情報ごとに圧縮符号を割り当て、葉の構造体を生成することとなる。たとえば、出現率１位の高位文字「０」は５ビットの圧縮符号長が割り当てられているため、圧縮符号が「００００００」となる。したがって、圧縮符号「００００００」、圧縮符号長「６」、文字情報「０」を含む葉Ｌ１の構造体が生成されることとなる。
【０１４７】
＜（６）葉へのポインタ生成の詳細（Ｎ＝１１）＞
図２１は、葉へのポインタ生成の詳細（Ｎ＝１１）を示す説明図である。図２１は、圧縮符号長の上限Ｎが１１ビットの場合の葉へのポインタを示している。図２１において、圧縮符号長が６ビットの葉数は６個であるため、圧縮符号は「００００００」〜「０００１０１」が割り当てられる。また、圧縮符号長が６ビットの葉当たりの枝数は、３２本である。したがって、圧縮符号長が６ビットの圧縮符号についての葉へのポインタは、３２（＝２5）個生成される。具体的には、葉へのポインタの先頭６ビットが圧縮符号で後続５ビットが３２種のビット列となる。したがって、圧縮符号長が６ビットの圧縮符号の各々について、３２種の葉へのポインタが生成されることとなる。
【０１４８】
なお、図示はしないが、圧縮符号長が７ビットの葉数は１８個であるため、圧縮符号「０００１１００」〜「００１１１１１」が割り当てられる。また、圧縮符号長が７ビットの葉当たりの枝数は、１６本である。したがって、圧縮符号長が７ビットの圧縮符号についての葉へのポインタは、１６（＝２4）個生成される。具体的には、葉へのポインタの先頭７ビットが圧縮符号で後続４ビットが１６種のビット列となる。したがって、圧縮符号長が７ビットの圧縮符号の各々について、１６種の葉へのポインタが生成されることとなる。
【０１４９】
同様に、圧縮符号長が８ビットの葉数は２３個であるため、圧縮符号「０１００００００」〜「０１０１０１１０」が割り当てられる。また、圧縮符号長が８ビットの葉当たりの枝数は、８本である。したがって、圧縮符号長が８ビットの圧縮符号についての葉へのポインタは、８（＝２3）個生成される。具体的には、葉へのポインタの先頭８ビットが圧縮符号で後続３ビットが８種のビット列となる。したがって、圧縮符号長が８ビットの圧縮符号の各々について、８種の葉へのポインタが生成されることとなる。
【０１５０】
同様に、圧縮符号長が９ビットの葉数は２３個であるため、圧縮符号「０１０１０１１１０」〜「０１１０００１００」が割り当てられる。また、圧縮符号長が９ビットの葉当たりの枝数は、４本である。したがって、圧縮符号長が９ビットの圧縮符号についての葉へのポインタは、４（＝２2）個生成される。具体的には、葉へのポインタの先頭９ビットが圧縮符号で後続２ビットが４種のビット列となる。したがって、圧縮符号長が９ビットの圧縮符号の各々について、４種の葉へのポインタが生成されることとなる。
【０１５１】
同様に、圧縮符号長が１０ビットの葉数は２０個であるため、圧縮符号「０１１００００１１０」〜「０１１００１１１０１」が割り当てられる。また、圧縮符号長が１０ビットの葉当たりの枝数は、２本である。したがって、圧縮符号長が１０ビットの圧縮符号についての葉へのポインタは、２（＝２1）個生成される。具体的には、葉へのポインタの先頭１０ビットが圧縮符号で後続１ビットが２種のビット列となる。したがって、圧縮符号長が１０ビットの圧縮符号の各々について、２種の葉へのポインタが生成されることとなる。
【０１５２】
同様に、圧縮符号長が１１ビットの葉数は１２１５個であるため、圧縮符号「０１１００１１１１００」〜「１１１１１１１１０１０」が割り当てられる。また、圧縮符号長が１１ビットの葉当たりの枝数は、１本である。したがって、圧縮符号長が１１ビットの圧縮符号についての葉へのポインタは、１（＝２0）個生成される。具体的には、圧縮符号がそのまま葉へのポインタとなる。したがって、圧縮符号長が１１ビットの圧縮符号の各々について、１種の葉へのポインタが生成されることとなる。
【０１５３】
＜（７）２N分枝無節点ハフマン木の構築の詳細（Ｎ＝１１）＞
図２２は、図１３の（７）２N分枝無節点ハフマン木の構築の詳細（Ｎ＝１１）を示す説明図である。図２２では、Ｎ＝１１とした場合の２０４８（＝２11）分枝無節点ハフマン木を示している。根の構造体には、葉へのポインタが格納されている。葉へのポインタはポイント先の葉の構造体を指定することができる。
【０１５４】
具体的には、圧縮符号長が６ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図２１に示したように３２個生成される。したがって、葉Ｌ１の構造体については、根の構造体に３２個の葉Ｌ１へのポインタＬ１Ｐ（１）〜Ｌ１Ｐ（３２）が格納される。葉Ｌ２の構造体〜葉Ｌ６の構造体についても同様である。葉Ｌ７以降の構造体については、図２２のとおりである。
【０１５５】
＜（３）葉数特定〜（５）葉の構造体生成の詳細（Ｎ＝１２）＞
図２３は、図１３の（３）葉数特定〜（５）葉の構造体生成の詳細（Ｎ＝１２）を示す説明図である。なお、Ｎ＝１２の場合は、図１８の文字情報テーブルには、たとえば１０２４種の基礎単語のレコードも追加されることとなる。基礎単語は、１３０５種の文字コード、分割文字コード、予約語よりも、出現回数が低いこととする。したがって、１３０５種に１０２４種を追加した２３２９種の文字情報についての文字情報テーブルが生成されているものとする。また、基礎単語の追加により、図１８の総回数がかわるため、２３２９種の文字情報の生起確率も図１８に示した値とは異なることとなる。
【０１５６】
そして、コンピュータは、図１９の場合と同様に、生起確率総和を求める。そして、コンピュータは、生起確率総和がしきい値ｔ以上１以下であるか否かを判断する。しきい値ｔ未満であれば、補正Ｂに移行する。しきい値ｔ以上１以下である場合は、補正Ｂに移行せず、この時点での圧縮符号長ごとの葉数で確定する。
【０１５７】
図２３の例では、補正Ａでの生起確率総和「０．８２３」はしきい値ｔ未満であるとして、補正Ｂ+をおこなうこととする。
【０１５８】
まず、補正Ｂ+の１回目（補正Ｂ+１）では、圧縮符号長ごとの補正Ａの葉数を、前回の補正（この場合は補正Ａ）の生起確率総和（０．８２３）で割ることで、葉数を更新する。なお、小数点以下は切り捨てでも、四捨五入でもよい。なお、補正Ａでの圧縮符号長の上限長Ｎ（Ｎ＝１２ビット）については、前回の補正（この場合は補正Ａ）の生起確率総和（０．８２３）で割ることはせず、葉の総数（２３２９個）から、補正Ｂ+１での圧縮符号長ごとの葉の総数（圧縮符号長の上限長Ｎの葉数除く）を引くことで、圧縮符号長の上限長Ｎの葉数を求める。この場合は、２１９２個である。
【０１５９】
このあと、コンピュータは、補正Ａの場合と同様の計算処理により、補正Ｂ+１での生起確率総和を求める。そして、コンピュータは、補正Ｂ+１での生起確率総和が１以下の最大漸近値に収束したか否かを判断する。補正Ｂ+１での生起確率総和が１以下の最大漸近値に収束していなければ、補正Ｂ+の２回目（補正Ｂ+２）に移行する。１以下の最大漸近値に収束した場合は、補正Ｂ+２に移行せず、この時点での圧縮符号長ごとの葉数で確定する。補正Ｂ+１で更新された生起確率総和「０．８６１」は１以下であるが、最大漸近値に収束しているかが不明であるため、補正Ｂ+２に移行する。
【０１６０】
補正Ｂ+２では、圧縮符号長ごとの補正Ｂ+１での葉数を、前回の補正（この場合は補正Ｂ+１）の生起確率総和（０．８６１）で割ることで、葉数を更新する。なお、小数点以下は切り捨てでも、四捨五入でもよい。なお、補正Ｂ+２での圧縮符号長の上限長Ｎ（Ｎ＝１２ビット）については、前回の補正（この場合は補正Ｂ+１）の生起確率総和（０．８６１）で割ることはせず、葉の総数（２３２９個）から、補正Ｂ+２での圧縮符号長ごとの葉の総数（圧縮符号長の上限長Ｎの葉数除く）を引くことで、圧縮符号長の上限長Ｎの葉数を求める。この場合は、２１７３個である。
【０１６１】
このあと、コンピュータは、補正Ｂ+１の場合と同様の計算処理により、補正Ｂ+２での生起確率総和を求める。そして、コンピュータは、補正Ｂ+２での生起確率総和が１以下の最大漸近値に収束したか否かを判断する。補正Ｂ+２での生起確率総和が１以下の最大漸近値に収束していなければ、補正Ｂ+の３回目（補正Ｂ+３）に移行する。１以下の最大漸近値に収束した場合は、補正Ｂ+３に移行せず、この時点での圧縮符号長ごとの葉数で確定する。補正Ｂ+２で更新された生起確率総和「０．８９７」は１以下であるが、補正Ｂ+１で更新された生起確率総和「０．８６１」よりも大きい。すなわち、補正Ｂ+１での生起確率総和は最大漸近値ではなく、補正Ｂ+２での生起確率総和は最大漸近値に収束しているかが不明であるため、補正Ｂ+３に移行する。
【０１６２】
このようにして、葉数が確定するまで補正Ｂ+を継続することとなる。図２３の例では、補正Ｂ+１０で更新された生起確率総和「０．９８４」は、補正Ｂ+１１で更新された生起確率総和「０．９８４」と同じ値である。すなわち、補正Ｂ+１０での各圧縮符号長の葉数と補正Ｂ+１１での各圧縮符号長の葉数とは同じである。この場合、コンピュータは、補正Ｂ+１０において、生起確率総和が最大漸近値に収束したと判断し、葉数が確定する。
【０１６３】
このあと、コンピュータは、圧縮符号長ごとに、葉当たりの枝数を算出することとなる。葉当たりの枝数の算出は、上述したように、圧縮符号長の上限長Ｎ（この場合はＮ＝１２ビット）から降順に、２0、２1、２2、２3、２4、２5、２6として葉当たりの枝数を割り当てることとなる。なお、枝数の小計は、圧縮符号長ごとに、葉当たりの枝数に確定した葉数を乗じた乗算結果である。
【０１６４】
＜（６）葉へのポインタ生成の詳細（Ｎ＝１２）＞
図２４は、葉へのポインタ生成の詳細（Ｎ＝１２）を示す説明図である。図２４は、圧縮符号長の上限Ｎが１２ビットの場合の葉へのポインタを示している。図２４において、圧縮符号長が６ビットの葉数は２個であるため、圧縮符号「００００００」，「０００００１」が割り当てられる。また、圧縮符号長が６ビットの葉当たりの枝数は、６４本である。したがって、圧縮符号長が６ビットの圧縮符号についての葉へのポインタは、６４（＝２6）個生成される。具体的には、葉へのポインタの先頭６ビットが圧縮符号で後続６ビットが６４種のビット列となる。したがって、圧縮符号長が６ビットの圧縮符号の各々について、６４種の葉へのポインタが生成されることとなる。
【０１６５】
また、図示はしないが、圧縮符号長が７ビットの圧縮符号の各々について、３２種の葉へのポインタが生成されることとなる。同様に、圧縮符号長が８ビットの圧縮符号の各々について、１６種の葉へのポインタが生成されることとなる。同様に、圧縮符号長が９ビットの圧縮符号の各々について、８種の葉へのポインタが生成されることとなる。同様に、圧縮符号長が１０ビットの圧縮符号の各々について、４種の葉へのポインタが生成されることとなる。同様に、圧縮符号長が１１ビットの圧縮符号の各々について、２種の葉へのポインタが生成されることとなる。同様に、圧縮符号長が１２ビットの圧縮符号の各々について、１種の葉へのポインタが生成されることとなる。
【０１６６】
＜（７）２N分枝無節点ハフマン木の構築の詳細（Ｎ＝１２）＞
図２５は、（７）２N分枝無節点ハフマン木の構築の詳細（Ｎ＝１２）を示す説明図である。図２５では、Ｎ＝１２とした場合の４０９６（＝２12）分枝無節点ハフマン木を示している。根の構造体には、葉へのポインタが格納されている。葉へのポインタはポイント先の葉の構造体を指定することができる。
【０１６７】
具体的には、圧縮符号長が６ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、６４個生成される。したがって、葉Ｌ１の構造体については、根の構造体に６４個の葉Ｌ１へのポインタＬ１Ｐ（１）〜Ｌ１Ｐ（６４）が格納される。葉Ｌ２の構造体についても同様である。葉Ｌ３以降の構造体については、図２５のとおりである。
【０１６８】
＜（３）葉数特定〜（５）葉の構造体生成の詳細（Ｎ＝１３）＞
図２６は、図１３の（３）葉数特定〜（５）葉の構造体生成の詳細（Ｎ＝１３）を示す説明図である。なお、Ｎ＝１３の場合は、図１８の文字情報テーブルには、たとえば４０９６種の基礎単語のレコードも追加されることとなる。基礎単語は、１３０５種の文字コード、分割文字コード、予約語よりも、出現回数が低いこととする。したがって、１３０５種に４０９６種を追加した５４０１種の文字情報についての文字情報テーブルが生成されているものとする。また、基礎単語の追加により、図１８の総回数がかわるため、５４０１種の文字情報の生起確率も図１９に示した値とは異なることとなる。図２６に示した例では、補正Ａでの生起確率総和が「０．８７７」であるため、補正Ｂ+が行われることとなる。
【０１６９】
＜（６）葉へのポインタ生成の詳細（Ｎ＝１３）＞
図２７は、葉へのポインタ生成の詳細（Ｎ＝１３）を示す説明図である。図２７は、圧縮符号長の上限ＮがＮ＝１３ビットの場合の葉へのポインタを示している。図２７において、圧縮符号長が６ビットの葉数は２個であるため、圧縮符号「００００００」，「０００００１」が割り当てられる。また、圧縮符号長が６ビットの葉当たりの枝数は、１２８本である。したがって、圧縮符号長が６ビットの圧縮符号についての葉へのポインタは、１２８（＝２7）個生成される。具体的には、葉へのポインタの先頭６ビットが圧縮符号で後続７ビットが１２８種のビット列となる。したがって、圧縮符号長が６ビットの圧縮符号の各々について、１２８種の葉へのポインタが生成されることとなる。
【０１７０】
図示はしないが、圧縮符号長が７ビットの圧縮符号の各々について、６４種の葉へのポインタが生成されることとなる。同様に、圧縮符号長が８ビットの圧縮符号の各々について、３２種の葉へのポインタが生成されることとなる。同様に、圧縮符号長が９ビットの圧縮符号の各々について、１６種の葉へのポインタが生成されることとなる。同様に、圧縮符号長が１０ビットの圧縮符号の各々について、８種の葉へのポインタが生成されることとなる。同様に、圧縮符号長が１１ビットの圧縮符号の各々について、４種の葉へのポインタが生成されることとなる。同様に、圧縮符号長が１２ビットの圧縮符号の各々について、２種の葉へのポインタが生成されることとなる。同様に、圧縮符号長が１３ビットの圧縮符号の各々について、１種の葉へのポインタが生成されることとなる。
【０１７１】
＜（７）２N分枝無節点ハフマン木の構築の詳細（Ｎ＝１３）＞
図２８は、図１３の（７）２N分枝無節点ハフマン木の構築の詳細（Ｎ＝１３）を示す説明図である。図２８では、Ｎ＝１３とした場合の８１９２（＝２13）分枝無節点ハフマン木を示している。根の構造体には、葉へのポインタが格納されている。葉へのポインタはポイント先の葉の構造体を指定することができる。
【０１７２】
具体的には、圧縮符号長が６ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、１２８個生成される。したがって、葉Ｌ１の構造体については、根の構造体に１２８個の葉Ｌ１へのポインタＬ１Ｐ（１）〜Ｌ１Ｐ（１２８）が格納される。葉Ｌ２の構造体についても同様である。葉Ｌ３以降の構造体については、図２８のとおりである。
【０１７３】
＜葉の構造体＞
図２９は、葉の構造体を示す説明図である。葉の構造体は、第１領域〜第４領域を有するデータ構造体である。葉の構造体は、第１領域には、圧縮符号およびその圧縮符号長が格納される。第２領域には、葉の標識と伸長種別（図１８参照）が格納される。第３領域には、伸長種別に応じて高位文字である１６ビットの高位文字、低位文字の文字コードが分割された８ビットの分割文字コード、または特殊単語へのポインタが格納される。特殊単語へのポインタにより特殊単語の構造体１００内の特殊単語が指定される。また、照合フラグも格納されている。照合フラグはデフォルトでは「０」である。「０」の場合は、照合／置換テーブルＴを参照せず、「１」の場合は、照合／置換テーブルＴを参照する。
【０１７４】
第４領域には、符号種別と符号区分が格納される。符号種別とは、文字コードが数字、英字、特殊記号、カタカナ、ひらがな、漢字のいずれに該当するか、または特殊単語へのポインタであるかを識別する情報である。符号区分とは、文字コードが１６ビットであるか８ビットであるかを識別する情報である。１６ビットの文字コードである場合または特殊単語である場合、符号区分として“１”を割り当て、８ビットの分割文字コードの場合、符号区分として“０”を割り当てる。
【０１７５】
＜文字コードの構造体＞
図３０は、高位文字コードの構造体５００を示す説明図である。高位文字コードの構造体５００は、高位文字コードｅ♯とその葉Ｌ♯へのポインタを格納するデータ構造体である。具体的には、たとえば、コンピュータは、対象ファイル群Ｆｓからの集計結果が得られたときに、コンピュータが、高位文字コードの構造体５００に高位文字コードｅ♯を格納する。そして、コンピュータは、２N分枝無節点ハフマン木が構築されると、２N分枝無節点ハフマン木における各葉の構造体に格納された圧縮符号に対応する、高位文字コードの構造体５００における高位文字コードｅ♯へのポインタを格納する。また、高位文字コードｅ♯へのポインタが対応する葉の構造体に格納されると、コンピュータは、２N分枝無節点ハフマン木における各高位文字コードｅ♯に対応する葉へのポインタを、高位文字コードの構造体５００内の対応する高位文字コードｅ♯に関連付けて格納する。これにより、高位文字コードの構造体５００が生成される。
【０１７６】
図３１は、分割文字コードの構造体６００を示す説明図である。分割文字コードの構造体６００は、分割文字コードとその葉Ｌ♯へのポインタを格納する。具体的には、たとえば、コンピュータは、対象ファイル群Ｆｓからの集計結果が得られたときに、コンピュータが、分割文字コードの構造体６００に分割文字コードを格納する。そして、コンピュータは、２N分枝無節点ハフマン木が構築されると、２N分枝無節点ハフマン木における各葉の構造体に格納された圧縮符号に対応する、分割文字コードの構造体６００における分割文字コードへのポインタを格納する。また、分割文字コードへのポインタが対応する葉の構造体に格納されると、コンピュータは、２N分枝無節点ハフマン木における各分割文字コードに対応する葉へのポインタを、分割文字コードの構造体６００内の対応する分割文字コードに関連付けて格納する。これにより、分割文字コードの構造体６００が生成される。
【０１７７】
図３２および図３３は、特殊単語の構造体１００を示す説明図である。図３２では、特殊単語が予約語のみであり、図３３では、特殊単語は予約語および基礎単語である。特殊単語の構造体１００は、特殊単語とその葉Ｌ♯へのポインタを格納するデータ構造体である。具体的には、たとえば、コンピュータは、対象ファイル群Ｆｓからの集計結果が得られたときに、コンピュータが、特殊単語の構造体１００に特殊単語を格納する。そして、コンピュータは、２N分枝無節点ハフマン木が構築されると、２N分枝無節点ハフマン木における各葉の構造体に格納された圧縮符号に対応する、特殊単語の構造体１００における特殊単語へのポインタを格納する。また、特殊単語へのポインタが対応する葉の構造体に格納されると、コンピュータは、２N分枝無節点ハフマン木における各特殊単語に対応する葉へのポインタを、特殊単語の構造体１００内の対応する特殊単語に関連付けて格納する。これにより、特殊単語の構造体１００が生成される。
【０１７８】
＜コンピュータのハードウェア構成＞
図３４は、実施の形態にかかるコンピュータのハードウェア構成例を示すブロック図である。図３４において、コンピュータは、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）３４０１と、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）３４０２と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）３４０３と、磁気ディスクドライブ３４０４と、磁気ディスク３４０５と、光ディスクドライブ３４０６と、光ディスク３４０７と、ディスプレイ３４０８と、Ｉ／Ｆ（Ｉｎｔｅｒｆａｃｅ）３４０９と、キーボード３４１０と、マウス３４１１と、スキャナ３４１２と、プリンタ３４１３と、を備えている。また、各構成部はバス３４００によってそれぞれ接続されている。
【０１７９】
ここで、ＣＰＵ３４０１は、コンピュータの全体の制御を司る。ＲＯＭ３４０２は、ブートプログラムなどのプログラムを記憶している。ＲＡＭ３４０３は、ＣＰＵ３４０１のワークエリアとして使用される。磁気ディスクドライブ３４０４は、ＣＰＵ３４０１の制御にしたがって磁気ディスク３４０５に対するデータのリード／ライトを制御する。磁気ディスク３４０５は、磁気ディスクドライブ３４０４の制御で書き込まれたデータを記憶する。
【０１８０】
光ディスクドライブ３４０６は、ＣＰＵ３４０１の制御にしたがって光ディスク３４０７に対するデータのリード／ライトを制御する。光ディスク３４０７は、光ディスクドライブ３４０６の制御で書き込まれたデータを記憶したり、光ディスク３４０７に記憶されたデータをコンピュータに読み取らせたりする。
【０１８１】
ディスプレイ３４０８は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。このディスプレイ３４０８は、たとえば、ＣＲＴ、ＴＦＴ液晶ディスプレイ、プラズマディスプレイなどを採用することができる。
【０１８２】
インターフェース（以下、「Ｉ／Ｆ」と略する。）３４０９は、通信回線を通じてＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどのネットワーク３４１４に接続され、このネットワーク３４１４を介して他の装置に接続される。そして、Ｉ／Ｆ３４０９は、ネットワーク３４１４と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。Ｉ／Ｆ３４０９には、たとえばモデムやＬＡＮアダプタなどを採用することができる。
【０１８３】
キーボード３４１０は、文字、数字、各種指示などの入力のためのキーを備え、データの入力をおこなう。また、タッチパネル式の入力パッドやテンキーなどであってもよい。マウス３４１１は、カーソルの移動や範囲選択、あるいはウィンドウの移動やサイズの変更などをおこなう。ポインティングデバイスとして同様に機能を備えるものであれば、トラックボールやジョイスティックなどであってもよい。
【０１８４】
スキャナ３４１２は、画像を光学的に読み取り、コンピュータ内に画像データを取り込む。なお、スキャナ３４１２は、ＯＣＲ（Ｏｐｔｉｃａｌ  Ｃｈａｒａｃｔｅｒ  Ｒｅａｄｅｒ）機能を持たせてもよい。また、プリンタ３４１３は、画像データや文書データを印刷する。プリンタ３４１３には、たとえば、レーザプリンタやインクジェットプリンタを採用することができる。
【０１８５】
なお、本実施の形態にかかる生成プログラムや、上述した２N分枝無節点ハフマン木、高位文字コードの構造体５００、分割文字コードの構造体６００、特殊単語の構造体１００は、上述したＲＡＭ３４０３や磁気ディスク３４０５などの記憶装置に記憶される。
【０１８６】
＜コンピュータの機能的構成例＞
図３５は、コンピュータの機能的構成例を示すブロック図（その１）である。コンピュータは、集計部３５０１と、決定部３５０２と、補正部３５０３と、算出部３５０４と、判断部３５０５と、更新部３５０６と、生成部３５０７と、特定部３５０８と、構築部３５０９と、を備える。集計部３５０１〜構築部３５０９は、具体的には、たとえば、図３４に示したＲＯＭ３４０２、ＲＡＭ３４０３、磁気ディスク３４０５、光ディスク３４０７などの記憶装置に記憶されたプログラムをＣＰＵ３４０１に実行させることにより、その機能を実現する。
【０１８７】
集計部３５０１は、データを集計する機能を有する。具体的には、対象ファイル群Ｆｓを読み込んで、単一文字の出現回数を集計する。たとえば、図１３に示したように、集計部３５０１は、出現回数を降順にソートして、所定順位（たとえば、１０２４位）までを高位文字コードとする。所定順位よりも下位の単一文字は、上位８ビットと下位８ビットに分割して、それぞれ８ビットの分割文字コードとして再集計される。
【０１８８】
また、集計部３５０１は、最長一致検索処理をおこなうことにより、特殊単語を特定し、特殊単語についても出現回数を集計する。そして、集計部３５０１は、高位文字コード、分割文字コード、特殊単語を混在させて出現回数を再ソートする。これにより、図１８に示した順位項目、伸長種別項目、コード項目、文字項目、出現回数項目が得られる。
【０１８９】
また、集計部３５０１は、文字情報ごとの出現回数が得られた場合、全文字情報の出現回数の総和を総回数として算出する。そして、集計部３５０１は、文字情報ごとに、出現回数を総回数で割ることで、出現率を算出する。集計部３５０１は、算出された出現率に応じた生起確率を、図１３の「（２）圧縮符号長算出」の項で説明したように特定し、そのべき数を圧縮符号長とする。これにより、文字情報ごとに圧縮符号長が特定されたこととなる（図１８を参照）。そして、集計部３５０１は、図１８の文字情報テーブルを参照して、圧縮符号長ごとに文字情報の種類数（図１８に示した補正前の葉数）を集計する。
【０１９０】
決定部３５０２は、対象ファイルに出現する文字情報の総種類数に基づいて、最小圧縮符号長から最大圧縮符号長までの圧縮符号長群の中から、文字情報に割り当てられる圧縮符号長の上限長Ｎを決定する機能を有する。具体的には、たとえば、決定部３５０２は、文字情報の総種類数が２K-1個より大きく２K個以下である場合は、上限長ＮをＫビットに決定する。たとえば、文字情報の総種類数が２10個より大きく２11個以下である場合は、決定部３５０２は、上限長Ｎを１１ビットに決定することとなる。
【０１９１】
また、文字情報の総種類数が２11個より大きく２12個以下である場合は、決定部３５０２は、上限長Ｎを１２ビットに決定することとなる。また、文字情報の総種類数が２12個より大きく２13個以下である場合は、決定部３５０２は、上限長Ｎを１３ビットに決定することとなる。ここで、文字コードの種別ごとの文字情報の分類について説明する。
【０１９２】
図３６は、ＵＴＦ１６での文字情報の分類例を示す説明図である。特殊単語には、２５種の予約語と最大４０９６種の基礎単語が含まれている。基礎単語を入れない場合は、予約語のみの２５種となる。ＵＴＦ１６において、基礎単語を含めない場合の文字情報の最大総数は、１３０５個である。したがって、２10＜１３０５≦２11となるため、上限長ＮはＮ＝１１ビットに決定される。また、基礎単語を２０４８個含める場合の文字情報の最大総数は、３３５３個である。したがって、２11＜３３５３≦２12となるため、上限長ＮはＮ＝１２ビットに決定される。また、基礎単語を４０９６個含める場合の文字情報の最大総数は、５４０１個である。したがって、２12＜５４０１≦２13となるため、上限長ＮはＮ＝１３ビットに決定される。
【０１９３】
図３７は、ＡＳＣＩＩコードでの文字情報の分類例を示す説明図である。特殊単語には、２５種の予約語と最大２０４８種の基礎単語が含まれている。基礎単語を１０２４個含める場合の文字情報の最大総数は、１３０５個である。したがって、２10＜１３０５≦２11となるため、上限長ＮはＮ＝１１ビットに決定される。基礎単語を２０４８個含める場合の文字情報の最大総数は、３３５３個である。したがって、２11＜３３５３≦２12となるため、上限長ＮはＮ＝１２ビットに決定される。
【０１９４】
図３８は、シフトＪＩＳコードでの文字情報の分類例を示す説明図である。特殊単語には、２５種の予約語と最大４０９６種の基礎単語が含まれている。また、シフトＪＩＳコードの場合、日本語の文字は２つの８ビットコードの組み合わせで表現されるため、偶数個の単語（文字列）とみなされる。基礎単語を２０４８個含める場合の文字情報の最大総数は、３３５３個である。したがって、２11＜３３５３≦２12となるため、上限長ＮはＮ＝１２ビットに決定される。また、基礎単語を４０９６個含める場合の文字情報の最大総数は、５４０１個である。したがって、２12＜５４０１≦２13となるため、上限長ＮはＮ＝１３ビットに決定される。
【０１９５】
また、図３５において、補正部３５０３は、集計部３５０１によって集計された圧縮符号長ごとの文字情報の種類数のうち、決定部３５０２によって決定された上限長Ｎを圧縮符号長とする文字情報の種類数を、上限長Ｎ以上の圧縮符号長での文字情報の種類数の総和に補正する機能を有する。具体的には、たとえば、補正部３５０３は、上述した補正Ａによる補正処理を実行する。
【０１９６】
算出部３５０４は、補正部３５０３による補正後の上限長Ｎまでの各圧縮符号長を規定する各生起確率の総和を算出する機能を有する。具体的には、たとえば、図１９、図２３、図２６に示した生起確率総和を算出する。
【０１９７】
判断部３５０５は、算出部３５０４によって算出された生起確率総和がしきい値ｔ以上１以下であるか否かを判断する機能を有する。しきい値ｔは、０＜ｔ≦１の値であり、あらかじめ設定される。しきい値ｔを１としてもよい。しきい値ｔ以上１以下である場合は、補正部３５０３による補正後の圧縮符号長ごとの文字情報の種類数を、圧縮符号長ごとの葉数として確定させてもよい。
【０１９８】
一方、しきい値ｔ未満である場合、まだ、生起確率総和を増加させることが可能であるため、上述した補正Ｂ+を実行することが可能となる。また、生起確率総和が１よりも大きくなった場合は、上述した補正Ｂ-を実行することが可能となる。
【０１９９】
更新部３５０６は、判断部３５０５によってしきい値ｔ以上１以下でないと判断された場合、上限長Ｎまでの各圧縮符号長の文字情報の種類数を、生起確率総和で割ることにより、上限長Ｎまでの各圧縮符号長の文字情報の種類数を更新する機能を有する。具体的には、たとえば、更新部３５０６は、しきい値ｔ未満と判断された場合は補正Ｂ+を開始し、１より大きいと判断された場合は補正Ｂ-を開始する。
【０２００】
この場合、算出部３５０４は、更新後における上限長Ｎまでの各圧縮符号長の文字情報の種類数に基づいて、生起確率総和を再算出する。そして、判断部３５０５は、算出部３５０４によって再算出された生起確率総和については、１以下の最大値が得られたか、具体的には、たとえば、１以下の最大漸近値に収束したか否かを判断することとなる。
【０２０１】
生成部３５０７は、文字情報に圧縮符号を割り当てた葉の構造体を生成する機能を有する。具体的には、たとえば、生成部３５０７による生成の条件は、判断部３５０５によって補正Ａによりしきい値ｔ以上１以下であると判断された場合、または、補正Ｂにより１以下の最大値が得られたと判断された場合である。そして、当該条件を満たした場合、生成部３５０７は、具体的には、たとえば、上限長Ｎまでの圧縮符号長と、上限長Ｎまでの圧縮符号長ごとの文字情報の種類数と、文字情報の出現率と、に基づいて、文字情報ごとに圧縮符号を割り付ける。そして、生成部３５０７は、割り付けた圧縮符号、その圧縮符号長、文字情報を含む葉の構造体を生成する。
【０２０２】
より具体的には、まず、出現率により順位付けされた文字情報群のうち第１位から昇順に文字情報を選択する。そして、生成部３５０７は、その選択文字情報の圧縮符号長を特定して、その圧縮符号長となる固有の圧縮符号を割り当てる。
【０２０３】
たとえば、出現回数第１位の文字情報は、高位文字の「０」である。Ｎ＝１２の場合、圧縮符号長は６ビットであるため、固有の圧縮符号「００００００」が割り当てられることとなる。次に、出現回数第２位の文字情報は、高位文字の「＞」である。Ｎ＝１２の場合、圧縮符号長は６ビットであるため、固有の圧縮符号「０００００１」が割り当てられることとなる。
【０２０４】
このようにして、出現回数の順位の昇順で圧縮符号を割り当てる。圧縮符号が決まると、生成部３５０７は、文字情報ごとに、その文字情報や圧縮符号長、伸長種別などをまとめて葉の構造体を生成することとなる。
【０２０５】
特定部３５０８は、上限長Ｎまでの圧縮符号長に基づいて、生成部３５０７によって生成された葉の構造体１つ当たりの枝数を、上限長Ｎまでの圧縮符号長ごとに特定する機能を有する。具体的には、たとえば、特定部３５０８は、図１９、図２３、図２６に示したように、葉当たりの枝数を、圧縮符号長ごとに特定する。
【０２０６】
構築部３５０９は、２N分枝無節点ハフマン木を構築する機能を有する。具体的には、たとえば、構築部３５０９は、葉の構造体内の圧縮符号に特定部３５０８によって特定された枝数分の枝番号をあらわす各ビット列を連結した葉へのポインタ群を、葉の構造体ごとに生成する。たとえば、Ｎ＝１１の場合は、図２１に示したように、葉へのポインタ群を葉の構造体ごとに生成する。また、Ｎ＝１２の場合は、図２４に示したように、葉へのポインタ群を葉の構造体ごとに生成する。また、Ｎ＝１３の場合は、図２７に示したように、葉へのポインタ群を葉の構造体ごとに生成する。
【０２０７】
また、構築部３５０９は、各葉の構造体についての葉へのポインタ群を根とする２N分枝無節点ハフマン木を構築する。具体的には、たとえば、Ｎ＝１１の場合は、図２２に示したように、２11分枝無節点ハフマン木を構築する。Ｎ＝１２の場合は、図２５に示したように、２12分枝無節点ハフマン木を構築する。Ｎ＝１３の場合は、図２８に示したように、２13分枝無節点ハフマン木を構築する。
【０２０８】
＜２N分枝無節点ハフマン木の生成処理手順＞
図３９は、２N分枝無節点ハフマン木の生成処理手順（前半）を示すフローチャートである。まず、図３９において、コンピュータは、集計部３５０１により、第１集計処理（ステップＳ３９０１）と第２集計処理（ステップＳ３９０２）を実行する。第１集計処理（ステップＳ３９０１）では、各文字情報の出現回数を集計する。第２集計処理（ステップＳ３９０２）では、圧縮符号長ごとの文字情報の種類数を集計する。第１集計処理（ステップＳ３９０１）と第２集計処理（ステップＳ３９０２）の詳細については後述する。
【０２０９】
つぎに、コンピュータは、決定部３５０２により、圧縮符号長の上限長Ｎを決定する（ステップＳ３９０３）。このＮが後述する補正Ａでの最大圧縮符号長となる。そして、コンピュータは、全文字情報の圧縮符号長がＮビット以内であるか否かを判断する（ステップＳ３９０４）。
【０２１０】
Ｎビット以内でない場合（ステップＳ３９０４：Ｎｏ）、コンピュータは、補正部３５０３により、補正Ａ処理を実行する（ステップＳ３９０５）。具体的には、コンピュータは、上限長Ｎが最大圧縮符号長となるように、Ｎビット以上の各圧縮符号長での文字情報の種類数（葉数）の総和を求め、この総和を、圧縮符号長Ｎビットでの文字情報の種類数に補正する。したがって、（Ｎ＋１）ビット以上の圧縮符号長での文字情報の種類数は０となり、最大圧縮符号長がＮビットとなる。このあと、ステップＳ３９０６に移行する。
【０２１１】
一方、Ｎビット以内である場合（ステップＳ３９０４：Ｙｅｓ）、コンピュータは、補正Ａ処理（ステップＳ３９０５）を実行せずに、ステップＳ３９０６に移行する。ステップＳ３９０６では、コンピュータは、算出部３５０４により、圧縮符号長ごとの生起確率を算出し（ステップＳ３９０６）、算出された圧縮符号長ごとの生起確率の総和（生起確率総和ＴＯＰ）を算出する（ステップＳ３９０７）。そして、図４０のステップＳ４００１に移行する。
【０２１２】
図４０は、２N分枝無節点ハフマン木の生成処理手順（後半）を示すフローチャートである。コンピュータは、判断部３５０５により、算出された生起確率総和ＴＯＰが、ｔ≦ＴＯＰ≦１であるか否かを判断する（ステップＳ４００１）。ｔは上述したしきい値である。ｔ≦ＴＯＰ≦１でない場合（ステップＳ４００１：Ｎｏ）、コンピュータは、判断部３５０５により、ｔ＞ＴＯＰであるか否かを判断する（ステップＳ４００２）。ｔ＞ＴＯＰである場合（ステップＳ４００２：Ｙｅｓ）、コンピュータは、更新部３５０６により、補正Ｂ+処理を実行する（ステップＳ４００３）。補正Ｂ+処理（ステップＳ４００３）の詳細については後述する。補正Ｂ+処理のあとは、ステップＳ４００５に移行する。
【０２１３】
一方、ステップＳ４００２において、ｔ＞ＴＯＰでない場合（ステップＳ４００２：Ｎｏ）、コンピュータは、更新部３５０６により、補正Ｂ-処理を実行する（ステップＳ４００４）。補正Ｂ-処理（ステップＳ４００４）の詳細については後述する。補正Ｂ-処理のあとは、ステップＳ４００５に移行する。また、ステップＳ４００１において、ｔ≦ＴＯＰ≦１である場合（ステップＳ４００１：Ｙｅｓ）、ステップＳ４００５に移行する。
【０２１４】
また、ステップＳ４００５において、コンピュータは、生成部３５０７により、文字情報ごとに葉の構造体を生成する（ステップＳ４００５）。そして、コンピュータは、特定部３５０８により、枝数特定処理を実行する（ステップＳ４００６）。枝数特定処理（ステップＳ４００６）では、圧縮符号長ごとの葉当たりの枝数を特定する。枝数特定処理（ステップＳ４００６）の詳細については後述する。
【０２１５】
そして、コンピュータは、構築部３５０９により、構築処理を実行する（ステップＳ４００７）。枝数特定処理（ステップＳ４００６）により葉の構造体ごとの枝数が特定されるため、まず、構築部３５０９は、葉の構造体ごとに、枝数分の葉へのポインタ群を生成する。そして、生成された各葉の構造体についての葉へのポインタ群を集約して根の構造体とする。これにより、２N分枝無節点ハフマン木が生成されることとなる。なお、生成された２N分枝無節点ハフマン木は、コンピュータ内の記憶装置（ＲＡＭ３４０３や磁気ディスク３４０５など）に格納される。
【０２１６】
＜第１集計処理（ステップＳ３９０１）＞
図４１は、図３９に示した第１集計処理（ステップＳ３９０１）の詳細な処理手順を示すフローチャートである。まず、コンピュータは、ファイル番号ｉをｉ＝１に設定し（ステップＳ４１０１）、対象ファイルＦｉを読み込む（ステップＳ４１０２）。そして、コンピュータは、対象ファイルＦｉの集計処理を実行する（ステップＳ４１０３）。このあと、コンピュータは、ファイル番号ｉがｉ＞ｎ（ｎは対象ファイルＦ１〜Ｆｎの総数）であるか否かを判断する（ステップＳ４１０４）。
【０２１７】
ｉ＞ｎでない場合（ステップＳ４１０４：Ｎｏ）、コンピュータは、ｉをインクリメントし（ステップＳ４１０５）、ステップＳ４１０２に戻る。一方、ｉ＞ｎである場合（ステップＳ４１０４：Ｙｅｓ）、コンピュータは、第２集計処理（ステップＳ３９０２）に移行して、第１集計処理（ステップＳ３９０１）を終了する。この第１集計処理（ステップＳ３９０１）によれば、対象ファイルＦｉごとに対象ファイルＦｉの集計処理（ステップＳ４１０３）を実行することができる。
【０２１８】
＜対象ファイルＦｉの集計処理（ステップＳ４１０３）＞
図４２は、図４１に示した対象ファイルＦｉの集計処理（ステップＳ４１０３）の詳細な処理手順を示すフローチャートである。まず、コンピュータは、対象文字を対象ファイルＦｉの先頭文字とし（ステップＳ４２０１）、特殊単語集計処理を実行する（ステップＳ４２０２）。特殊単語集計処理（ステップＳ４２０２）では、対象文字を先頭文字とする特殊単語の出現回数を集計する。特殊単語集計処理（ステップＳ４２０２）の詳細については、図４３で説明する。このあと、コンピュータは、対象文字の出現回数を１増加する（ステップＳ４２０３）。
【０２１９】
つぎに、コンピュータは、対象文字の出現マップ生成処理を実行する（ステップＳ４２０４）。対象文字の出現マップ生成処理（ステップＳ４２０４）では、対象ファイルＦｉでの対象文字の存否を示す出現マップを生成する。対象文字の出現マップ生成処理（ステップＳ４２０４）の詳細については、図４６で説明する。そして、コンピュータは、対象文字が対象ファイルＦｉの末尾文字であるか否かを判断する（ステップＳ４２０５）。
【０２２０】
対象文字が対象ファイルＦｉの末尾文字でない場合（ステップＳ４２０５：Ｎｏ）、コンピュータは、対象文字を末尾方向へ１文字シフトし（ステップＳ４２０６）、ステップＳ４２０２に戻る。一方、対象文字が対象ファイルＦｉの末尾文字である場合（ステップＳ４２０５：Ｙｅｓ）、コンピュータは、ステップＳ４１０４に移行して、対象ファイルＦｉの集計処理（ステップＳ４１０３）を終了する。この対象ファイルＦｉの集計処理（ステップＳ４１０３）によれば、対象ファイル群Ｆｓに存在する特殊単語および単一文字の出現頻度を集計することができる。
【０２２１】
＜特殊単語集計処理（ステップＳ４２０２）＞
図４３は、図４２に示した特殊単語集計処理（ステップＳ４２０２）の詳細な処理手順を示すフローチャートである。まず、コンピュータは、最長一致検索処理を実行し（ステップＳ４３０１）、最長一致した特殊単語があったか否かを判断する（ステップＳ４３０２）。最長一致した特殊単語があった場合（ステップＳ４３０２：Ｙｅｓ）、コンピュータは、特殊単語出現頻度テーブルにおいて最長一致した特殊単語の出現回数を１増加し（ステップＳ４３０３）、コンピュータは、特殊単語の出現マップ生成処理を実行する（ステップＳ４３０４）。特殊単語の出現マップ生成処理（ステップＳ４３０４）では、対象ファイルＦｉでの対象文字を先頭文字とする特殊単語の存否を示す出現マップを生成する。特殊単語の出現マップ生成処理（ステップＳ４３０４）の詳細については、図４５で説明する。このあと、ステップＳ４２０３に移行する。
【０２２２】
一方、最長一致した特殊単語がなかった場合（ステップＳ４３０２：Ｎｏ）、ステップＳ４２０３に移行する。これにより、特殊単語集計処理（ステップＳ４２０２）を終了する。この特殊単語集計処理（ステップＳ４２０２）によれば、最長一致検索処理（ステップＳ４３０１）により特殊単語を計数することができるため、文字列が長い特殊単語を優先的に計数することができる。
【０２２３】
＜最長一致検索処理（ステップＳ４３０１）＞
図４４は、図４３に示した最長一致検索処理（ステップＳ４３０１）の詳細な処理手順を示すフローチャートである。まず、コンピュータは、ｃ＝１とする（ステップＳ４４０１）。ｃは対象文字からの文字数（対象文字含む）である。ｃ＝１の場合は、対象文字だけである。つぎに、コンピュータは、対象文字からｃ文字目までの対象文字列と前方一致する特殊単語を２分探索する（ステップＳ４４０２）。そして、コンピュータは、検索により特殊単語があるか否かを判断する（ステップＳ４４０３）。２分探索により特殊単語がヒットしなかった場合（ステップＳ４４０３：Ｎｏ）、ステップＳ４４０６に移行する。
【０２２４】
一方、２分探索により特殊単語がヒットした場合（ステップＳ４４０３：Ｙｅｓ）、コンピュータは、ヒットした特殊単語と対象文字列とが完全一致するか否かを判断する（ステップＳ４４０４）。そして、完全一致しない場合（ステップＳ４４０４：Ｎｏ）、ステップＳ４４０６に移行する。一方、完全一致する場合（ステップＳ４４０４：Ｙｅｓ）、コンピュータは、最長一致候補として記憶装置に保持し（ステップＳ４４０５）、ステップＳ４４０６に移行する。
【０２２５】
ステップＳ４４０６では、コンピュータは、対象文字列について２分探索が終了したか否かを判断する（ステップＳ４４０６）。具体的には、コンピュータは、末尾の特殊単語まで２分探索したか否かを判断する。２分探索が終了していない場合（ステップＳ４４０６：Ｎｏ）、コンピュータは、ステップＳ４４０２に移行して、２分探索が終了するまで継続する。
【０２２６】
一方、対象文字列について２分探索が終了した場合（ステップＳ４４０６：Ｙｅｓ）、コンピュータは、ｃ文字目の文字が対象ファイルＦｉの末尾文字であるか否かを判断する（ステップＳ４４０７）。ｃ文字目の文字が対象ファイルＦｉの末尾文字である場合（ステップＳ４４０７：Ｙｅｓ）、ステップＳ４４１０に移行する。一方、ｃ文字目の文字が対象ファイルＦｉの末尾文字でない場合（ステップＳ４４０７：Ｎｏ）、コンピュータは、ｃ＞ｃｍａｘであるか否かを判断する（ステップＳ４４０８）。ｃｍａｘは予め設定された値であり、これにより対象文字列の上限文字数が設定される。
【０２２７】
ｃ＞ｃｍａｘでない場合（ステップＳ４４０８：Ｎｏ）、コンピュータは、ｃをインクリメントして（ステップＳ４４０９）、ステップＳ４４０２に戻る。一方、ｃ＞ｃｍａｘである場合（ステップＳ４４０８：Ｙｅｓ）、コンピュータは、最長一致候補があるか否かを判断する（ステップＳ４４１０）。具体的には、コンピュータは、ステップＳ４４０５において１つでも最長一致候補がメモリに保持されているか否かを判断する。
【０２２８】
最長一致候補がある場合（ステップＳ４４１０：Ｙｅｓ）、コンピュータは、最長一致候補のうち最長文字列を、最長一致した特殊単語に決定する（ステップＳ４４１１）。そして、ステップＳ４３０２に移行する。一方、ステップＳ４４１０において、最長一致候補が１つもない場合（ステップＳ４４１０：Ｎｏ）、ステップＳ４３０２に移行する。これにより、最長一致検索処理（ステップＳ４３０１）を終了する。この最長一致検索処理（ステップＳ４３０１）によれば、特殊単語構造体にある特殊単語の中から、完全一致した文字列の中でかつ最長の文字列を特殊単語として検索することができる。
【０２２９】
図４５は、図４３に示した特殊単語の出現マップ生成処理（ステップＳ４３０４）の詳細な処理手順を示すフローチャートである。まず、コンピュータは、最長一致した特殊単語について、特殊単語の出現マップがあるか否かを判断する（ステップＳ４５０１）。すなわち、コンピュータは、すでに特殊単語の出現マップが生成済みであるか否かを判断する。最長一致した特殊単語について、特殊単語の出現マップがない場合（ステップＳ４５０１：Ｎｏ）、コンピュータは、当該特殊単語の出現マップを設定する（ステップＳ４５０２）。具体的には、コンピュータは、特殊単語の出現マップ群の割り当て領域内でのオール０の空きビット列を、当該特殊単語の出現マップとして割り当てる。
【０２３０】
そして、コンピュータは、ステップＳ４５０２で設定された特殊単語の出現マップのうち、対象ファイルＦｉのビットをＯＮにする（ステップＳ４５０３）。そして、ステップＳ４２０３に移行する。一方、ステップＳ４５０１において、最長一致した特殊単語の出現マップがある場合（ステップＳ４５０１：Ｙｅｓ）、コンピュータは、その特殊単語の出現マップのうち、対象ファイルＦｉのビットがＯＮであるか否かを判断する（ステップＳ４５０４）。そして、ＯＦＦの場合（ステップＳ４５０４：Ｎｏ）、ステップＳ４５０３に移行し、ＯＮの場合（ステップＳ４５０４：Ｙｅｓ）、ステップＳ４２０３に移行することで、特殊単語の出現マップ生成処理（ステップＳ４３０４）を終了する。これにより、特殊単語の出現マップが生成されることとなる。
【０２３１】
図４６は、図４２に示した対象文字の出現マップ生成処理（ステップＳ４２０４）の詳細な処理手順を示すフローチャートである。まず、コンピュータは、高位文字コードの構造体５００において、対象文字を２分探索する（ステップＳ４６０１）。そして、ヒットした場合（ステップＳ４６０２：Ｙｅｓ）、コンピュータは、対象文字の出現マップがあるか否かを判断する（ステップＳ４６０３）。すなわち、コンピュータは、すでに生成済みであるか否かを判断する。対象文字の出現マップがない場合（ステップＳ４６０３：Ｎｏ）、コンピュータは、対象文字の出現マップを設定する（ステップＳ４６０４）。具体的には、コンピュータは、対象文字の出現マップ群の割り当て領域内でのオール０の空きビット列を、当該対象文字の出現マップとして割り当てる。
【０２３２】
そして、コンピュータは、ステップＳ４６０４で設定された対象文字の出現マップのうち、対象ファイルＦｉのビットをＯＮにする（ステップＳ４６０５）。そして、ステップＳ４６０２に移行する。一方、ステップＳ４６０３において、対象文字の出現マップがある場合（ステップＳ４６０３：Ｙｅｓ）、コンピュータは、その対象文字の出現マップのうち、対象ファイルＦｉのビットがＯＮであるか否かを判断する（ステップＳ４６０６）。そして、ＯＦＦの場合（ステップＳ４６０６：Ｎｏ）、ステップＳ４６０５に移行し、ＯＮの場合（ステップＳ４６０６：Ｙｅｓ）、ステップＳ４６０２に移行する。
【０２３３】
また、ステップＳ４６０２において、ヒットしなかった場合（ステップＳ４６０２：Ｎｏ）、コンピュータは、対象文字についての２分探索が終了したか否かを判断する（ステップＳ４６０７）。２分探索が終了していない場合（ステップＳ４６０７：Ｎｏ）、ステップＳ４６０２に戻る。一方、２分探索が終了した場合（ステップＳ４６０７：Ｙｅｓ）、ステップＳ４２０５に移行することで、対象文字の出現マップ生成処理（ステップＳ４２０４）を終了する。これにより、対象文字の出現マップが生成されることとなる。
【０２３４】
＜第２集計処理（ステップＳ３９０２）＞
図４７は、図３９に示した第２集計処理（ステップＳ３９０２）の詳細な処理手順を示すフローチャートである。まず、コンピュータは、文字情報ごとに出現率を算出する（ステップＳ４７０１）。つぎに、コンピュータは、未選択文字情報があるか否かを判断する（ステップＳ４７０２）。未選択文字情報がある場合（ステップＳ４７０２：Ｙｅｓ）、コンピュータは、出現率が最上位の未選択文字情報を選択する（ステップＳ４７０３）。そして、コンピュータは、選択文字情報の出現率に応じて生起確率および圧縮符号長を特定し（ステップＳ４７０４）、ステップＳ４７０２に戻る。
【０２３５】
そして、ステップＳ４７０２において、未選択文字情報がない場合（ステップＳ４７０２：Ｎｏ）、コンピュータは、圧縮符号長ごとに文字情報の種類数を計数する（ステップＳ４７０５）。これにより、圧縮符号長ごとの葉数（文字情報の種類数）が特定されることとなる。
【０２３６】
＜補正Ｂ+処理（ステップＳ４００３）＞
図４８は、図４０に示した補正Ｂ+処理（ステップＳ４００３）の詳細な処理手順を示すフローチャートである。まず、コンピュータは、更新処理を実行する（ステップＳ４８０１）。更新処理（ステップＳ４８０１）の詳細については後述する。つぎに、コンピュータは、更新処理（ステップＳ４８０１）後において、更新前後で葉数の変動があるか否かを判断する（ステップＳ４８０２）。変動がある場合（ステップＳ４８０２：Ｙｅｓ）、まだ、生起確率総和ＴＯＰが１以下の最大漸近値に収束していないため、更新処理（ステップＳ４８０１）に戻る。
【０２３７】
一方、変動がない場合（ステップＳ４８０２：Ｎｏ）、これ以上更新処理（ステップＳ４８０１）をしても葉数が変動しない。すなわち、前回の補正Ｂ+で最大漸近値に収束したこととなり、コンピュータは、今回の更新処理（ステップＳ４８０１）での圧縮符号長ごとの葉数で確定させ（ステップＳ４８０３）、ステップＳ４００５に移行する。これにより、生起確率総和ＴＯＰを増加させて、１に漸近させることができ、圧縮効率の向上を図ることができる。
【０２３８】
＜補正Ｂ-処理（ステップＳ４００４）＞
図４９は、図４０に示した補正Ｂ-処理（ステップＳ４００４）の詳細な処理手順を示すフローチャートである。補正Ｂ-処理（ステップＳ４００４）は、図４８に示した補正Ｂ+処理（ステップＳ４００３）と同一内容であるため、同一処理には同一ステップ番号を付す。補正Ｂ-処理（ステップＳ４００４）は、補正Ｂ+処理（ステップＳ４００３）と同一内容であるが、扱う生起確率総和ＴＯＰは１より大きい値であり、更新処理（ステップＳ４８０１）を繰り返すことで、ある時点の補正Ｂ-で生起確率総和ＴＯＰが１を下回ることとなる。
【０２３９】
生起確率総和ＴＯＰが１未満となると、補正Ｂ+の場合と同様、１以下の最大漸近値に収束するまで、更新処理（ステップＳ４８０１）を繰り返すこととなる。これにより、１より大きい生起確率総和ＴＯＰを減少させて、１に漸近させることができ、圧縮効率の向上を図ることができる。
【０２４０】
＜更新処理（ステップＳ４８０１）＞
図５０は、図４８および図４９に示した更新処理（ステップＳ４８０１）の詳細な処理手順を示すフローチャートである。まず、コンピュータは、未選択の圧縮符号長があるか否かを判断する（ステップＳ５００１）。未選択の圧縮符号長がある場合（ステップＳ５００１：Ｙｅｓ）、コンピュータは、未選択の中で最短の圧縮符号長を１つ選択する（ステップＳ５００２）。コンピュータは、選択圧縮符号長が上限長Ｎ（補正Ａでの最長圧縮符号長）であるか否かを判断する（ステップＳ５００３）。
【０２４１】
選択圧縮符号長が上限長Ｎでない場合（ステップＳ５００３：Ｎｏ）、コンピュータは、選択圧縮符号長の葉数（文字情報の種類数）を、生起確率総和ＴＯＰで割る（ステップＳ５００４）。生成部３５０７は、選択圧縮符号長の葉数をこの割り算結果の値に更新する（ステップＳ５００５）。割り算結果の値については、小数点以下は切り捨て、四捨五入、切り上げのいずれでもよい。そして、ステップＳ５００１に戻る。
【０２４２】
また、ステップＳ５００３において、選択圧縮符号長が上限長Ｎである場合（ステップＳ５００３：Ｙｅｓ）、コンピュータは、葉数の総和から、ステップＳ５００５で更新済みの葉数の総和を引くことにより、選択圧縮符号長（この場合は、上限長Ｎ）の葉数を引き算結果の値に更新する（ステップＳ５００６）。そして、ステップＳ５００１に戻る。
【０２４３】
ステップＳ５００１において、未選択の圧縮符号長（上限長Ｎ以下の圧縮符号長）がない場合（ステップＳ５００１：Ｎｏ）、コンピュータは、葉数の更新後における生起確率総和ＴＯＰを算出し（ステップＳ５００７）、図４８および図４９のステップＳ４８０２に移行する。
【０２４４】
＜枝数特定処理（ステップＳ４００６）＞
図５１は、図４０に示した枝数特定処理（ステップＳ４００６）の詳細な処理手順を示すフローチャートである。まず、コンピュータは、特定部３５０８により、最大圧縮符号長ＣＬｍａｘ（＝Ｎ）と最小圧縮符号長ＣＬｍｉｎ（＝Ｍ）との差分Ｄ（＝Ｎ−Ｍ）を算出する（ステップＳ５１０１）。たとえば、Ｎ＝１１の場合、図１９を参照すると、Ｍ＝６である。したがって、Ｄ＝５である。
【０２４５】
つぎに、コンピュータは、２のべき数の変数ｊをｊ＝０とし、圧縮符号長の変数ＣＬをＣＬ＝Ｎとする（ステップＳ５１０２）。そして、コンピュータは、ｊ＞Ｄであるか否かを判断する（ステップＳ５１０３）。ｊ＞Ｄでない場合（ステップＳ５１０３：Ｎｏ）、コンピュータは、圧縮符号長ＣＬの葉当たりの枝数ｂ（ＣＬ）を算出する（ステップＳ５１０４）。圧縮符号長ＣＬの葉当たりの枝数ｂ（ＣＬ）は、ｂ（ＣＬ）＝２jで算出される。たとえば、ｊ＝０のとき、圧縮符号長ＣＬ＝Ｎ＝１１であるため、圧縮符号長１１ビットでの葉当たりの枝数ｂ（１１）は、ｂ（１１）＝２j＝２0＝１となる。
【０２４６】
つぎに、コンピュータは、圧縮符号長ＣＬの総枝数Ｂ（Ｌ）を算出する（ステップＳ５１０５）。圧縮符号長ＣＬの総枝数Ｂ（Ｌ）は、Ｂ（Ｌ）＝Ｌ（ＣＬ）×ｂ（ＣＬ）で算出される。Ｌ（ＣＬ）は、圧縮符号長ＣＬでの葉数（文字情報の種類数）である。たとえば、ｊ＝０のとき、圧縮符号長ＣＬ＝Ｎ＝１１であるため、圧縮符号長１１ビットでの総枝数Ｂ（Ｌ）は、１２１６×２0＝１２１６となる。
【０２４７】
このあと、コンピュータは、ｊをインクリメントし、圧縮符号長ＣＬをデクリメントして（ステップＳ５１０６）、ステップＳ５１０３に戻り、インクリメント後のｊがｊ＞Ｄであるか否かが判断される。なお、Ｎ＝１１の場合は、ｊ＝Ｄになるとｊ＝Ｄ＝５となり、ＣＬ＝Ｍ＝６となる。したがって、ステップＳ５１０４では、圧縮符号長ＣＬ（５ビット）当たりの枝数ｂ（６）は、ｂ（６）＝２6＝６４となる。同様に、総枝数Ｂ（Ｌ）は、Ｂ（６）＝０×２6＝０となる。そして、ｊ＞Ｄである場合（ステップＳ５１０３：Ｙｅｓ）、構築処理（ステップＳ４００７）に移行する。
【０２４８】
＜構築処理（ステップＳ４００７）＞
図５２は、図４０に示した構築処理（ステップＳ４００７）の詳細な処理手順を示すフローチャートである。まず、コンピュータは、圧縮符号長ＣＬをＣＬ＝ＣＬｍｉｎ＝Ｍとする（ステップＳ５２０１）。つぎに、コンピュータは、圧縮符号長ＣＬでの未選択の葉があるか否かを判断する（ステップＳ５２０２）。未選択の葉がある場合（ステップＳ５２０２：Ｙｅｓ）、コンピュータは、葉へのポインタ生成処理（ステップＳ５２０３）を実行して、ステップＳ５２０２に戻る。葉へのポインタ生成処理（ステップＳ５２０３）では、葉の構造体ごとに、圧縮符号長ＣＬに応じた枝数分の葉へのポインタ群を生成する。なお、葉へのポインタ生成処理（ステップＳ５２０３）の詳細については後述する。
【０２４９】
一方、ステップＳ５２０２において、未選択の葉がない場合（ステップＳ５２０２：Ｎｏ）、コンピュータは、ＣＬ＞Ｎであるか否かを判断する（ステップＳ５２０４）。ＣＬ＞Ｎでない場合（ステップＳ５２０４：Ｎｏ）、コンピュータは、ＣＬをインクリメントして（ステップＳ５２０５）、ステップＳ５２０２に戻る。一方、ＣＬ＞Ｎである場合（ステップＳ５２０４：Ｙｅｓ）、２N分枝無節点ハフマン木が構築されたこととなり、一連処理が終了することとなる。
【０２５０】
＜葉へのポインタ生成処理（ステップＳ５２０３）＞
図５３は、図５２に示した葉へのポインタ生成処理（ステップＳ５２０３）の詳細な処理手順を示すフローチャートである。まず、コンピュータは、未選択の葉Ｌを選択し（ステップＳ５３０１）、選択葉へのポインタ数ｋをｋ＝１に設定する（ステップＳ５３０２）。そして、コンピュータは、選択葉へのポインタＰＬ（ｋ）の先行ビット列を、選択葉の圧縮符号に設定する（ステップＳ５３０３）。たとえば、上限長Ｎ＝１１については、選択葉が、文字情報「０」の葉の構造体である場合、圧縮符号は「００００００」である。したがって、選択葉へのポインタＰＬ（ｋ）の先行ビット列も、図２１に示したように、「００００００」となる。
【０２５１】
つぎに、コンピュータは、選択葉へのポインタＰＬ（ｋ）の後続ビット列のビット長を、最大圧縮符号長Ｎから選択葉の圧縮符号長ＣＬを引いた差分とし、後続ビット列の初期値をオール０に設定する（ステップＳ５３０４）。たとえば、選択葉が、文字情報「０」の葉の構造体である場合、圧縮符号長ＣＬは６ビットであるため、後続ビット列のビット長は５ビット（＝１１−６）となる。ｋ＝１の場合は、後続ビット列はオール０となるため、後続ビット列は、５ビットの「０００００」となる。
【０２５２】
そして、コンピュータは、選択葉へのポインタＰＬ（ｋ）を根の構造体に格納する（ステップＳ５３０５）。このあと、コンピュータは、ｋ＞ｂ（ＣＬ）であるか否かを判断する（ステップＳ５３０６）。ｂ（ＣＬ）は、選択葉の圧縮符号長ＣＬの葉当たりの枝数である。ｋ＞ｂ（ＣＬ）でない場合（ステップＳ５３０６：Ｎｏ）、選択葉に割り当てられたすべての枝について葉へのポインタが生成されていないため、コンピュータは、ｋをインクリメントする（ステップＳ５３０７）。
【０２５３】
そして、コンピュータは、現在の後続ビット列をインクリメントして、インクリメント後の後続ビット列を先行ビット列の末端に連結することで、あらたに、選択葉へのポインタＰＬ（ｋ）を生成する（ステップＳ５３０８）。そして、コンピュータは、選択葉へのポインタＰＬ（ｋ）を根の構造体に格納し（ステップＳ５３０９）、ステップＳ５３０６に戻る。ステップＳ５３０６〜ステップＳ５３０９を繰り返すことで、葉当たりの枝数分の葉へのポインタ群が生成されることとなる。そして、ステップＳ５３０６において、ｋ＞ｂ（ＣＬ）である場合（ステップＳ５３０６：Ｙｅｓ）、ステップＳ５２０２に移行する。
【０２５４】
このように、対象ファイル群Ｆｓに出現する文字情報の種類数に応じて、２N分枝無節点ハフマン木の最大枝数２Nを最適な本数に設定することができるため、２N分枝無節点ハフマン木のサイズの適正化を図ることができる。また、本実施の形態によれば、上限長Ｎが２〜４の整数倍でない場合（たとえば、上限長Ｎ＝１１，１３）であっても、圧縮効率のよい２N分枝無節点ハフマン木を生成することができる。
【０２５５】
このあと、コンピュータは、２N分枝無節点ハフマン木の各葉の構造体と、特殊単語の構造体１００，高位文字コードの構造体５００，分割文字コードの構造体６００とを、図１８の文字情報テーブルを参照して、相互に関連付ける。具体的には、上述したように、葉の構造体には、当該葉に格納されている圧縮符号に対応する高位文字、分割文字コードおよびへのポインタや特殊単語へのポインタを格納する。
【０２５６】
また、コンピュータは、特殊単語の構造体１００の特殊単語ごとに、対応する圧縮符号を格納する葉へのポインタを格納する。また、コンピュータは、高位文字コードの構造体５００の高位文字ごとに、対応する圧縮符号を格納する葉へのポインタを格納する。また、コンピュータは、分割文字コードの構造体６００の分割文字コードごとに、対応する圧縮符号を格納する葉へのポインタを格納する。なお、分割文字コードの構造体６００は、必ずしも生成する必要はなく、出現頻度が所定回数に満たない場合であっても、高位文字コードの構造体５００として登録してもよい。
【０２５７】
＜補正Ｂ処理の他の例＞
つぎに、補正Ｂ処理の他の例について説明する。上述した補正Ｂ+処理および補正Ｂ-処理では、圧縮符号長の葉数ごとに、各圧縮符号長の葉数を生起確率総和で割ることにより、各圧縮符号長の葉数を更新することとした。これに対し、本例では、最小圧縮符号長ＣＬｍｉｎから最大圧縮符号長ＣＬｍａｘ（すなわち、上限長Ｎ）に向かって、小さい圧縮符号長の葉数がそれより大きい圧縮符号長の葉数よりも増減するように、葉数を移動させる。
【０２５８】
具体的には、本例の補正Ｂ+処理では、小さい圧縮符号長の葉数がそれより大きい圧縮符号長の葉数よりも減少するように、葉数を補正する。一方、本例の補正Ｂ-処理では、小さい圧縮符号長の葉数がそれより大きい圧縮符号長の葉数よりも増加するように、葉数を移動させる。その後は、補正後の葉数を生起確率総和で割ることで、各圧縮符号長の葉数を更新する。
【０２５９】
なお、以下に説明する例では、ある圧縮符号長ＣＬの葉数Ｌ（ＣＬ）を、圧縮符号長（ＣＬ＋１）の葉数Ｌ（ＣＬ＋１）よりも増加／減少するように補正をおこなう例について説明するが、圧縮符号長ＣＬよりも大きい圧縮符号長（ＣＬ＋２），（ＣＬ＋３），…であってもよい。また、移動対象葉数の個数は、１個に限らず、２個以上でもよい。たとえば、移動元の圧縮符号長の葉数をすべて移動先に移動させてもよい。
【０２６０】
図５４は、補正Ｂ+処理（ステップＳ４００３）の他の例の詳細な処理手順を示すフローチャートである。補正Ｂ+処理（ステップＳ４００３）において、最小圧縮符号長ＣＬｍｉｎをＭとする。また、最大圧縮符号長ＣＬｍａｘは上限長Ｎとなる。図５４では、葉数を１個ずつ移動させる例を示している。
【０２６１】
まず、コンピュータは、圧縮符号長ＣＬをＣＬ＝Ｍに設定する（ステップＳ５４０１）。つぎに、コンピュータは、圧縮符号長ＣＬがＣＬ＝Ｎであるか否かを判断する（ステップＳ５４０２）。ＣＬ＝Ｎでない場合（ステップＳ５４０２：Ｎｏ）、圧縮符号長ＣＬが最大圧縮符号長ＣＬｍａｘに到達していないこととなる。この場合、コンピュータは、葉数Ｌ（ＣＬ）がＬ（ＣＬ）＝０であるか否かを判断する（ステップＳ５４０３）。
【０２６２】
Ｌ（ＣＬ）＝０の場合（ステップＳ５４０３：Ｙｅｓ）、移動させる葉数Ｌ（ＣＬ）がないため、コンピュータは、圧縮符号長ＣＬをインクリメントし（ステップＳ５４０４）、ステップＳ５４０２に戻る。そして、圧縮符号長ＣＬがＣＬ＝Ｎとなった場合（ステップＳ５４０２：Ｙｅｓ）、ステップＳ５４１３に移行し、コンピュータは、今回の補正における圧縮符号長ごとの葉数で確定させることとなる。
【０２６３】
また、ステップＳ５４０３において、葉数Ｌ（ＣＬ）がＬ（ＣＬ）＝０でない場合（ステップＳ５４０３：Ｎｏ）、コンピュータは、現在対象となっている圧縮符号長ＣＬの葉数Ｌ（ＣＬ）をデクリメントし（ステップＳ５４０５）、移動先となる圧縮符号長（ＣＬ＋１）の葉数Ｌ（ＣＬ＋１）をインクリメントする（ステップＳ５４０６）。
【０２６４】
そして、圧縮符号長ＣＬ，（ＣＬ＋１）については、ステップＳ５４０５，ステップＳ５４０６において葉数が増減したため、コンピュータは、圧縮符号長ＣＬについての生起確率と圧縮符号長（ＣＬ＋１）についての生起確率とを再計算する（ステップＳ５４０７）。このあと、コンピュータは、各圧縮符号長ＣＬｍｉｎ〜ＣＬｍａｘの最新の葉数での生起確率総和ＴＯＰを算出する（ステップＳ５４０８）。
【０２６５】
そして、コンピュータは、算出されたＴＯＰがｔ＞ＴＯＰであるか否かを判断する（ステップＳ５４０９）。ｔ＞ＴＯＰである場合（ステップＳ５４０９：Ｙｅｓ）、まだ改善の余地があるため、ステップＳ５４０３に戻る。一方、ｔ＞ＴＯＰでない場合（ステップＳ５４０９：Ｎｏ）、コンピュータは、ｔ≦ＴＯＰ≦１であるか否かを判断する（ステップＳ５４１０）。ｔ≦ＴＯＰ≦１である場合（ステップＳ５４１０：Ｙｅｓ）、これ以上補正する必要がないため、ステップＳ５４１３に移行する。
【０２６６】
一方、ｔ≦ＴＯＰ≦１でない場合（ステップＳ５４１０：Ｎｏ）、コンピュータは、現在対象となっている圧縮符号長Ｌの葉数Ｌ（ＣＬ）をインクリメントし（ステップＳ５４１１）、移動先の圧縮符号長（ＣＬ＋１）の葉数Ｌ（ＣＬ＋１）をデクリメントする（ステップＳ５４１２）。すなわち、ｔ≦ＴＯＰ≦１でない場合（ステップＳ５４１０：Ｎｏ）は、ＴＯＰ＞１であるため、今回の補正自体が失敗となる。
【０２６７】
したがって、ステップＳ５４０５およびステップＳ５４０６での葉数移動を、ステップＳ５４１１およびステップＳ５４１２で元に戻すこととなる。このあと、ステップＳ５４０４に戻る。ステップＳ５４０４では、圧縮符号長ＣＬがインクリメントされるため、葉数移動による生起確率の増加がインクリメント前の圧縮符号長ＣＬに比べて１／２に抑えられる。したがって、葉数ＣＬをインクリメントするほど、微調整が可能となり、より微小な補正幅でｔ≦ＴＯＰ≦１に収めることができる。
【０２６８】
また、ステップＳ５４１３になると、コンピュータは、そのときの圧縮符号長ＣＬｍｉｎ〜ＣＬｍａｘごとの葉数Ｌ（ＣＬｍｉｎ）〜葉数Ｌ（ＣＬｍａｘ）で確定させることとなる（ステップＳ５４１３）。その後、ステップＳ４００５に移行することで、補正Ｂ+処理（ステップＳ４００３）を終了する。
【０２６９】
図５５は、補正Ｂ-処理（ステップＳ４００４）の他の例の詳細な処理手順を示すフローチャートである。補正Ｂ-処理（ステップＳ４００４）は、図５４に示した補正Ｂ+処理（ステップＳ４００３）とほぼ同一内容であるため、同一処理には同一ステップ番号を付す。異なる点は、ステップＳ５５０５，ステップＳ５５０６，ステップＳ５５０９，ステップＳ５５１１，ステップＳ５５１２である。
【０２７０】
まず、コンピュータは、圧縮符号長ＣＬをＣＬ＝Ｍに設定する（ステップＳ５４０１）。つぎに、コンピュータは、圧縮符号長ＣＬがＣＬ＝Ｎであるか否かを判断する（ステップＳ５４０２）。ＣＬ＝Ｎでない場合（ステップＳ５４０２：Ｎｏ）、圧縮符号長ＣＬが最大圧縮符号長ＣＬｍａｘに到達していないこととなる。この場合、コンピュータは、葉数Ｌ（ＣＬ）がＬ（ＣＬ）＝０であるか否かを判断する（ステップＳ５４０３）。
【０２７１】
Ｌ（ＣＬ）＝０の場合（ステップＳ５４０３：Ｙｅｓ）、移動させる葉数Ｌ（ＣＬ）がないため、コンピュータは、圧縮符号長ＣＬをインクリメントし（ステップＳ５４０４）、ステップＳ５４０２に戻る。そして、圧縮符号長ＣＬがＣＬ＝Ｎとなった場合（ステップＳ５４０２：Ｙｅｓ）、ステップＳ５４１３に移行し、コンピュータは、今回の補正における圧縮符号長ごとの葉数で確定させることとなる。
【０２７２】
また、ステップＳ５４０３において、葉数Ｌ（ＣＬ）がＬ（ＣＬ）＝０でない場合（ステップＳ５４０３：Ｎｏ）、コンピュータは、現在対象となっている圧縮符号長ＣＬの葉数Ｌ（ＣＬ）をインクリメントし（ステップＳ５５０５）、移動先となる圧縮符号長（ＣＬ＋１）の葉数Ｌ（ＣＬ＋１）をデクリメントする（ステップＳ５５０６）。
【０２７３】
そして、圧縮符号長ＣＬ，（ＣＬ＋１）については、ステップＳ５５０５，ステップＳ５５０６において葉数が増減したため、コンピュータは、圧縮符号長ＣＬについての生起確率と圧縮符号長（ＣＬ＋１）についての生起確率とを再計算する（ステップＳ５４０７）。このあと、コンピュータは、各圧縮符号長ＣＬｍｉｎ〜ＣＬｍａｘの最新の葉数での生起確率総和ＴＯＰを算出する（ステップＳ５４０８）。
【０２７４】
そして、コンピュータは、算出されたＴＯＰが１＜ＴＯＰであるか否かを判断する（ステップＳ５５０９）。１＜ＴＯＰである場合（ステップＳ５５０９：Ｙｅｓ）、まだ改善の余地があるため、ステップＳ５４０３に戻る。一方、１＜ＴＯＰでない場合（ステップＳ５５０９：Ｎｏ）、コンピュータは、ｔ≦ＴＯＰ≦１であるか否かを判断する（ステップＳ５４１０）。ｔ≦ＴＯＰ≦１である場合（ステップＳ５４１０：Ｙｅｓ）、これ以上補正する必要がないため、ステップＳ５４１３に移行する。
【０２７５】
一方、ｔ≦ＴＯＰ≦１でない場合（ステップＳ５４１０：Ｎｏ）、コンピュータは、現在対象となっている圧縮符号長Ｌの葉数Ｌ（ＣＬ）をデクリメントし（ステップＳ５５１１）、移動先の圧縮符号長（ＣＬ＋１）の葉数Ｌ（ＣＬ＋１）をインクリメントする（ステップＳ５５１２）。すなわち、ｔ≦ＴＯＰ≦１でない場合（ステップＳ５４１０：Ｎｏ）は、ｔ＞ＴＯＰであるため、今回の補正自体が失敗となる。
【０２７６】
したがって、ステップＳ５５０５およびステップＳ５５０６での葉数移動を、ステップＳ５５１１およびステップＳ５５１２で元に戻すこととなる。このあと、ステップＳ５４０４に戻る。ステップＳ５４０４では、圧縮符号長ＣＬがインクリメントされるため、葉数移動による生起確率の減少がインクリメント前の圧縮符号長ＣＬに比べて１／２に抑えられる。したがって、葉数ＣＬをインクリメントするほど、微調整が可能となり、より微小な補正幅でｔ≦ＴＯＰ≦１に収めることができる。
【０２７７】
また、ステップＳ５４１３になると、コンピュータは、そのときの圧縮符号長ＣＬｍｉｎ〜ＣＬｍａｘごとの葉数Ｌ（ＣＬｍｉｎ）〜葉数Ｌ（ＣＬｍａｘ）で確定させることとなる（ステップＳ５４１３）。その後、ステップＳ４００５に移行することで、補正Ｂ-処理（ステップＳ４００４）を終了する。
【０２７８】
図５６は、図５４に示した補正Ｂ+処理の他の例を適用した場合における、図１３の（３）葉数特定〜（５）葉の構造体生成の詳細（Ｎ＝１２）を示す説明図である。図５６では、移動元の圧縮符号長の葉数を、１ビット小さい移動先の圧縮符号長の葉数に１個ずつシフトさせた例を示している。図５６では、図５３におけるしきい値ｔをｔ＝１とする。図５６では、補正Ａでの生起確率総和ＴＯＰが「０．８２３」であるため、補正Ｂ+処理が適用される。まず、移動先を最小圧縮符号長である６ビットとし、移動元を１ビット大きい７ビットとする。補正Ｂ+１では、圧縮符号長７ビットの葉数９を１つずつ、最小圧縮符号長６ビットに移動させる。
【０２７９】
コンピュータは、この移動ごとに、生起確率総和ＴＯＰを求めて、１以下の最大漸近値に収束するか否かを判断することとなる。本例において、補正Ｂ+１では生起確率総和ＴＯＰが１を超えていない。そして、移動元の圧縮符号長７ビットの葉数が０になった場合、移動先の圧縮符号長６ビットの葉数は１１（＝９＋２）となる。このときの補正Ｂ+１での生起確率総和ＴＯＰは「０．８９４」であるため、さらに補正Ｂ+が必要である。
【０２８０】
補正Ｂ+２についても同様な処理をおこなうことで、補正Ｂ+２での生起確率総和ＴＯＰは「０．９７９」となり、さらに補正Ｂ+が必要である。つぎに、補正Ｂ+３についても同様な処理をおこなうことで、補正Ｂ+３での生起確率総和ＴＯＰは「０．９９９」となり、さらに補正Ｂ+が必要である。
【０２８１】
つぎに、補正Ｂ+４についても同様な処理をおこなうことで、補正Ｂ+４での生起確率総和ＴＯＰは「１．０００」となり、さらに補正Ｂ+が可能である。つぎに、補正Ｂ+５についても同様な処理をおこなうことで、補正Ｂ+５での生起確率総和ＴＯＰは「１．０００」となり、さらに補正Ｂ+が必要である。つぎに、補正Ｂ+６では、移動先および移動元の圧縮符号長を１ビット大きくする。すなわち、移動先の圧縮符号長を１０ビットから１１ビットとし、移動元の圧縮符号長を１１ビットから１２ビットとする。
【０２８２】
そして、移動元の圧縮符号長１２ビットの葉数２２１４を１つずつ、補正Ｂ+５で葉数が２４になった移動先の圧縮符号長１１ビットに移動させる。コンピュータは、この移動ごとに、生起確率総和ＴＯＰを求めて、１以下の最大漸近値に収束するか否かを判断することとなる。本例において、移動元の圧縮符号長１２ビットの葉数が２２１４から２２１３になり、移動先の圧縮符号長１１ビットの葉数が２４から２５になると、生起確率総和ＴＯＰが１を超える。したがって、それぞれ葉数を１つ戻すこととなる。戻した葉数は、補正Ｂ+５終了時点での葉数となる。補正Ｂ+５終了時点での生起確率総和ＴＯＰは「１．０００」である。本例では、これ以上、移動元の圧縮符号長を大きくすることができないため、補正Ｂ+５終了時点での葉数が確定することとなる。
【０２８３】
図５７は、上述した補正Ｂ-処理の他の例を適用した場合における、図１３の（３）葉数特定〜（５）葉の構造体生成の詳細（Ｎ＝１１）を示す説明図である。図５７では、移動元の圧縮符号長の葉数をすべて、１ビット大きい移動先の圧縮符号長の葉数にシフトさせた例を示している。図５７では、図５５におけるしきい値ｔをｔ＝１とする。図５７では、補正Ａでの生起確率総和ＴＯＰが「１．１４６」であるため、補正Ｂ-処理が適用される。まず、移動元を最小圧縮符号長である５ビットとし、移動先を１ビット大きい６ビットとする。補正Ｂ-１では、移動元の圧縮符号長５ビットの葉数２を１つずつ、圧縮符号長６ビットに移動させる。
【０２８４】
コンピュータは、この移動ごとに、生起確率総和ＴＯＰを求めて、１以下の最大漸近値に収束するか否かを判断することとなる。本例において、補正Ｂ-１では生起確率総和ＴＯＰが１以下にならない。そして、移動元の圧縮符号長５ビットの葉数が０になった場合、移動先の圧縮符号長６ビットの葉数は１１（＝９＋２）となる。このときの補正Ｂ-１での生起確率総和ＴＯＰは「１．１１５」であるため、さらに補正Ｂ-が必要である。
【０２８５】
つぎに、補正Ｂ-２についても同様な処理をおこなうことで、補正Ｂ-２での生起確率総和ＴＯＰは「１．０２９」となり、さらに補正Ｂ-が必要である。
【０２８６】
つぎに、補正Ｂ-３では、移動元および移動先の圧縮符号長を１ビット大きくする。すなわち、移動元の圧縮符号長を６ビットから７ビットとし、移動先の圧縮符号長を７ビットから８ビットとする。
【０２８７】
そして、移動元の圧縮符号長７ビットの葉数３３を１つずつ、移動先の圧縮符号長８ビットの葉数２８に移動させる。コンピュータは、この移動ごとに、生起確率総和ＴＯＰを求めて、１以下の最大漸近値に収束するか否かを判断することとなる。本例において、補正Ｂ-３では、移動元である圧縮符号長７ビットの葉数が２５、移動先である圧縮符号長８ビットの葉数が３６に到達すると、生起確率総和ＴＯＰが１以下の「０．９９８」となる。これ以上葉数移動をしても、生起確率総和ＴＯＰが低下するため、このときの各圧縮符号長の葉数で確定させることとなる。
【０２８８】
＜圧縮処理＞
つぎに、上述した２N分枝無節点ハフマン木を用いた対象ファイル群Ｆｓの圧縮処理について説明する。圧縮処理は、コンピュータが実行してもよく、また、２N分枝無節点ハフマン木が格納された情報処理装置が実行してもよい。すなわち、少なくとも２N分枝無節点ハフマン木が格納されていればよい。以下、コンピュータおよび情報処理装置を総称してコンピュータとする。ここで、まず、圧縮対象文字列とその圧縮符号を例に挙げて説明する。
【０２８９】
図５８は、圧縮対象文字列の一例を示す説明図である。図５８では、「婚活は結婚活動」という文字列の１６ビットコード（１６進と２進）を示している。
【０２９０】
図５９は、図５８に示した圧縮対象文字列の圧縮符号を示す説明図である。図５９に示した圧縮符号は、図２８に示した２N分枝無節点ハフマン木（Ｎ＝１３）を用いて圧縮した例を示している。図５９では、図５８と比較すると、文字「婚」は、低出現頻度文字であるため、上位８ビットの分割文字コード「０ｘ５Ａ」が１２ビットの圧縮符号に圧縮されている。また、下位８ビットの分割文字コード「０ｘ５Ａ」も１２ビットの圧縮符号に圧縮されている。高位文字「活」は、１６ビットから９ビットに圧縮されている。高位文字「は」は、１６ビットから９ビットに圧縮されている。
【０２９１】
「結婚」は基礎単語に該当するため、３２ビットから１３ビットに圧縮されている。また、「活動」は、基礎単語に該当するため、３２ビットから１３ビットに圧縮されている。
【０２９２】
なお、分割文字コードについては、圧縮後のほうがビット長が長いが、「婚」のような単一文字はそもそも出現回数が少ないために分割されているため、対象ファイル群Ｆｓ全体で見れば問題ない。また、基礎単語は、そのビット列に比べて圧縮符号が非常に短くなるため（最大でも１３ビット）、２文字（高位文字）以上であれば十分圧縮効率が向上することとなる。
【０２９３】
＜圧縮処理の具体例＞
図６０は、２N分枝無節点ハフマン木を用いた圧縮処理の具体例を示す説明図である。まず、コンピュータは、対象ファイル群Ｆｓから１文字目の圧縮対象文字コードを取得し、対象ファイル上の位置を保持しておく。そして、コンピュータは、特殊単語の構造体１００に対して２分木探索をおこなう。特殊単語は２文字以上の文字コード列であるため、１文字目の圧縮対象文字コードがヒットした場合、２文字目の文字コードを圧縮対象文字コードとして取得する。
【０２９４】
そして、２文字目の文字コードは、１文字目の圧縮対象文字コードがヒットした位置から探索する。３文字目以降も、不一致の圧縮対象文字コードが出現するまで繰り返し２分木探索をおこなう。一致する特殊単語ｒａ（ａは葉の番号）が探索された場合、特殊単語の構造体１００において対応付けされている葉Ｌａへのポインタにより葉Ｌａの構造体にアクセスする。そして、コンピュータは、アクセス先の葉Ｌａの構造体に格納されている特殊単語ｒａの圧縮符号を探索して、圧縮バッファ６０００に格納する。
【０２９５】
一方、不一致の圧縮文字コードが出現した場合、特殊単語の構造体１００に対する２分木探索を終了する（ＥＯＴ（Ｅｎｄ  Ｏｆ  Ｔｒａｎｓｍｉｓｓｉｏｎ）まで進む）。そして、コンピュータは、１文字目の圧縮対象文字コードを再度レジスタにセットして、高位文字コードの構造体５００に対する２分木探索をおこなう。
【０２９６】
一致する文字コードｅｂ（ｂは葉の番号）が探索された場合、コンピュータは、その葉Ｌｂへのポインタにより葉Ｌｂの構造体にアクセスする。そして、コンピュータは、アクセス先の葉Ｌｂの構造体に格納されている文字コードｅｂの圧縮符号を探索して、圧縮バッファ６０００に格納する。
【０２９７】
一方、一致する文字コードが出現せず２分木探索を終了した場合、圧縮対象文字コードは高位文字コードではないため、コンピュータは、上位８ビットと下位８ビットに分割する。そして、コンピュータは、上位８ビットの分割文字コードについて、分割文字コードの構造体６００に対する２分木探索をおこなう。一致する分割文字コードＤｃ１（ｃ１は葉の番号）が探索された場合、コンピュータは、その葉Ｌｃ１へのポインタにより葉Ｌｃ１の構造体にアクセスする。そして、コンピュータは、アクセス先の葉Ｌｃ１の構造体に格納されている分割文字コードＤｃ１の圧縮符号を探索して、圧縮バッファ６０００に格納する。
【０２９８】
引き続き、コンピュータは、下位８ビットの分割文字コードについて、分割文字コードの構造体６００に対する２分木探索をおこなう。一致する分割文字コードＤｃ２（ｃ２は葉の番号）が探索された場合、コンピュータは、その葉Ｌｃ２へのポインタにより葉Ｌｃ２の構造体にアクセスする。そして、コンピュータは、アクセス先の葉Ｌｃ２の構造体に格納されている分割文字コードＤｃ２の圧縮符号を探索して、圧縮バッファ６０００に格納する。
【０２９９】
＜ファイル圧縮処理＞
図６１は、コンピュータが自動実行する２N分枝無節点ハフマン木を用いたファイル圧縮処理手順を示すフローチャートである。まず、コンピュータは、ファイル番号：ｐをｐ＝１とし（ステップＳ６１０１）、対象ファイルＦｐを読み込む（ステップＳ６１０２）。つぎに、コンピュータは、圧縮処理を実行して（ステップＳ６１０３）、ファイル番号：ｐをインクリメントする（ステップＳ６１０４）。そして、コンピュータは、ｐ＞ｎであるか否かを判断する（ステップＳ６１０５）。ｎは対象ファイル群Ｆｓの総数である。ｐ＞ｎでない場合（ステップＳ６１０５：Ｎｏ）、ステップＳ６１０２に戻る。一方、ｐ＞ｎである場合（ステップＳ６１０５：Ｙｅｓ）、一連のファイル圧縮処理を終了する。
【０３００】
図６２は、図６１に示した圧縮処理（ステップＳ６１０３）の詳細な処理手順を示すフローチャート（その１）である。図６２において、まず、コンピュータは、対象ファイル群Ｆｓに圧縮対象文字コードがあるか否かを判断する（ステップＳ６２０１）。ある場合（ステップＳ６２０１：Ｙｅｓ）、コンピュータは、圧縮対象文字コードを取得してレジスタにセットする（ステップＳ６２０２）。そして、コンピュータは、先頭の圧縮対象文字コードか否かを判断する（ステップＳ６２０３）。
【０３０１】
ここで、先頭の圧縮対象文字コードとは、未圧縮の１文字目の文字コードをいう。先頭である場合（ステップＳ６２０３：Ｙｅｓ）、コンピュータは、その圧縮対象文字コードの対象ファイル群Ｆｓ上の位置（先頭位置）となるポインタを取得し（ステップＳ６２０４）、ステップＳ６２０５に移行する。一方、先頭でない場合（ステップＳ６２０３：Ｎｏ）、先頭位置を取得せずにステップＳ６２０５に移行する。
【０３０２】
そして、コンピュータは、特殊単語の構造体１００に対して２分木探索をおこなう（ステップＳ６２０５）。圧縮対象文字コードが一致した場合（ステップＳ６２０６：Ｙｅｓ）、コンピュータは、連続して一致した文字コード列が特殊単語（の文字コード列）に該当するか否かを判断する（ステップＳ６２０７）。該当しない場合（ステップＳ６２０７：Ｎｏ）、コンピュータは、ステップＳ６２０２に戻って後続の文字コードを圧縮対象文字コードとして取得する。この場合、後続の文字コードは先頭ではないため、先頭位置は取得しないこととなる。
【０３０３】
一方、ステップＳ６２０７において、特殊単語に該当する場合（ステップＳ６２０７：Ｙｅｓ）、コンピュータは、該当する特殊単語の葉Ｌ♯へのポインタにより葉Ｌ♯の構造体にアクセスする（ステップＳ６２０８）。そして、コンピュータは、ポイントされた葉Ｌ♯の構造体に格納されている特殊単語の圧縮符号を抽出する（ステップＳ６２０９）。
【０３０４】
この後、コンピュータは、抽出された圧縮符号を圧縮バッファ６０００に格納して（ステップＳ６２１０）、ステップＳ６２０１に戻る。このループが特殊単語の圧縮処理の流れとなる。ステップＳ６２０１において、圧縮対象文字コードがない場合（ステップＳ６２０１：Ｎｏ）、コンピュータは、対象ファイルＦｐから圧縮された圧縮ファイルｆｐを圧縮バッファ６０００からファイル出力して保存する（ステップＳ６２１１）。そして、ステップＳ６１０４に移行する。一方、ステップＳ６２０６において不一致となった場合（ステップＳ６２０６：Ｎｏ）、１６ビットの文字コードの圧縮処理のループに入る。
【０３０５】
図６３は、図６１に示した圧縮処理（ステップＳ６１０３）の詳細な処理手順を示すフローチャート（その２）である。図６３において、コンピュータは、ステップＳ６２０４で取得された先頭位置のポインタを参照して、対象ファイル群Ｆｓから圧縮対象文字コードを取得してレジスタにセットする（ステップＳ６３０１）。
【０３０６】
つぎに、コンピュータは、圧縮対象文字コードについて、高位文字コードの構造体５００に対して２分木探索をおこなう（ステップＳ６３０２）。一致した場合（ステップＳ６３０３：Ｙｅｓ）、コンピュータは、該当する文字の葉Ｌ♯へのポインタにより葉Ｌ♯の構造体にアクセスする（ステップＳ６３０４）。そして、コンピュータは、ポイントされた葉Ｌ♯の構造体に格納されている圧縮対象文字コードの圧縮符号を抽出する（ステップＳ６３０５）。
【０３０７】
この後、コンピュータは、探索された圧縮符号を圧縮バッファ６０００に格納して（ステップＳ６３０６）、ステップＳ６２０１に戻る。このループが１６ビットの文字コードの圧縮処理の流れとなる。一方、ステップＳ６３０３において一致する文字コードが存在しなかった場合（ステップＳ６３０３：Ｎｏ）、分割文字コードの圧縮処理のループに入る。
【０３０８】
図６４は、図６１に示した圧縮処理（ステップＳ６１０３）の詳細な処理手順を示すフローチャート（その３）である。図６４において、まず、コンピュータは、圧縮対象文字コードを上位８ビットと下位８ビットとに分割し（ステップＳ６４０１）、上位８ビットの分割文字コードを抽出する（ステップＳ６４０２）。そして、コンピュータは、分割文字コードの構造体６００に対して２分木探索をおこなう（ステップＳ６４０３）。
【０３０９】
そして、コンピュータは、探索された分割文字コードの葉Ｌ♯へのポインタにより葉Ｌ♯の構造体にアクセスする（ステップＳ６４０４）。そして、コンピュータは、ポイントされた葉Ｌ♯の構造体に格納されている分割文字コードの圧縮符号を抽出する（ステップＳ６４０５）。この後、コンピュータは、探索された圧縮符号を圧縮バッファ６０００に格納する（ステップＳ６４０６）。
【０３１０】
つぎに、コンピュータは、下位８ビットが探索済みか否かを判断し（ステップＳ６４０７）、探索済みでない場合（ステップＳ６４０７：Ｎｏ）、コンピュータは、下位８ビットの分割文字コードを抽出して（ステップＳ６４０８）、ステップＳ６４０３〜Ｓ６４０６を実行する。一方、下位８ビットが探索済みである場合（ステップＳ６４０７：Ｙｅｓ）、ステップＳ６２０１に戻り、特殊単語の圧縮処理のループに入る。
【０３１１】
このように、２N分枝無節点ハフマン木を用いた圧縮処理では、内部節点がないため根に向かって探索する必要はなく、ポイントされた葉Ｌ♯の構造体に格納されている文字情報を抽出して、圧縮バッファ６０００に書き込むだけでよい。したがって、圧縮処理の高速化を図ることができる。
【０３１２】
また、圧縮対象文字コードが格納されている葉Ｌ♯の構造体を、特殊単語の構造体１００、高位文字コードの構造体５００および分割文字コードの構造体６００により即座に特定することができる。したがって、２N分枝無節点ハフマン木の葉を探索する必要がなく、圧縮処理の高速化を図ることができる。また、低位文字コードを上位ビットコードと下位ビットコードに分割することで、６万種以上ある低位の文字コードをたかだか２５６種の分割文字コードの圧縮符号に圧縮することができる。したがって、圧縮率の向上を図ることができる。
【０３１３】
＜圧縮ファイルの絞込み例＞
つぎに、圧縮ファイルの絞り込み例について説明する。対象ファイル群Ｆｓは、２N分枝無節点ハフマン木で圧縮されて、圧縮ファイル群Ｆｓとなっている。コンピュータは、圧縮ファイル群Ｆｓの中から、検索文字列を２N分枝無節点ハフマン木で圧縮した圧縮文字列の各圧縮文字をすべて含む圧縮ファイルを絞り込む。圧縮ファイルの絞込みは、検索文字列を構成する文字情報の出現マップ群をＡＮＤ演算する。
【０３１４】
図６５は、圧縮ファイルの絞込み例を示す説明図である。（Ａ）は、検索文字列が「結婚」の場合の出現マップ群のＡＮＤ演算結果を示している。検索文字列「結婚」の場合、基礎単語「結婚」の出現マップのみ取得する。（Ａ）の例では、対象ファイルＦ３にのみ、検索文字列「結婚」が記述されていることがわかる。
【０３１５】
（Ｂ）は、検索文字列が「結婚活動」の場合の出現マップ群のＡＮＤ演算結果を示している。検索文字列「結婚活動」の場合、基礎単語「結婚」の出現マップと、基礎単語「活動」の出現マップと、のＡＮＤ演算となる。（Ｂ）の例では、対象ファイルＦ３にのみ、検索文字列「結婚活動」が記述されていることがわかる。
【０３１６】
（Ｃ）は、検索文字列が「婚活」の場合の出現マップ群のＡＮＤ演算結果を示している。検索文字列「婚活」の場合、高位文字「活」の出現マップと、分割文字コード「０ｘ５Ａ」の出現マップと、のＡＮＤ演算となる。（Ｃ）の例では、対象ファイルＦ１〜Ｆ３に、検索文字列「婚活」が記述されている可能性があることがわかる。このように、検索文字列が基礎単語に登録されていない場合は、基礎単語の出現マップが使えないため、圧縮ファイルの絞込みが甘くなる傾向があり、伸長対象となる圧縮ファイルが増加する。したがって、伸長速度の効率化を図る必要がある。
【０３１７】
＜伸長処理例＞
つぎに、２N分枝無節点ハフマン木により圧縮された圧縮符号列を伸長する伸長処理例について説明する。
【０３１８】
図６６〜図７１は、圧縮符号列の伸長処理例を示す説明図である。図６６〜図７１では、圧縮ファイルを伸長する過程において、圧縮ファイル内の圧縮符号列と検索文字列「婚活」の圧縮符号列とを照合し、一致した場合には照合／置換テーブルＴ（Ｔ６）の置換文字列を伸長バッファに書き出す例を示す。なお、照合不一致の場合は、伸長された文字列を伸長バッファに書き出すこととなる。
【０３１９】
また、伸長処理では、コンピュータは、レジスタｒ１に圧縮符号列をセットし、マスクパターンにより圧縮符号を抽出する。コンピュータは、抽出した圧縮符号を、１パス（１枝分のアクセス）で２N分枝無節点ハフマン木の根から探索する。そして、コンピュータは、アクセスした葉Ｌ♯の構造体に格納されている文字コードを読み出して伸長バッファ６６００に格納する。
【０３２０】
圧縮符号を抽出するため、コンピュータは、マスクパターンのマスク位置をオフセットする。また、マスクパターンの初期値を“０ｘＦＦＦ１００００”とする。このマスクパターンは先頭１３ビットが“１”であり、後続の１９ビットが“０”のビット列である。
【０３２１】
コンピュータは、ビットアドレスａｂｉとバイトオフセットｂｙｏｓとビットオフセットｂｉｏｓとを算出する。ビットアドレスａｂｉは、抽出された圧縮符号のビット位置を示す値であり、今回のビットアドレスａｂｉは、前回のビットアドレスａｂｉに前回抽出された圧縮符号の圧縮符号長ｌｅｇを加算した値となる。なお、初期状態では、ビットアドレスａｂｉはａｂｉ＝０とする。
【０３２２】
バイトオフセットｂｙｏｓは、メモリに保持されている圧縮符号列のバイト境界を示す値であり、ビットアドレスａｂｉ／８の商で求められる。たとえば、バイトオフセットｂｙｏｓ＝０のときは、メモリに記憶されている先頭からの圧縮符号列をレジスタにセットし、バイトオフセットｂｙｏｓ＝１のときは、メモリに記憶されている先頭１バイト目からの圧縮符号列をレジスタにセットする。
【０３２３】
また、ビットオフセットｂｉｏｓは、マスクパターンのマスク位置（“ＦＦＦ”）をオフセットする値であり、ビットアドレスａｂｉ／８の余りである。たとえば、ビットオフセットｂｉｏｓ＝０のときは、マスク位置はシフトされないこととなり、マスクパターンは、“０ｘＦＦＦ１００００”となる。一方、ビットオフセットｂｉｏｓ＝４のときは、マスク位置は末尾方向に４ビットシフトすることとなり、マスクパターンは、“０ｘ０ＦＦＦ００００”となる。
【０３２４】
レジスタシフト数ｒｓは、マスクパターンとのＡＮＤ演算後のレジスタｒ２内の圧縮符号列を末尾方向にシフトするビット数であり、ｒｓ＝３２−１３−ｂｉｏｓで求められる。このシフトにより、コンピュータは、シフト後のレジスタｒ２の末尾ｍビットのビット列を対象ビット列として抽出する。コンピュータは、対象ビット列の抽出後はレジスタｒ２をクリアする。
【０３２５】
なお、図６６〜図７１において、メモリには図５９に示した圧縮符号列が保持されているものとする。また、図６６〜図７１のメモリ内のブロックは１バイトのビット列を示しており、内部の数字は、バイト境界となるバイト位置を示している。
【０３２６】
図６６は、初期状態（（Ａ）の状態）を示している。（Ａ）では、ビットアドレスａｂｉ＝０により、バイトオフセットｂｙｏｓ＝０、ビットオフセットｂｉｏｓ＝０となる。バイトオフセットｂｙｏｓ＝０により、コンピュータは、メモリに保持されている圧縮符号列のうち先頭から４バイト分（図中、網掛け）の圧縮符号列をレジスタｒ１にセットする。
【０３２７】
また、ビットオフセットｂｉｏｓ＝０により、マスクパターンは、“０ｘＦＦＦ８００００”であり、レジスタｒ２にセットされる。したがって、レジスタｒ１にセットされた圧縮符号列とレジスタｒ２にセットされたマスクパターン“０ｘＦＦＦ８００００”を論理積（ＡＮＤ）演算することにより、レジスタｒ２においてＡＮＤ結果が得られる。
【０３２８】
また、ビットオフセットｂｉｏｓ＝０により、レジスタシフト数ｒｓは、ｒｓ＝３２−ｍ―ｂｉｏｓ＝３２−１３−０＝１９となる。したがって、レジスタｒ２内のＡＮＤ結果を末尾方向に１９ビット分シフトする。このシフトによりレジスタｒ２には、“０１０１００１１０１１００”が残されるため、コンピュータは、末尾１３ビットを対象ビット列として抽出する。この場合は、“０１０１００１１０１１００”が対象ビット列として抽出される。抽出後、レジスタｒ２はクリアされる。
【０３２９】
図２８に示したように、２N分枝無節点ハフマン木の根の構造体には、葉Ｌ１〜Ｌ５４０１へのポインタが格納されている。したがって、コンピュータは、２N分枝無節点ハフマン木の根の構造体の中から、抽出された対象ビット列“０１０１００１１０１１００”と一致する葉Ｌ♯へのポインタを探索する。この場合、葉Ｌ＃（０ｘ５Ａ）へのポインタ群の中の１つと一致するため、コンピュータは、該当する葉Ｌ＃（０ｘ５Ａ）へのポインタを読み出して、葉Ｌ＃（０ｘ５Ａ）の構造体にアクセスする。
【０３３０】
葉Ｌ＃（０ｘ５Ａ）の構造体には、分割文字コード「０ｘ５Ａ」へのポインタが格納されているため、コンピュータは、分割文字コードの構造体６００の中から、分割文字コード“０ｘ５Ａ”へのポインタで分割文字コード「０ｘ５Ａ」を指定して、読み出す。
【０３３１】
また、アクセス先となる葉Ｌ＃（０ｘ５Ａ）の構造体においては、対象ビット列“０１０１００１１０１１００”のうち先頭１２ビットの圧縮符号“０１０１００１１０１１０”が格納されている。また、葉Ｌ＃（０ｘ５Ａ）の構造体の照合フラグがＯＮであるため、コンピュータは、葉Ｌ＃（０ｘ５Ａ）の構造体の照合／置換テーブルＴへのポインタｐ３により、当該ポインタｐ３のレコードと圧縮符号“０１０１００１１０１１０”とを照合する。この場合、前方一致となるため、ポインタｐ３のレコードの指定中フラグをＯＮ（０⇒１）にする。
【０３３２】
また、葉Ｌ＃（０ｘ５Ａ）の構造体には、圧縮符号長ｌｅｇ（＝１２ビット）も格納されているため、コンピュータは、圧縮符号長ｌｅｇも抽出する。コンピュータは、この抽出された圧縮符号長ｌｅｇによりビットアドレスａｂｉを更新する。この場合、更新後のビットアドレスａｂｉはａｂｉ＝０＋１２＝１２となる。
【０３３３】
図６７は、図６６に示した（Ａ）の状態からレジスタをバイトオフセットｂｙｏｓ分シフトした場合の伸長処理（（Ｂ）の状態）を示している。前回である（Ａ）のビットアドレスａｂｉはａｂｉ＝０、圧縮符号長ｌｅｇは１２ビットであるため、（Ｂ）のビットアドレスａｂｉはａｂｉ＝１２ビットとなる。
【０３３４】
また、このビットアドレスａｂｉ＝１２により、バイトオフセットｂｙｏｓ＝１、ビットオフセットｂｉｏｓ＝４となる。バイトオフセットｂｙｏｓ＝１により、コンピュータは、メモリに保持されている圧縮符号列のうち先頭１バイト目から４バイト分（図中、網掛け）の圧縮符号列をレジスタｒ２にセットする。
【０３３５】
また、ビットオフセットｂｉｏｓ＝４により、マスクパターンは、“０ｘ０ＦＦＦ８０００”であり、レジスタｒ２にセットされる。したがって、レジスタｒ１にセットされた圧縮符号列とレジスタｒ２にセットされたマスクパターン“０ｘ０ＦＦＦ８０００”を論理積（ＡＮＤ）演算することにより、レジスタｒ２においてＡＮＤ結果が得られる。
【０３３６】
また、ビットオフセットｂｉｏｓ＝４により、レジスタシフト数ｒｓは、ｒｓ＝３２−ｍ―ｂｉｏｓ＝３２−１３−４＝１５となる。したがって、コンピュータは、レジスタｒ２内のＡＮＤ結果を末尾方向に１５ビット分シフトする。このシフトによりレジスタｒ２には、“０００００１０１００１１０１１００”が残されるため、コンピュータは、末尾１３ビットを対象ビット列として抽出する。この場合は、“０１０１００１１０１１００”が対象ビット列として抽出される。抽出後、レジスタｒ２はクリアされる。
【０３３７】
図２８に示したように、２N分枝無節点ハフマン木の根の構造体には、葉Ｌ１〜Ｌ５４０１へのポインタが格納されている。したがって、コンピュータは、２N分枝無節点ハフマン木の根の構造体の中から、抽出された対象ビット列“０１０１００１１０１１００”と一致する葉Ｌ♯へのポインタを探索する。この場合、対象ビット列“０１０１００１１０１１００”が葉Ｌ＃（０ｘ５Ａ）へのポインタ群の中の１つと一致するため、コンピュータは、該当する葉Ｌ＃（０ｘ５Ａ）へのポインタを読み出して、葉Ｌ＃（０ｘ５Ａ）の構造体にアクセスする。
【０３３８】
葉Ｌ＃（０ｘ５Ａ）の構造体には、分割文字コード「０ｘ５Ａ」へのポインタが格納されているため、コンピュータは、分割文字コードの構造体６００の中から、分割文字コード“０ｘ５Ａ”へのポインタで分割文字コード「０ｘ５Ａ」を指定して、読み出す。
【０３３９】
また、アクセス先となる葉Ｌ＃（０ｘ５Ａ）の構造体においては、対象ビット列“０１０１００１１０１１００”のうち先頭１２ビットの圧縮符号“０１０１００１１０１１０”が格納されている。したがって、コンピュータは、照合／置換テーブルＴのうち指定中フラグがＯＮになっているレコード、ここでは、ポインタｐ３のレコードと圧縮符号“０１０１００１１０１１０”とを照合する。この照合は、指定中フラグがＯＮのため、後方一致照合をおこなう。そして、後方一致するため、ポインタｐ３のレコードの置換文字列「＜ｃｏｌｏｒ＞婚＜／ｃｏｌｏｒ＞」を伸長バッファ６６００に書き出す。このあと、コンピュータは指定中フラグを０に戻す。
【０３４０】
また、葉Ｌ＃（０ｘ５Ａ）の構造体には、圧縮符号長ｌｅｇ（＝１２ビット）も格納されているため、コンピュータは、圧縮符号長ｌｅｇも抽出する。コンピュータは、この抽出された圧縮符号長ｌｅｇによりビットアドレスａｂｉを更新する。この場合、更新後のビットアドレスａｂｉはａｂｉ＝１２＋１２＝２４となる。
【０３４１】
図６８は、図６７に示した（Ｂ）の状態からレジスタをバイトオフセットｂｙｏｓ分シフトした場合の伸長処理（（Ｃ）の状態）を示している。前回である（Ｂ）のビットアドレスａｂｉはａｂｉ＝１２、圧縮符号長ｌｅｇは１２ビットであるため、（Ｃ）のビットアドレスａｂｉはａｂｉ＝２４ビットとなる。
【０３４２】
また、このビットアドレスａｂｉ＝２４により、バイトオフセットｂｙｏｓ＝３、ビットオフセットｂｉｏｓ＝０となる。バイトオフセットｂｙｏｓ＝３により、メモリに保持されている圧縮符号列のうち先頭３バイト目から４バイト分（図中、網掛け）の圧縮符号列をレジスタｒ１にセットする。
【０３４３】
また、ビットオフセットｂｉｏｓ＝０により、マスクパターンは、“０ｘＦＦＦ８００００”であり、レジスタｒ２にセットされる。したがって、レジスタｒ１にセットされた圧縮符号列とレジスタｒ２にセットされたマスクパターン“０ｘＦＦＦ８００００”を論理積（ＡＮＤ）演算することにより、レジスタｒ２においてＡＮＤ結果が得られる。
【０３４４】
また、ビットオフセットｂｉｏｓ＝０により、レジスタシフト数ｒｓは、ｒｓ＝３２−ｍ―ｂｉｏｓ＝３２−１３−０＝１９となる。したがって、コンピュータは、レジスタｒ２内のＡＮＤ結果を末尾方向に１９ビット分シフトする。このシフトによりレジスタｒ２には、“００１１１００１０００１１”が残されるため、末尾１３ビットを対象ビット列として抽出する。この場合は、“００１１１００１０００１１”が対象ビット列として抽出される。抽出後、レジスタｒ２はクリアされる。
【０３４５】
図２８に示したように、２N分枝無節点ハフマン木の根の構造体には、葉Ｌ１〜Ｌ５４０１へのポインタが格納されている。したがって、コンピュータは、２N分枝無節点ハフマン木の根の構造体セルの中から、抽出された対象ビット列“００１１１００１０００１１”と一致する葉Ｌ♯へのポインタを探索する。この場合、対象ビット列“００１１１００１０００１１”が葉Ｌ＃（活）へのポインタ群の中の１つと一致するため、コンピュータは、該当する葉Ｌ＃（活）へのポインタを読み出して、葉Ｌ＃（活）の構造体にアクセスする。
【０３４６】
葉Ｌ＃（活）の構造体には、高位文字「活」へのポインタが格納されているため、コンピュータは、高位文字コードの構造体５００の中から、高位文字「活」へのポインタで高位文字「活」を指定して、読み出す。
【０３４７】
また、アクセス先となる葉Ｌ＃（活）の構造体においては、対象ビット列“００１１１００１０００１１”のうち先頭９ビットの圧縮符号“００１１１００１０”が格納されている。また、葉Ｌ＃（活）の構造体の照合フラグがＯＮであるため、コンピュータは、葉Ｌ＃（活）の構造体の照合／置換テーブルＴへのポインタｐ４により、当該ポインタｐ４のレコードと圧縮符号“００１１１００１０”とを照合する。この場合、完全一致となるため、ポインタｐ４のレコードの置換文字列「＜ｃｏｌｏｒ＞活＜／ｃｏｌｏｒ＞」を伸長バッファ６６００に書き出す。
【０３４８】
また、葉Ｌ＃（活）の構造体には、圧縮符号長ｌｅｇ（＝９ビット）も格納されているため、コンピュータは、圧縮符号長ｌｅｇも抽出する。コンピュータは、この抽出された圧縮符号長ｌｅｇによりビットアドレスａｂｉを更新する。この場合、更新後のビットアドレスａｂｉはａｂｉ＝２４＋９＝３３となる。
【０３４９】
図６９は、図６８に示した（Ｃ）の状態からレジスタをバイトオフセットｂｙｏｓ分シフトした場合の伸長処理（（Ｄ）の状態）を示している。前回である（Ｃ）のビットアドレスａｂｉはａｂｉ＝２４、圧縮符号長ｌｅｇは９ビットであるため、（Ｄ）のビットアドレスａｂｉはａｂｉ＝３３ビットとなる。
【０３５０】
また、このビットアドレスａｂｉ＝３３により、バイトオフセットｂｙｏｓ＝４、ビットオフセットｂｉｏｓ＝１となる。バイトオフセットｂｙｏｓ＝４により、コンピュータは、メモリに保持されている圧縮符号列のうち先頭４バイト目から４バイト分（図中、網掛け）の圧縮符号列をレジスタｒ１にセットする。
【０３５１】
また、ビットオフセットｂｉｏｓ＝１により、マスクパターンは、“０ｘ０７ＦＦＣ０００”であり、レジスタｒ２にセットされる。したがって、レジスタｒ１にセットされた圧縮符号列とレジスタｒ２にセットされたマスクパターン“０ｘ０７ＦＦＣ０００”を論理積（ＡＮＤ）演算することにより、ＡＮＤ結果が得られる。
【０３５２】
また、ビットオフセットｂｉｏｓ＝１により、レジスタシフト数ｒｓは、ｒｓ＝３２−ｍ―ｂｉｏｓ＝３２−１３−１＝１８となる。したがって、コンピュータは、レジスタｒ２内のＡＮＤ結果を末尾方向に１８ビット分シフトする。このシフトによりレジスタｒ２には、“０００１１１００１１０１０１”が残されるため、コンピュータは、末尾１３ビットを対象ビット列として抽出する。この場合は、“００１１１００１１０１０１”が対象ビット列として抽出される。抽出後、レジスタｒ２はクリアされる。
【０３５３】
図２８に示したように、２N分枝無節点ハフマン木の根の構造体には、葉Ｌ１〜Ｌ５４０１へのポインタが格納されている。したがって、コンピュータは、２N分枝無節点ハフマン木の根の構造体の中から、抽出された対象ビット列“００１１１００１１０１０１”と一致する葉Ｌ♯へのポインタを探索する。この場合、対象ビット列“００１１１００１１０１０１”が葉Ｌ＃（は）へのポインタ群の中の一つと一致するため、葉Ｌ＃（は）へのポインタを読み出して、葉Ｌ＃（は）の構造体にアクセスする。
【０３５４】
葉Ｌ＃（は）の構造体には、高位文字「は」へのポインタが格納されているため、コンピュータは、高位文字コードの構造体５００の中から、高位文字「は」へのポインタで高位文字「は」を指定して、読み出す。
【０３５５】
また、アクセス先となる葉Ｌ＃（は）の構造体においては、対象ビット列“００１１１００１１０１０１”のうち先頭９ビットの圧縮符号“００１１１００１１”が格納されている。また、葉Ｌ＃（は）の構造体の照合フラグがＯＦＦであるため、コンピュータは、照合／置換テーブルＴを参照しない。したがって、コンピュータは、高位文字コードの構造体５００から読み出された高位文字「は」を伸長バッファ６６００に書き出す。
【０３５６】
また、葉Ｌ＃（は）の構造体には、圧縮符号長ｌｅｇ（＝９ビット）も格納されているため、コンピュータは、圧縮符号長ｌｅｇも抽出する。コンピュータは、この抽出された圧縮符号長ｌｅｇによりビットアドレスａｂｉを更新する。この場合、更新後のビットアドレスａｂｉはａｂｉ＝３３＋９＝４２となる。
【０３５７】
図７０は、図６９に示した（Ｄ）の状態からレジスタをバイトオフセットｂｙｏｓ分シフトした場合の伸長処理（（Ｅ）の状態）を示している。前回である（Ｄ）のビットアドレスａｂｉはａｂｉ＝３３、圧縮符号長ｌｅｇは９ビットであるため、（Ｅ）のビットアドレスａｂｉはａｂｉ＝４２ビットとなる。
【０３５８】
また、このビットアドレスａｂｉ＝４２により、バイトオフセットｂｙｏｓ＝５、ビットオフセットｂｉｏｓ＝２となる。バイトオフセットｂｙｏｓ＝５により、コンピュータは、メモリに保持されている圧縮符号列のうち先頭５バイト目から４バイト分（図中、網掛け）の圧縮符号列をレジスタｒ１にセットする。
【０３５９】
また、ビットオフセットｂｉｏｓ＝２により、マスクパターンは、“０ｘ３ＦＦＥ００００”であり、レジスタｒ２にセットされる。したがって、レジスタｒ１にセットされた圧縮符号列とレジスタｒ２にセットされたマスクパターン“０ｘ３ＦＦＥ００００”を論理積（ＡＮＤ）演算することにより、ＡＮＤ結果が得られる。
【０３６０】
また、ビットオフセットｂｉｏｓ＝２により、レジスタシフト数ｒｓは、ｒｓ＝３２−ｍ―ｂｉｏｓ＝３２−１３−２＝１７となる。したがって、コンピュータは、レジスタｒ２内のＡＮＤ結果を末尾方向に１７ビット分シフトする。このシフトによりレジスタｒ２には、“０００１０１００１００００００”が残されるため、コンピュータは、末尾１３ビットを対象ビット列として抽出する。この場合は、“０１０１００１００００００”が対象ビット列として抽出される。抽出後、レジスタｒ２はクリアされる。
【０３６１】
図２８に示したように、２N分枝無節点ハフマン木の根の構造体には、葉Ｌ１〜Ｌ５４０１へのポインタが格納されている。したがって、コンピュータは、２N分枝無節点ハフマン木の根の構造体の中から、抽出された対象ビット列“０１０１００１００００００”と一致する葉Ｌ♯へのポインタを探索する。この場合、対象ビット列“０１０１００１００００００”が葉Ｌ＃（結婚）へのポインタと一致するため、コンピュータは、葉Ｌ（結婚）へのポインタを読み出して、葉Ｌ（結婚）の構造体にアクセスする。
【０３６２】
葉Ｌ＃（結婚）の構造体には、基礎単語「結婚」へのポインタが格納されているため、コンピュータは、特殊単語の構造体１００の中から、基礎単語「結婚」へのポインタで基礎単語「結婚」を指定して、読み出す。
【０３６３】
また、アクセス先となる葉Ｌ＃（結婚）の構造体においては、対象ビット列“０１０１００１００００００”のうち先頭１３ビットの圧縮符号“０１０１００１００００００”が格納されている。また、葉Ｌ＃（結婚）の構造体の照合フラグがＯＮであるため、コンピュータは、葉Ｌ＃（結婚）の構造体の照合／置換テーブルＴへのポインタｐ２により、当該ポインタｐ２のレコードと圧縮符号“０１０１００１００００００”とを照合する。この場合、前方一致となるため、ポインタｐ２のレコードの指定中フラグをＯＮ（０⇒１）にする。
【０３６４】
また、葉Ｌ＃（結婚）の構造体には、圧縮符号長ｌｅｇ（＝１３ビット）も格納されているため、コンピュータは、圧縮符号長ｌｅｇも抽出する。コンピュータは、この抽出された圧縮符号長ｌｅｇによりビットアドレスａｂｉを更新する。この場合、更新後のビットアドレスａｂｉはａｂｉ＝４２＋１３＝５５となる。
【０３６５】
図７１は、図７０に示した（Ｅ）の状態からレジスタをバイトオフセットｂｙｏｓ分シフトした場合の伸長処理（（Ｆ）の状態）を示している。前回である（Ｅ）のビットアドレスａｂｉはａｂｉ＝４２、圧縮符号長ｌｅｇは１３ビットであるため、（Ｆ）のビットアドレスａｂｉはａｂｉ＝５５ビットとなる。
【０３６６】
また、このビットアドレスａｂｉ＝５５により、バイトオフセットｂｙｏｓ＝６、ビットオフセットｂｉｏｓ＝７となる。バイトオフセットｂｙｏｓ＝６により、コンピュータは、メモリに保持されている圧縮符号列のうち先頭６バイト目から４バイト分（図中、網掛け）の圧縮符号列をレジスタｒ１にセットする。
【０３６７】
また、ビットオフセットｂｉｏｓ＝７により、マスクパターンは、“０ｘ０１ＦＦＦ０００”であり、レジスタｒ２にセットされる。したがって、レジスタｒ１にセットされた圧縮符号列とレジスタｒ２にセットされたマスクパターン“０ｘ０１ＦＦＦ０００”を論理積（ＡＮＤ）演算することにより、ＡＮＤ結果が得られる。
【０３６８】
また、ビットオフセットｂｉｏｓ＝７により、レジスタシフト数ｒｓは、ｒｓ＝３２−ｍ―ｂｉｏｓ＝３２−１３−７＝１２となる。したがって、コンピュータは、レジスタｒ２内のＡＮＤ結果を末尾方向に１２ビット分シフトする。このシフトによりレジスタｒ２には、“００００００００１０１００１００００１０”が残されるため、コンピュータは、末尾１３ビットを対象ビット列として抽出する。この場合は、“０１０１００１００００１０”が対象ビット列として抽出される。抽出後、レジスタｒ２はクリアされる。
【０３６９】
図２８に示したように、２N分枝無節点ハフマン木の根の構造体には、葉Ｌ１〜Ｌ５４０１へのポインタが格納されている。したがって、コンピュータは、２N分枝無節点ハフマン木の根の構造体の中から、抽出された対象ビット列“０１０１００１００００１０”と一致する葉Ｌ♯へのポインタを探索する。この場合、対象ビット列“０１０１００１００００１０”が葉Ｌ＃（活動）へのポインタと一致するため、コンピュータは、葉Ｌ（活動）へのポインタを読み出して、葉Ｌ（活動）の構造体にアクセスする。
【０３７０】
葉Ｌ＃（活動）の構造体には、基礎単語「活動」へのポインタが格納されているため、コンピュータは、特殊単語の構造体１００の中から、基礎単語「活動」へのポインタで基礎単語「活動」を指定して、読み出す。
【０３７１】
また、アクセス先となる葉Ｌ＃（活動）の構造体においては、対象ビット列“０１０１００１００００１０”のうち先頭１３ビットの圧縮符号“０１０１００１００００１０”が格納されている。したがって、コンピュータは、照合／置換テーブルＴのうち指定中フラグがＯＮになっているレコード、ここでは、ポインタｐ２のレコードと圧縮符号“０１０１００１００００１０”とを照合する。この照合は、指定中フラグがＯＮのため、後方一致照合をおこなう。そして、後方一致するため、ポインタｐ２のレコードの置換文字列「結＜ｃｏｌｏｒ＞婚活＜／ｃｏｌｏｒ＞動」を伸長バッファ６６００に書き出す。このあと、コンピュータは指定中フラグを０に戻す。
【０３７２】
また、葉Ｌ＃（活動）の構造体には、圧縮符号長ｌｅｇ（＝１３ビット）も格納されているため、コンピュータは、圧縮符号長ｌｅｇも抽出する。コンピュータは、この抽出された圧縮符号長ｌｅｇによりビットアドレスａｂｉを更新する。この場合、更新後のビットアドレスａｂｉはａｂｉ＝５５＋１３＝６８となる。したがって、圧縮符号列がなくなるまで、伸長処理を継続することとなる。
【０３７３】
このように、葉へのポインタには圧縮符号が含まれているため、いずれの葉へのポインタが抽出された場合であっても、圧縮符号を特定するまでもなく、直接葉の構造体にアクセスすることができる。したがって、伸長処理の高速化を実現することができる。
【０３７４】
＜機能的構成＞
図７２は、本実施の形態にかかるコンピュータの機能的構成例（その２）を示すブロック図である。コンピュータは、入力部７２００と、第１の検索部７２０１と、第２の検索部７２０２と、抽出部７２０３と、作成部７２０４と、判定部７２０５と、伸長部７２０６と、を備える。入力部７２００〜伸長部７２０６は、具体的には、たとえば、図３４に示したＲＯＭ３４０２、ＲＡＭ３４０３、磁気ディスク３４０５、光ディスク３４０７などの記憶装置に記憶されたプログラムをＣＰＵ３４０１に実行させることにより、その機能を実現する。なお、図７２で機能的構成として示したコンピュータは、図３５において機能的構成として示したコンピュータと同一コンピュータでもよく、異なるコンピュータでもよい。
【０３７５】
入力部７２００は、２個以上の文字からなる検索文字列の入力を受け付ける。具体的には、出現頻度にかかわらず、たとえば、２連続文字の入力を受け付ける。たとえば、ユーザが入力装置（キーボードやマウス、タッチパッド）を操作することで、入力部７２００は、２個の文字からなる検索文字列の入力を受け付ける。なお、２連続文字のほか、３連続以上の文字列でもよい。
【０３７６】
第１の検索部７２０１は、入力部７２００によって入力された検索文字列をデータベース７２１０から検索する。データベース７２１０とは、上述した特殊単語の構造体１００、高位文字コードの構造体５００、分割文字コードの構造体６００からなるデータ構造体である。第１の検索部７２０１は、具体的には、たとえば、特殊単語の構造体１００から検索文字列を検索する。
【０３７７】
第２の検索部７２０２は、第１の検索部７２０１によって検索されなかった場合、検索文字列の先頭文字を末尾文字とする先行単語と、検索文字列の末尾文字を先頭文字とする後続単語と、をデータベース７２１０の単語の集合から検索する。データベース７２１０の単語の集合とは、特殊単語の構造体１００である。
【０３７８】
第２の検索部７２０２は、検索文字列がたとえば「婚活」である場合、「婚活」の先頭文字「婚」を末尾文字とする単語、たとえば、「結婚」、「離婚」といった単語を先行単語として検索する。また、第２の検索部７２０２は、検索文字列「婚活」の末尾文字「活」を先頭文字とする単語、たとえば、「活動」、「活用」といった単語を後続単語として検索する。
【０３７９】
抽出部７２０３は、第２の検索部７２０２によって先行単語および後続単語が検索された場合、２N分枝無節点ハフマン木Ｈのうち先行単語の圧縮符号を先行単語に関連付けされた葉から抽出する。上記の例では、抽出部７２０３は、先行単語「結婚」の圧縮符号を、当該圧縮符号を格納する葉Ｌ＃（結婚）の構造体から抽出する。同様に、後続単語「活動」の圧縮符号を、当該圧縮符号を格納する葉Ｌ＃（活動）の構造体から抽出する。
【０３８０】
作成部７２０４は、先行単語の圧縮符号と後続単語の圧縮符号とを連結させた連結圧縮符号と、先行単語および後続単語からなりかつ先行単語の末尾文字と後続単語の先頭文字とを特徴付ける情報を埋め込んだ置換文字列と、を関連付けて記憶するテーブルを作成する。テーブルとは、照合／置換テーブルＴである。上記の例では、作成部７２０４は、先行単語「結婚」の圧縮符号と後続単語「活動」の圧縮符号を連結した連結圧縮符号を生成する（図４の照合／置換テーブルＴ４のポインタｐ２のレコードを参照）。
【０３８１】
また、作成部７２０４は、先行単語および後続単語からなりかつ先行単語の末尾文字と後続単語の先頭文字とを特徴付ける情報を埋め込んだ置換文字列を生成する。上記の例では、先行単語「結婚」と後続単語「活動」からなり、先行単語の末尾文字「婚」と後続単語の先頭文字「活」とを特徴付ける情報を埋め込んだ置換文字列を生成する。特徴付ける情報とは、たとえば、先行単語の末尾文字と後続単語の先頭文字の色を変更したり、その背景を変更したり、フォントを変更したりするタグである。そして、作成部７２０４は、連結圧縮符号と置換文字列とを関連付けて照合／置換テーブルＴに格納する図４の照合／置換テーブルＴ４のポインタｐ２のレコードを参照）。
【０３８２】
判定部７２０５は、圧縮ファイルｆｉ内の圧縮符号列が作成部７２０４によって作成されたテーブル内の連結圧縮符号と一致するか否かを判定する。具体的には、たとえば、判定部７２０５は、圧縮ファイルｆｉ内の圧縮符号列が作成部７２０４によって作成された照合／置換テーブルＴ内の連結圧縮符号と一致するか否かを判定する。
【０３８３】
伸長部７２０６は、判定部７２０５によって一致すると判定された場合、連結圧縮符号に関連付けられた置換文字列を伸長先に書き出す。具体的には、伸長部７２０６は、判定部７２０５によって一致すると判定された場合、先行単語「結婚」と後続単語「活動」との連結圧縮符号に関連付けられた置換文字列「結＜ｃｏｌｏｒ＞婚活＜／ｃｏｌｏｒ＞動」を伸長先となる伸長バッファに書き出すこととなる。
【０３８４】
＜検索処理手順＞
図７３は、本実施の形態にかかる検索処理手順を示すフローチャートである。まず、コンピュータは、検索文字列の入力を待ち受け（ステップＳ７３０１：Ｎｏ）、検索文字列が入力された場合（ステップＳ７３０１：Ｙｅｓ）、ファイル絞込み処理（ステップＳ７３０２）、照合／置換テーブルＴ作成処理（ステップＳ７３０３）、伸長処理（ステップＳ７３０４）を実行する。ファイル絞込み処理（ステップＳ７３０２）は、圧縮ファイル群Ｆｓの中から検索文字列を構成する文字情報が存在する対象ファイルの圧縮ファイルを絞り込む。ファイル絞込み処理（ステップＳ７３０２）の詳細については、図７４および図７５で後述する。
【０３８５】
照合／置換テーブルＴ作成処理（ステップＳ７３０３）は、図１〜図１１に示したように、照合／置換テーブルＴを作成する。照合／置換テーブルＴ作成処理（ステップＳ７３０３）の詳細については、図７６で後述する。伸長処理（ステップＳ７３０４）は、ファイル絞込み処理（ステップＳ７３０２）で絞り込まれた圧縮ファイルを伸長する過程で、照合／置換テーブルＴ作成処理（ステップＳ７３０３）で作成された照合／置換テーブルＴを用いて、伸長対象となる圧縮符号列と検索文字列の圧縮文字列とを照合する。伸長処理（ステップＳ７３０４）については、図８２で後述する。
【０３８６】
図７４は、図７３に示したファイル絞込み処理（ステップＳ７３０２）の詳細な処理手順を示すフローチャート（その１）である。まず、コンピュータは、検索文字列を対象文字列に設定し（ステップＳ７４０１）、最長一致検索処理を実行する（ステップＳ７４０２）。最長一致検索処理（ステップＳ７４０２）は、図４３に示した最長一致検索処理（ステップＳ４３０１）と同一処理であるため説明を省略する。
【０３８７】
そして、コンピュータは、特殊単語の構造体１００において、最長一致検索処理（ステップＳ７４０２）で得られた最長一致検索結果を２分探索する（ステップＳ７４０３）。最長一致検索結果が、特殊単語の構造体１００で探索された場合（ステップＳ７４０３：Ｙｅｓ）、対象文字列である特殊単語について、その特殊単語の出現マップを特殊単語の出現マップ群から取得する（ステップＳ７４０４）。
【０３８８】
そして、コンピュータは、対象文字列に後続があるか否かを判断する（ステップＳ７４０５）。後続がある場合（ステップＳ７４０５：Ｙｅｓ）、コンピュータは、後続文字列を対象文字列に設定して（ステップＳ７４０６）、最長一致検索処理（ステップＳ７４０２）に戻る。一方、後続がない場合（ステップＳ７４０５：Ｎｏ）、これまでに取得された出現マップ群のＡＮＤ演算で対象ファイルを絞り込む（ステップＳ７４０７）。これにより、ファイル絞込み処理（ステップＳ７３０２）は終了し、照合／置換テーブルＴ作成処理（ステップＳ７３０３）に移行する。
【０３８９】
また、ステップＳ７４０３において、最長一致検索結果が、特殊単語の構造体１００で探索されなかった場合（ステップＳ７４０３：Ｎｏ）、図７５のステップＳ７５０１に移行する。具体的には、最長一致検索結果が特殊単語の構造体１００に登録されていない場合、または、最長一致検索で最長一致候補がなかった場合（ステップＳ４４１０：Ｎｏ）に、図７５のステップＳ７５０１に移行する。
【０３９０】
図７５は、図７３に示したファイル絞込み処理（ステップＳ７３０２）の詳細な処理手順を示すフローチャート（その２）である。図７５では、対象文字列を構成する文字ごとに、出現マップを取得する処理である。
【０３９１】
まず、コンピュータは、対象文字列の先頭文字を対象文字に設定する（ステップＳ７５０１）。つぎに、コンピュータは、高位文字コードの構造体５００において対象文字を２分探索する（ステップＳ７５０２）。対象文字が探索された場合（ステップＳ７５０３：Ｙｅｓ）、コンピュータは、高位文字の出現マップ群から対象文字の出現マップを取得する（ステップＳ７５０４）。そして、図７４のステップＳ７４０５に戻る。
【０３９２】
一方、ステップＳ７５０３において、探索されなかった場合（ステップＳ７５０３：Ｎｏ）、コンピュータは、対象文字を上位８ビットと下位８ビットに分割する（ステップＳ７５０５）。そして、コンピュータは、分割文字コードの出現マップ群の中から上位分割文字コードの出現マップを取得する（ステップＳ７５０６）。
【０３９３】
また、コンピュータは、分割文字コードの出現マップ群の中から下位分割文字コードの出現マップを取得する（ステップＳ７５０７）。そして、図７４のステップＳ７４０５に戻る。このように、図７５に示した処理手順により、対象文字についての出現マップを取得することができる。したがって、図７４のステップＳ７４０７でのＡＮＤ演算により圧縮ファイルの絞込みができることとなる。
【０３９４】
図７６は、図７３に示した照合／置換テーブルＴ作成処理（ステップＳ７３０３）の詳細な処理手順を示すフローチャートである。まず、コンピュータは、検索文字列を対象文字列に設定し（ステップＳ７６０１）、対象文字列が１文字であるか否かを判断する（ステップＳ７６０２）。１文字である場合（ステップＳ７６０２：Ｙｅｓ）、文字コード設定処理（ステップＳ７６０８）に移行する。一方、１文字でない場合（ステップＳ７６０２：Ｎｏ）、コンピュータは、特殊単語設定処理を実行する（ステップＳ７６０３）。特殊単語設定処理（ステップＳ７６０３）では、たとえば、図９に示したような照合／置換テーブルＴ１を作成する処理である。特殊単語設定処理（ステップＳ７６０３）の詳細については図７７で後述する。
【０３９５】
特殊単語設定処理（ステップＳ７６０３）では最長一致検索を実行するため、対象文字列の中に特殊単語が含まれているか否かが判別される。そして、コンピュータは、特殊単語設定処理（ステップＳ７６０３）において、特殊単語があったか否かを判断する（ステップＳ７６０４）。特殊単語があった場合（ステップＳ７６０４：Ｙｅｓ）、コンピュータは、対象文字列に後続があるか否かを判断する（ステップＳ７６０５）。
【０３９６】
後続がある場合（ステップＳ７６０５：Ｙｅｓ）、コンピュータは、後続文字列を対象文字列に設定し（ステップＳ７６０６）、ステップＳ７６０２に戻る。一方、後続がない場合（ステップＳ７６０５：Ｎｏ）、照合／置換テーブルＴ作成処理（ステップＳ７３０３）を終了し、伸長処理（ステップＳ７３０４）に移行する。
【０３９７】
また、ステップＳ７６０４において、特殊単語設定処理（ステップＳ７６０３）で特殊単語がなかった場合（ステップＳ７６０４：Ｎｏ）、コンピュータは、非特殊単語設定処理を実行する（ステップＳ７６０７）。非特殊単語設定処理（ステップＳ７６０７）は、たとえば、図２に示したように照合／置換テーブルＴ０から照合／置換テーブルＴ１を作成し、図３および図４に示したように、さらに照合／置換テーブルＴ１から照合／置換テーブルＴ４を作成する処理手順である。非特殊単語設定処理（ステップＳ７６０７）の詳細については図７８および図７９で後述する。
【０３９８】
そして、コンピュータは、文字コード設定処理を実行する（ステップＳ７６０８）。文字コード設定処理（ステップＳ７６０８）は、たとえば、検索文字列に含まれている高位文字について、図８に示した照合／置換テーブルＴ６のポインタｐ４のレコードや、図１０に示した照合／置換テーブルＴ２のポインタｐ２のレコードを作成する処理である。文字コード設定処理（ステップＳ７６０８）については図８０で後述する。
【０３９９】
図７７は、図７６に示した特殊単語設定処理（ステップＳ７６０３）の詳細な処理手順を示すフローチャートである。まず、コンピュータは、対象文字列に対し最長一致検索処理を実行する（ステップＳ７７０１）。最長一致検索処理（ステップＳ７７０１）は、最長一致検索処理（ステップＳ４３０１、Ｓ７４０２）と同一処理であるため、説明を省略する。
【０４００】
つぎに、コンピュータは、特殊単語の構造体１００において、最長一致検索された特殊単語を２分探索する（ステップＳ７７０２）。探索されなかった場合（ステップＳ７７０２：Ｎｏ）、図７６のステップＳ７６０４に移行する。最長一致検索処理（ステップＳ７７０１）で特殊単語が得られなかった場合も、図７６のステップＳ７６０４に移行する。
【０４０１】
一方、探索された場合（ステップＳ７７０２：Ｙｅｓ）、コンピュータは、特殊単語の構造体１００の葉へのポインタにより、探索特殊単語の葉の構造体を指定する（ステップＳ７７０３）。そして、コンピュータは、指定先である探索特殊単語の葉の構造体内の照合フラグをＯＮにする（ステップＳ７７０４）。つぎに、コンピュータは、照合／置換テーブルＴの空きポインタを検出して、検出された空きポインタを照合／置換テーブルＴへのポインタとして探索特殊単語の葉の構造体内に設定する（ステップＳ７７０５）。
【０４０２】
そして、コンピュータは、照合／置換テーブルＴにおいて、照合／置換テーブルＴへのポインタとして探索特殊単語の葉の構造体内に設定された空きポインタのレコードに、探索特殊単語の圧縮符号長、圧縮符号、置換文字列を設定する（ステップＳ７７０６）。このあと、図７６のステップＳ７６０４に移行する。図７７に示した特殊単語設定処理（ステップＳ７６０３）では、図９に示したような照合／置換テーブルＴ１を作成することができる。
【０４０３】
図７８は、図７６に示した非特殊単語設定処理（ステップＳ７６０７）の詳細な処理手順を示すフローチャート（その１）である。図７８の処理手順は、図２に示したように、たとえば、照合／置換テーブルＴ１を作成する処理手順である。
【０４０４】
コンピュータは、特殊単語の構造体１００において、対象文字列と末尾文字が一致する特殊単語を２分探索する（ステップＳ７８０１）。探索された場合（ステップＳ７８０２：Ｙｅｓ）、コンピュータは、特殊単語の構造体１００の葉へのポインタにより、探索特殊単語の葉の構造体を指定する（ステップＳ７８０３）。そして、コンピュータは、指定先である探索特殊単語の葉の構造体内の照合フラグをＯＮにする（ステップＳ７８０４）。つぎに、コンピュータは、照合／置換テーブルＴの空きポインタを検出して、検出された空きポインタを照合／置換テーブルＴへのポインタとして探索特殊単語の葉の構造体内に設定する（ステップＳ７８０５）。
【０４０５】
そして、コンピュータは、照合／置換テーブルＴにおいて、照合／置換テーブルＴへのポインタとして探索特殊単語の葉の構造体内に設定された空きポインタのレコードに、探索特殊単語の圧縮符号長、圧縮符号、置換文字列を設定する（ステップＳ７８０６）。このあと、ステップＳ７８０２に戻り、次に探索されたか否かを判断する。
【０４０６】
ステップＳ７８０２において、探索されなかった場合（ステップＳ７８０２：Ｎｏ）、コンピュータは、特殊単語の構造体１００での探索が終了したか否かを判断する（ステップＳ７８０７）。探索が終了していない場合（ステップＳ７８０７：Ｎｏ）、ステップＳ７８０２に戻る。一方、探索が終了した場合（ステップＳ７８０７：Ｙｅｓ）、コンピュータは、対象文字列と末尾文字が一致する特殊単語があったか否かを判断する（ステップＳ７８０８）。すなわち、ステップＳ７８０３〜Ｓ７８０６を実行したか否かを判断する。
【０４０７】
対象文字列と末尾文字が一致する特殊単語があった場合（ステップＳ７８０８：Ｙｅｓ）、図７９のステップＳ７９０１に移行する。一方、対象文字列と末尾文字が一致する特殊単語がなかった場合（ステップＳ７８０８：Ｎｏ）、非特殊単語設定処理（ステップＳ７６０７）を終了し、図７６のステップＳ７６０８に移行する。このように、図７８の処理手順では、図２に示したように、照合／置換テーブルＴ１を作成することができる。
【０４０８】
図７９は、図７６に示した非特殊単語設定処理（ステップＳ７６０７）の詳細な処理手順を示すフローチャート（その２）である。図７９の処理手順は、図３や図４に示したように、たとえば、照合／置換テーブルＴ３，Ｔ４を作成する処理手順である。
【０４０９】
コンピュータは、特殊単語の構造体１００において、対象文字列と先頭文字が一致する特殊単語を２分探索する（ステップＳ７９０１）。探索された場合（ステップＳ７９０２：Ｙｅｓ）、コンピュータは、照合／置換テーブルＴの未完成レコードを空きポインタにコピーする（ステップＳ７９０３）。
【０４１０】
未完成レコードとは、図７８で設定されたレコード（たとえば、図２に示したポインタｐ１のレコード）のように、図７９での設定が完了していないレコードである。たとえば、図３の（９）に示したように、コンピュータは、照合／置換テーブルＴ１を照合／置換テーブルＴ２に更新して、ポインタｐ２のレコードを生成する。未完成レコードをコピーするのは、さらなる探索（ステップＳ７９０２）で、対象文字列と先頭文字が一致する特殊単語が探索された場合に備えるためである。
【０４１１】
つぎに、コンピュータは、特殊単語の構造体１００の葉へのポインタにより、探索特殊単語の葉の構造体を指定する（ステップＳ７９０４）。そして、コンピュータは、末尾文字が一致する特殊単語の未完成レコードごとに、先頭文字が一致する特殊単語の圧縮符号長を加算し、圧縮符号を連結し、置換文字列を更新する（ステップＳ７９０５）。たとえば、コンピュータは、図３の照合／置換テーブルＴ２のポインタｐ１のレコードを、照合／置換テーブルＴ３のポインタｐ１のレコードのように更新する。また、コンピュータは、図４の照合／置換テーブルＴ３のポインタｐ２のレコードを、照合／置換テーブルＴ４のポインタｐ２のレコードのように更新する。
【０４１２】
また、ステップＳ７９０２において、探索されなかった場合（ステップＳ７９０２：Ｎｏ）、コンピュータは、特殊単語の構造体１００の２分探索が終了したか否かを判断する（ステップＳ７９０６）。探索が終了していない場合（ステップＳ７９０６：Ｎｏ）、ステップＳ７９０２に戻る。一方、探索が終了した場合（ステップＳ７９０６：Ｙｅｓ）、コンピュータは、照合／置換テーブルＴにおいて残されている未完成レコードを消去する（ステップＳ７９０７）。そして、図７６の文字コード設定処理（ステップＳ７６０８）に移行する。このように、図７９の処理手順では、図３や図４に示したように、照合／置換テーブルＴ３、Ｔ４を作成することができる。
【０４１３】
図８０は、図７６に示した文字コード設定処理（ステップＳ７６０８）の詳細な処理手順を示すフローチャートである。まず、コンピュータは、対象文字列の先頭文字を対象文字に設定し（ステップＳ８００１）、高位文字コードの構造体５００において、対象文字を２分探索する（ステップＳ８００２）。探索された場合（ステップＳ８００３：Ｙｅｓ）、コンピュータは、高位文字コードの構造体５００の葉へのポインタにより、探索文字の葉の構造体を指定する（ステップＳ８００４）。
【０４１４】
そして、コンピュータは、指定先である探索文字の葉の構造体内の照合フラグをＯＮにする（ステップＳ８００５）。つぎに、コンピュータは、照合／置換テーブルＴの空きポインタを検出して、検出された空きポインタを照合／置換テーブルＴへのポインタとして探索文字の葉の構造体内に設定する（ステップＳ８００６）。
【０４１５】
そして、コンピュータは、照合／置換テーブルＴにおいて、照合／置換テーブルＴへのポインタとして探索文字の葉の構造体内に設定された空きポインタのレコードに、探索文字の圧縮符号長、圧縮符号、置換文字列を設定する（ステップＳ８００７）。このあと、図７６のステップＳ７６０５に移行する。
【０４１６】
一方、ステップＳ８００３において、探索されなかった場合（ステップＳ８００３：Ｎｏ）、分割文字コード設定処理を実行して（ステップＳ８００８）、図７６のステップＳ７６０５に移行する。このように、図８０に示した文字コード設定処理（ステップＳ７６０８）では、検索文字列に含まれている高位文字について、図８に示した照合／置換テーブルＴ６のポインタｐ４のレコードや、図１０に示した照合／置換テーブルＴ２のポインタｐ２のレコードを作成することができる。
【０４１７】
図８１は、図８０に示した分割文字コード設定処理（ステップＳ８００８）の詳細を示すフローチャートである。分割文字コード設定処理（ステップＳ８００８）は、検索対象文字列に含まれている分割文字コードについて、図６に示した照合／置換テーブルＴ４のポインタｐ３のレコードや、図７に示した照合／置換テーブルＴ５のポインタｐ３のレコード、図１０〜図１１に示した照合／置換テーブルＴ２〜Ｔ４のポインタｐ３のレコードを作成する処理である。
【０４１８】
まず、コンピュータは、対象文字を上位８ビットと下位８ビットに分割し（ステップＳ８１０１）、分割文字コードの構造体６００において、上位分割文字コードを２分探索する（ステップＳ８１０２）。そして、コンピュータは、分割文字コードの構造体６００において、探索された上位分割文字コードの葉の構造体を指定する（ステップＳ８１０３）。そして、コンピュータは、指定先となる葉の構造体内の照合フラグをＯＮにする（ステップＳ８１０４）。
【０４１９】
つぎに、コンピュータは、照合／置換テーブルＴの空きポインタを検出して、探索された上位分割文字コードの葉の構造体での照合／置換テーブルＴへのポインタとして設定する（ステップＳ８１０５）。このあと、コンピュータは、探索された上位分割文字コードの葉の構造体での照合／置換テーブルＴへのポインタとして設定された空きポインタのレコードに、上位分割文字コードの圧縮符号長、圧縮符号、置換文字列を設定する（ステップＳ８１０６）。たとえば、図６の照合／置換テーブルＴ４のポインタｐ３のレコードのように設定する。
【０４２０】
また、コンピュータは、分割文字コードの構造体６００において、下位分割文字コードを２分探索する（ステップＳ８１０７）。そして、コンピュータは、分割文字コードの構造体６００において、探索された下位分割文字コードの葉の構造体を指定する（ステップＳ８１０８）。このあと、コンピュータは、照合／置換テーブルＴにおける上位分割文字コードについて設定されたレコードに、下位分割文字コードの圧縮符号長を加算し、圧縮符号を連結し、置換文字列を更新する（ステップＳ８１０９）。
【０４２１】
たとえば、図７に示したように、照合／置換テーブルＴ４のポインタｐ３のレコードを、照合／置換テーブルＴ５のポインタｐ３のレコードのように更新する。このあと、図７６のステップＳ７６０５に移行する。このように、分割文字コード設定処理（ステップＳ８００８）によれば、分割文字コードで構成される低出現頻度の文字についても、置換文字列を生成することができる。
【０４２２】
図８２は、２N分枝無節点ハフマン木を用いた伸長処理手順を示すフローチャート（その１）である。図８２において、まず、コンピュータは、ビットアドレスａｂｉをａｂｉ＝０とし（ステップＳ８２０１）、バイトオフセットｂｙｏｓを算出し（ステップＳ８２０２）、ビットオフセットｂｉｏｓを算出する（ステップＳ８２０３）。そして、コンピュータは、バイトオフセットｂｙｏｓの位置からの圧縮符号列をレジスタｒ１にセットする（ステップＳ８２０４）。
【０４２３】
つぎに、コンピュータは、レジスタｒ２にセットされたマスクパターンをビットオフセットｂｉｏｓ分、末尾方向にシフトして（ステップＳ８２０５）、レジスタｒ１にセットされた圧縮符号列とのＡＮＤ演算をおこなう（ステップＳ８２０６）。このあと、コンピュータは、レジスタシフト数ｒｓを算出して（ステップＳ８２０７）、ＡＮＤ演算後のレジスタｒ２をレジスタシフト数ｒｓ分、末尾にシフトする（ステップＳ８２０８）。
【０４２４】
図８３は、図７３に示した２N分枝無節点ハフマン木を用いた伸長処理（ステップＳ７３０４）の詳細な処理手順を示すフローチャート（その２）である。ステップＳ８２０８のあと、図８３において、コンピュータは、シフト後のレジスタｒ２から末尾Ｎビットを対象ビット列として抽出する（ステップＳ８３０１）。つぎに、コンピュータは、２N分枝無節点ハフマン木の根の構造体から葉Ｌ♯へのポインタを特定し（ステップＳ８３０２）、ポイント先となる葉Ｌ♯の構造体に１パスでアクセスする（ステップＳ８３０３）。このあと、コンピュータは、照合置換処理を実行する（ステップＳ８３０４）。照合置換処理（ステップＳ８３０４）の詳細は、図８４で後述する。
【０４２５】
照合置換処理（ステップＳ８３０４）のあと、コンピュータは、葉Ｌ♯の構造体から圧縮符号長ｌｅｇを抽出し（ステップＳ８３０５）、ビットアドレスａｂｉを更新する（ステップＳ８３０６）。このあと、コンピュータは、メモリに圧縮符号列があるか否か、具体的には、マスクパターンによるマスク処理が施されていない圧縮符号列があるか否かを判断する（ステップＳ８３０７）。たとえば、バイトオフセットｂｙｏｓに該当するバイト位置があるか否かにより判断する。圧縮符号列がある場合（ステップＳ８３０７：Ｙｅｓ）、図８２のステップＳ８２０２に戻る。一方、圧縮符号列がない場合（ステップＳ８３０７：Ｎｏ）、伸長処理（ステップＳ７３０４）を終了する。
【０４２６】
このような伸長処理により、圧縮符号列からＮビット単位で圧縮符号を抽出することができ、さらに、２N分枝無節点ハフマン木の根の構造体にアクセスすることで、該当する枝番号となる葉Ｌ♯へのポインタを特定することができる。そして、アクセス先となる葉Ｌ♯の構造体から文字コードを抽出することで、圧縮符号を伸長する。このように、２N分枝無節点ハフマン木は、内部節点を有していないため、葉Ｌ♯へのポインタが特定されれば、１パスで葉Ｌ♯の構造体にアクセスすることができ、伸長速度の高速化を図ることができる。
【０４２７】
図８４は、図８３に示した照合置換処理（ステップＳ８３０４）の詳細な処理手順を示すフローチャートである。まず、コンピュータは、指定先となる葉の構造体内の照合フラグがＯＮであるか否かを判断する（ステップＳ８４０１）。照合フラグがＯＮである場合（ステップＳ８４０１：Ｙｅｓ）、コンピュータが、指定先となる葉の構造体内の照合／置換テーブルＴへのポインタにより、照合／置換テーブルＴの該当レコードを指定する（ステップＳ８４０２）。そして、コンピュータは、指定先となる葉の構造体内の圧縮符号長と、照合／置換テーブルＴの指定先レコードでの圧縮符号長とが一致するか否かを判断する（ステップＳ８４０３）。
【０４２８】
一致する場合（ステップＳ８４０３：Ｙｅｓ）、コンピュータは、照合／置換テーブルＴの指定先レコードにある置換文字列を伸長バッファに書き出して（ステップＳ８４０４）、ステップＳ８３０５に移行する。一方、不一致である場合（ステップＳ８４０３：Ｎｏ）、コンピュータは、指定先レコードの指定中フラグをＯＮにして（ステップＳ８４０５）、ステップＳ８３０５に移行する。なお、不一致の場合でも、照合フラグがＯＮであるため、指定先レコードの圧縮符号列と指定先となる葉の構造体内の圧縮符号とは前方一致する。
【０４２９】
また、ステップＳ８４０１において、照合フラグがＯＦＦである場合（ステップＳ８４０１：Ｎｏ）、指定中フラグがＯＮである指定先レコードが照合／置換テーブルＴにあるか否かを判断する（ステップＳ８４０６）。指定中フラグがＯＮである指定先レコードがある場合（ステップＳ８４０６：Ｙｅｓ）、コンピュータは、指定中フラグがＯＮである指定先レコードのうち、圧縮符号が後方一致する指定先レコードを特定する（ステップＳ８４０７）。
【０４３０】
そして、コンピュータは、特定された指定先レコードの置換文字列を伸長バッファに書き出して（ステップＳ８４０８）、特定された指定先レコードの指定中フラグをＯＦＦにする（ステップＳ８４０９）。これにより、図７０および図７１のように置換文字列を伸長バッファに書き出すことができる。このあと、ステップＳ８３０５に移行する。
【０４３１】
また、ステップＳ８４０６において、指定中フラグがＯＮである指定先レコードがない場合（ステップＳ８４０６：Ｎｏ）、コンピュータは、該当する文字情報の構造体から文字情報を取得し（ステップＳ８４１０）、取得した文字情報を伸長バッファに書き出す（ステップＳ８４１１）。すなわち、コンピュータは、指定先となる葉の構造体において照合フラグがＯＦＦであっても、また、葉の構造体で指定される文字情報が、高位文字、分割文字コード、特殊単語にかかわらず、伸長バッファに書き出すことができる。このあと、ステップＳ８３０５に移行する。
【０４３２】
以上説明したように、本実施の形態によれば、基礎単語として登録されていない未登録単語であっても高精度な検索をおこなうことができる。たとえば、上述したように、「婚活」について「結婚」「活動」の連結圧縮符号及び置換文字列「結婚活動」を登録しておき、圧縮符号列と連続圧縮符号が一致したら置換文字列を書出す。これにより、未登録単語「婚活」であるがゆえに「婚」と「活」に分離されてしまうといういわゆる泣き別れを防止することができ、未登録単語の検索精度の向上を図ることができる。また、このような処理により、伸長速度の向上も図ることができる。
【０４３３】
また、検索文字列を構成する高位文字について照合／置換テーブルＴを作成することにより、圧縮状態のまま圧縮符号列と検索文字列に含まれている高位文字の圧縮符号とを照合することができる。これにより、伸長しながら高位文字の置換文字列を書き出すことができる。置換文字列は検索文字列を構成する高位文字として強調表示される。このように、検索精度の向上や、検索速度および伸長速度の高速化を実現することができる。
【０４３４】
また、検索文字列を構成する低出現頻度の文字についても、分割文字コードについて照合／置換テーブルＴを作成することにより、圧縮状態のまま圧縮符号列と検索文字列に含まれている分割文字コードの圧縮符号とを照合することができる。これにより、伸長しながら低出現頻度の文字の置換文字列を書き出すことができる。置換文字列は検索文字列を構成する低出現頻度の文字として強調表示される。このように、検索精度の向上や、検索速度および伸長速度の高速化を実現することができる。
【０４３５】
また、検索文字列を構成する特殊単語について照合／置換テーブルＴを作成することにより、圧縮状態のまま圧縮符号列と検索文字列に含まれている特殊単語の圧縮符号とを照合することができる。これにより、伸長しながら低出現頻度の文字の置換文字列を書き出すことができる。置換文字列は検索文字列を構成する特殊単語として強調表示される。このように、検索精度の向上や、検索速度および伸長速度の高速化を実現することができる。
【０４３６】
また、検索文字列が基礎単語ではない場合であっても、先行する基礎単語の末尾文字と後続の基礎単語の先頭文字との２連続文字の場合においても、照合／置換テーブルＴを作成することができる。これにより、たとえば、「婚活」といった基礎単語ではない検索文字列であっても、「結＜ｃｏｌｏｒ＞婚活＜／ｃｏｌｏｒ＞用」、「結＜ｃｏｌｏｒ＞婚活＜／ｃｏｌｏｒ＞動」のように、検索文字列「婚活」を含む置換文字列を伸長して書き出すことができる。置換文字列は、タグにより「婚活」として強調表示される。このように、基礎単語にはない略語のような文字列であっても、検索精度の向上や、検索速度および伸長速度の高速化を実現することができる。
【０４３７】
また、文字情報の総種類数に応じて２N分枝無節点ハフマン木での圧縮符号長の上限長Ｎを１ビット刻みで調節することができる。したがって、文字情報の総種類数に適したサイズで２N分枝無節点ハフマン木を生成することができ、省メモリ化を図ることができる。
【０４３８】
具体的には、文字情報の総種類数が２K-1個より大きく２K個以下である場合は、上限長ＮをＫビットに決定することで、上述の補正Ａで示したように、上限長Ｋ以上の圧縮符号長の葉数は上限長Ｋの圧縮符号長の葉数に集約される。したがって、２K分枝無節点ハフマン木が生成されるため、上限符号長を（Ｋ＋１）以上とした場合の無節点ハフマン木よりもサイズを小さくすることができる。
【０４３９】
たとえば、文字情報の総種類数が２10個より大きく２11個以下である場合は、上限長Ｎを１１ビットに決定することで、２11分枝無節点ハフマン木を生成することができる。また、文字情報の総種類数が２11個より大きく２12個以下である場合は、上限長Ｎを１２ビットに決定することで、２12分枝無節点ハフマン木を生成することができる。さらに、文字情報の総種類数が２12個より大きく２13個以下である場合は、上限長Ｎを１３ビットに決定することで、２13分枝無節点ハフマン木を生成することができる。
【０４４０】
また、補正Ａでの生起確率総和がしきい値ｔ以上１以下であれば、十分な圧縮効率を見込める。したがって、補正Ａでの各圧縮符号長の葉数で２N分枝無節点ハフマン木を生成することで、生成速度の高速化を図ることができる。
【０４４１】
また、補正Ａでの生起確率総和がしきい値ｔ以上１以下でなければ、補正Ｂを実行することで、圧縮効率の向上を図ることができる。たとえば、しきい値ｔ未満であれば、補正+処理を実行することで、生起確率総和を１に漸近させることができ、圧縮効率の向上を最大限までおこなうことができる。同様に、１より大きい場合でも、補正-処理を実行することで、生起確率総和を１に漸近させることができ、圧縮効率の向上を最大限までおこなうことができる。
【０４４２】
また、圧縮符号長間で葉数のシフトをおこなうことでも、生起確率総和を１に近似させることが可能となる。いずれにしても、生起確率総和が１に近似するように各圧縮符号長の葉数を最適な葉数とすることで、圧縮効率の向上を図ることができる。
【０４４３】
上述した実施の形態では、２文字の「婚活」を検索文字列としたが、検索文字列は２文字のほか、３文字以上の場合も同じ処理によって検索結果を得ることができる。
【０４４４】
なお、本実施の形態で説明した方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本プログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本プログラムは、インターネット等のネットワークを介して配布してもよい。
【符号の説明】
【０４４５】
７２００  入力部
７２０１  第１の検索部
７２０２  第２の検索部
７２０３  抽出部
７２０４  作成部
７２０５  判定部
７２０６  伸長部
Ｔ  照合／置換テーブル
【図１】
2012117544.tif 000003
【図２】
2012117544.tif 000004
【図３】
2012117544.tif 000005
【図４】
2012117544.tif 000006
【図５】
2012117544.tif 000007
【図６】
2012117544.tif 000008
【図７】
2012117544.tif 000009
【図８】
2012117544.tif 000010
【図９】
2012117544.tif 000011
【図１０】
2012117544.tif 000012
【図１１】
2012117544.tif 000013
【図１２】
2012117544.tif 000014
【図１３】
2012117544.tif 000015
【図１４】
2012117544.tif 000016
【図１５】
2012117544.tif 000017
【図１６】
2012117544.tif 000018
【図１７】
2012117544.tif 000019
【図１８】
2012117544.tif 000020
【図１９】
2012117544.tif 000021
【図２０】
2012117544.tif 000022
【図２１】
2012117544.tif 000023
【図２２】
2012117544.tif 000024
【図２３】
2012117544.tif 000025
【図２４】
2012117544.tif 000026
【図２５】
2012117544.tif 000027
【図２６】
2012117544.tif 000028
【図２７】
2012117544.tif 000029
【図２８】
2012117544.tif 000030
【図２９】
2012117544.tif 000031
【図３０】
2012117544.tif 000032
【図３１】
2012117544.tif 000033
【図３２】
2012117544.tif 000034
【図３３】
2012117544.tif 000035
【図３４】
2012117544.tif 000036
【図３５】
2012117544.tif 000037
【図３６】
2012117544.tif 000038
【図３７】
2012117544.tif 000039
【図３８】
2012117544.tif 000040
【図３９】
2012117544.tif 000041
【図４０】
2012117544.tif 000042
【図４１】
2012117544.tif 000043
【図４２】
2012117544.tif 000044
【図４３】
2012117544.tif 000045
【図４４】
2012117544.tif 000046
【図４５】
2012117544.tif 000047
【図４６】
2012117544.tif 000048
【図４７】
2012117544.tif 000049
【図４８】
2012117544.tif 000050
【図４９】
2012117544.tif 000051
【図５０】
2012117544.tif 000052
【図５１】
2012117544.tif 000053
【図５２】
2012117544.tif 000054
【図５３】
2012117544.tif 000055
【図５４】
2012117544.tif 000056
【図５５】
2012117544.tif 000057
【図５６】
2012117544.tif 000058
【図５７】
2012117544.tif 000059
【図５８】
2012117544.tif 000060
【図５９】
2012117544.tif 000061
【図６０】
2012117544.tif 000062
【図６１】
2012117544.tif 000063
【図６２】
2012117544.tif 000064
【図６３】
2012117544.tif 000065
【図６４】
2012117544.tif 000066
【図６５】
2012117544.tif 000067
【図６６】
2012117544.tif 000068
【図６７】
2012117544.tif 000069
【図６８】
2012117544.tif 000070
【図６９】
2012117544.tif 000071
【図７０】
2012117544.tif 000072
【図７１】
2012117544.tif 000073
【図７２】
2012117544.tif 000074
【図７３】
2012117544.tif 000075
【図７４】
2012117544.tif 000076
【図７５】
2012117544.tif 000077
【図７６】
2012117544.tif 000078
【図７７】
2012117544.tif 000079
【図７８】
2012117544.tif 000080
【図７９】
2012117544.tif 000081
【図８０】
2012117544.tif 000082
【図８１】
2012117544.tif 000083
【図８２】
2012117544.tif 000084
【図８３】
2012117544.tif 000085
【図８４】
2012117544.tif 000086
【手続補正書】
【提出日】平成25年9月19日(2013.9.19)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
対象ファイルに出現する文字情報群内の各文字および２以上の文字からなる単語の生起確率に応じた圧縮符号長の圧縮符号を葉とする最大枝数２Nの２N分枝無節点ハフマン木と、前記文字情報群の文字情報および前記単語の集合内の単語ごとに前記２N分枝無節点ハフマン木の対応する葉を関連付けたデータベースと、前記対象ファイルを前記２N分枝無節点ハフマン木で圧縮した圧縮ファイルと、を記憶する記憶装置にアクセス可能なコンピュータに、
２個以上の文字からなる検索文字列の入力を受け付ける入力工程と、
前記入力工程によって入力された検索文字列を前記データベースから検索する第１の検索工程と、
前記第１の検索工程によって検索されなかった場合、前記検索文字列の先頭文字を末尾文字とする先行単語と、前記検索文字列の末尾文字を先頭文字とする後続単語と、を前記データベースの単語の集合から検索する第２の検索工程と、
前記第２の検索工程によって前記先行単語および前記後続単語が検索された場合、前記２N分枝無節点ハフマン木のうち前記先行単語の圧縮符号を前記先行単語に関連付けされた葉から抽出するとともに、前記２N分枝無節点ハフマン木のうち前記後続単語の圧縮符号を前記後続単語に関連付けされた葉から抽出する抽出工程と、
前記先行単語の圧縮符号と前記後続単語の圧縮符号とを連結させた連結圧縮符号と、前記先行単語および前記後続単語からなりかつ前記先行単語の末尾文字と前記後続単語の先頭文字とを特徴付ける情報を埋め込んだ置換文字列と、を関連付けて記憶するテーブルを作成する作成工程と、
前記圧縮ファイル内の圧縮符号列が前記作成工程によって作成されたテーブル内の連結圧縮符号と一致するか否かを判定する判定工程と、
前記判定工程によって一致すると判定された場合、前記連結圧縮符号に関連付けられた前記置換文字列を伸長先に書き出す伸長工程と、
を実行させることを特徴とする検索プログラム。
【請求項２】
前記抽出工程は、
さらに、前記検索文字列を構成する文字に関連付けられた葉から圧縮符号を抽出し、
前記作成工程は、
さらに、前記検索文字列を構成する文字について前記抽出工程によって抽出された圧縮符号と、前記検索文字列を構成する文字を特徴付ける情報を埋め込んだ前記検索文字列を構成する文字情報の置換文字と、を関連付けて、前記テーブルに格納し、
前記判定工程は、
前記圧縮ファイル内の圧縮符号列が前記作成工程によって作成されたテーブル内の前記検索文字列を構成する文字の圧縮符号と一致するか否かを判定し、
前記伸長工程は、
前記判定工程によって前記検索文字列を構成する文字の圧縮符号と一致すると判定された場合、前記検索文字列を構成する文字の圧縮符号に関連付けられた前記置換文字を前記伸長先に書き出すことを特徴とする請求項１に記載の検索プログラム。
【請求項３】
前記抽出工程は、
前記第１の検索工程によって前記検索文字列が前記データベースから検索された場合、前記検索文字列に一致する単語に関連付けられた葉から圧縮符号を抽出し、
前記作成工程は、
前記検索文字列に一致する単語について前記抽出工程によって抽出された圧縮符号と、前記検索文字列に一致する単語を特徴付ける情報を埋め込んだ前記検索文字列に一致する単語の置換文字列と、を関連付けて、前記テーブルに格納し、
前記判定工程は、
前記圧縮ファイル内の圧縮符号列が前記作成工程によって作成されたテーブル内の前記検索文字列に一致する単語の圧縮符号と一致するか否かを判定し、
前記伸長工程は、
前記判定工程によって前記検索文字列に一致する単語の圧縮符号と一致すると判定された場合、前記検索文字列に一致する単語の圧縮符号に関連付けられた前記置換文字列を前記伸長先に書き出すことを特徴とする請求項１に記載の検索プログラム。
【請求項４】
前記伸長工程は、
前記圧縮ファイル内の前記判定工程によって前記連結圧縮符号と不一致な圧縮符号については、当該不一致な圧縮符号を有する葉に関連付けされた文字を前記データベースから抽出して、前記伸長先に書き出すことを特徴とする請求項１〜３のいずれか一つに記載の検索プログラム。
【請求項５】
前記対象ファイルに出現する前記文字および前記単語を含む文字情報群内の各文字情報の出現率に応じた生起確率で規定される圧縮符号長ごとに、前記文字情報の種類数を集計する集計工程と、
前記対象ファイルに出現する前記文字情報の総種類数に基づいて、最小圧縮符号長から最大圧縮符号長までの圧縮符号長群の中から、前記文字情報に割り当てられる圧縮符号長の上限長Ｎを決定する決定工程と、
前記集計工程によって集計された圧縮符号長ごとの前記文字情報の種類数のうち、前記決定工程によって決定された上限長Ｎを圧縮符号長とする前記文字情報の種類数を、前記上限長Ｎ以上の圧縮符号長での前記文字情報の種類数の総和に補正する補正工程と、
前記補正工程によって補正された補正後の前記圧縮符号長ごとの前記文字情報の種類数に基づいて、前記上限長Ｎを最大枝数とし、前記文字情報の各々の生起確率に応じた圧縮符号長の圧縮符号を葉とする２N分枝無節点ハフマン木を構築し、前記文字情報群の文字情報および前記単語の集合内の単語ごとに前記２N分枝無節点ハフマン木の葉を関連付けることで、前記データベースを構築して、前記２N分枝無節点ハフマン木および前記データベースを前記記憶装置に格納する構築工程と、
前記対象ファイルを前記２N分枝無節点ハフマン木で圧縮することにより、前記圧縮ファイルを前記記憶装置に格納する圧縮工程と、
を前記コンピュータに実行させることを特徴とする請求項１〜４のいずれか一つに記載の検索プログラム。
【請求項６】
前記決定工程は、
前記文字情報の総種類数が２K-1個より大きく２K個以下である場合は、前記上限長ＮをＫビットに決定することを特徴とする請求項５に記載の検索プログラム。
【請求項７】
前記決定工程は、
前記文字情報の総種類数が２10個より大きく２11個以下である場合は、前記上限長Ｎを１１ビットに決定することを特徴とする請求項６に記載の検索プログラム。
【請求項８】
前記決定工程は、
前記文字情報の総種類数が２11個より大きく２12個以下である場合は、前記上限長Ｎを１２ビットに決定することを特徴とする請求項６に記載の検索プログラム。
【請求項９】
対象ファイルに出現する文字情報群内の各文字および２以上の文字からなる単語の生起確率に応じた圧縮符号長の圧縮符号を葉とする最大枝数２Nの２N分枝無節点ハフマン木と、前記文字情報群の文字情報および前記単語の集合内の単語ごとに前記２N分枝無節点ハフマン木の対応する葉を関連付けたデータベースと、前記対象ファイルを前記２N分枝無節点ハフマン木で圧縮した圧縮ファイルと、を記憶する記憶装置にアクセス可能な検索装置であって、
２個以上の文字からなる検索文字列の入力を受け付ける入力手段と、
前記入力手段によって入力された検索文字列を前記データベースから検索する第１の検索手段と、
前記第１の検索手段によって検索されなかった場合、前記検索文字列の先頭文字を末尾文字とする先行単語と、前記検索文字列の末尾文字を先頭文字とする後続単語と、を前記データベースの単語の集合から検索する第２の検索手段と、
前記第２の検索手段によって前記先行単語および前記後続単語が検索された場合、前記２N分枝無節点ハフマン木のうち前記先行単語の圧縮符号を前記先行単語に関連付けされた葉から抽出するとともに、前記２N分枝無節点ハフマン木のうち前記後続単語の圧縮符号を前記後続単語に関連付けされた葉から抽出する抽出手段と、
前記先行単語の圧縮符号と前記後続単語の圧縮符号とを連結させた連結圧縮符号と、前記先行単語および前記後続単語からなりかつ前記先行単語の末尾文字と前記後続単語の先頭文字とを特徴付ける情報を埋め込んだ置換文字列と、を関連付けて記憶するテーブルを作成する作成手段と、
前記圧縮ファイル内の圧縮符号列が前記作成手段によって作成されたテーブル内の連結圧縮符号と一致するか否かを判定する判定手段と、
前記判定手段によって一致すると判定された場合、前記連結圧縮符号に関連付けられた前記置換文字列を伸長先に書き出す伸長手段と、
を備えることを特徴とする検索装置。
【請求項１０】
対象ファイルに出現する文字情報群内の各文字および２以上の文字からなる単語の生起確率に応じた圧縮符号長の圧縮符号を葉とする最大枝数２Nの２N分枝無節点ハフマン木と、前記文字情報群の文字情報および前記単語の集合内の単語ごとに前記２N分枝無節点ハフマン木の対応する葉を関連付けたデータベースと、前記対象ファイルを前記２N分枝無節点ハフマン木で圧縮した圧縮ファイルと、を記憶する記憶装置にアクセス可能なコンピュータが、
２個以上の文字からなる検索文字列の入力を受け付ける入力工程と、
前記入力工程によって入力された検索文字列を前記データベースから検索する第１の検索工程と、
前記第１の検索工程によって検索されなかった場合、前記検索文字列の先頭文字を末尾文字とする先行単語と、前記検索文字列の末尾文字を先頭文字とする後続単語と、を前記データベースの単語の集合から検索する第２の検索工程と、
前記第２の検索工程によって前記先行単語および前記後続単語が検索された場合、前記２N分枝無節点ハフマン木のうち前記先行単語の圧縮符号を前記先行単語に関連付けされた葉から抽出するとともに、前記２N分枝無節点ハフマン木のうち前記後続単語の圧縮符号を前記後続単語に関連付けされた葉から抽出する抽出工程と、
前記先行単語の圧縮符号と前記後続単語の圧縮符号とを連結させた連結圧縮符号と、前記先行単語および前記後続単語からなりかつ前記先行単語の末尾文字と前記後続単語の先頭文字とを特徴付ける情報を埋め込んだ置換文字列と、を関連付けて記憶するテーブルを作成する作成工程と、
前記圧縮ファイル内の圧縮符号列が前記作成工程によって作成されたテーブル内の連結圧縮符号と一致するか否かを判定する判定工程と、
前記判定工程によって一致すると判定された場合、前記連結圧縮符号に関連付けられた前記置換文字列を伸長先に書き出す伸長工程と、
を実行することを特徴とする検索方法。
【手続補正２】
【補正対象書類名】明細書
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ハフマン木を用いて検索する検索プログラム、検索装置、および検索方法に関する。
【背景技術】
【０００２】
従来、利用者が、本来検索したいキーワードを想定できず、本来のキーワードのある部分文字列を入力して検索をおこなう方法が開示されている（たとえば、下記特許文献１，２を参照。）。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開平１１−００７４５１号公報
【特許文献２】特開平８−１９４７１９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかしながら、たとえば、基礎単語である「結婚」と「活動」で構成される「結婚活動」に関し、その略語「婚活」といった未登録単語を検索文字列として入力して検索をおこなう場合、「婚活」では検索結果は得られず、「婚」、「活」というように、文字ごとに検索をかけることとなる。また、「婚」、「活」と別々に検索した結果、「結婚生活」なども検索結果として得られることとなり、検索精度が低いという問題があった。
【０００５】
本発明は、上述した従来技術による問題点を解消するため、基礎単語として登録されていない未登録単語であっても高精度な検索をおこなうことができる検索プログラム、検索装置、および検索方法を提供することを目的とする。
【課題を解決するための手段】
【０００６】
上述した課題を解決し、目的を達成するため、本発明の一観点として、対象ファイルのテキストデータを構成する単一文字、基礎単語、および予約語（以下、文字情報と呼ぶ）に出現する各文字および２以上の文字からなる単語の生起確率に応じた圧縮符号長の圧縮符号を葉とする最大枝数２Nの２N分枝無節点ハフマン木と、前記文字情報群の文字情報および前記単語の集合内の単語ごとに前記２N分枝無節点ハフマン木の対応する葉を関連付けたデータベースと、前記対象ファイルを前記２N分枝無節点ハフマン木で圧縮した圧縮ファイルと、を記憶する記憶装置にアクセス可能であり、２個の文字からなる検索文字列の入力を受け付け、入力された検索文字列を前記データベースから検索する場合、前記検索文字列の先頭文字を末尾文字とする先行単語と、前記検索文字列の末尾文字を先頭文字とする後続単語と、を前記データベースの単語の集合から検索し、前記先行単語および前記後続単語が検索された場合、前記２N分枝無節点ハフマン木のうち前記先行単語の圧縮符号を前記先行単語に関連付けされた葉から抽出するとともに、前記２N分枝無節点ハフマン木のうち前記後続単語の圧縮符号を前記後続単語に関連付けされた葉から抽出し、前記先行単語の圧縮符号と前記後続単語の圧縮符号とを連結させた連結圧縮符号と、前記先行単語および前記後続単語からなり、かつ、前記先行単語の末尾文字と前記後続単語の先頭文字とを特徴付ける情報を埋め込んだ置換文字列と、を関連付けて記憶するテーブルを作成し、前記圧縮ファイル内の圧縮符号列がテーブル内の連結圧縮符号と一致するか否かを判定し、一致すると判定された場合、前記連結圧縮符号に関連付けられた前記置換文字列を伸長先に書き出す検索プログラム、検索装置、および検索方法が提案される。
【発明の効果】
【０００７】
本発明にかかる検索プログラム、検索装置、および検索方法によれば、未登録単語であっても高精度な検索をおこなうことができるという効果を奏する。
【図面の簡単な説明】
【０００８】
【図１】図１は、本実施の形態にかかる情報検索例を示す説明図である。
【図２】図２は、基礎単語ではない検索文字列「婚活」が与えられた場合の照合／置換テーブルＴの作成例（その１）を示す説明図である。
【図３】図３は、基礎単語ではない検索文字列「婚活」が与えられた場合の照合／置換テーブルＴの作成例（その２）を示す説明図である。
【図４】図４は、基礎単語ではない検索文字列「婚活」が与えられた場合の照合／置換テーブルＴの作成例（その３）を示す説明図である。
【図５】図５は、基礎単語ではない検索文字列「婚活」が与えられた場合の照合／置換テーブルＴの作成例（その４）を示す説明図である。
【図６】図６は、基礎単語ではない検索文字列「婚活」が与えられた場合の照合／置換テーブルＴの作成例（その５）を示す説明図である。
【図７】図７は、基礎単語ではない検索文字列「婚活」が与えられた場合の照合／置換テーブルＴの作成例（その６）を示す説明図である。
【図８】図８は、基礎単語ではない検索文字列「婚活」が与えられた場合の照合／置換テーブルＴの作成例（その７）を示す説明図である。
【図９】図９は、基礎単語「結婚」が検索文字列として与えられた場合の照合／置換テーブルＴの作成例（その１）を示す説明図である。
【図１０】図１０は、基礎単語「結婚」が検索文字列として与えられた場合の照合／置換テーブルＴの作成例（その２）を示す説明図である。
【図１１】図１１は、基礎単語「結婚」が検索文字列として与えられた場合の照合／置換テーブルＴの作成例（その３）を示す説明図である。
【図１２】図１２は、２N分枝無節点ハフマン木のサイズ決定方法の一例を示す説明図である。
【図１３】図１３は、２N分枝無節点ハフマン木の生成までの流れを示す説明図である。
【図１４】図１４は、図２の（１）出現回数の集計の詳細を示す説明図である。
【図１５】図１５は、文字情報が高位文字である場合の出現マップ群１５０１を示す説明図である。
【図１６】図１６は、文字情報が分割文字コードである場合の出現マップ群１５０２を示す説明図である。
【図１７】図１７は、文字情報が特殊単語である場合の出現マップ群１５０３を示す説明図である。
【図１８】図１８は、図１３の（２）圧縮符号長算出の詳細（Ｎ＝１１）を示す説明図である。
【図１９】図１９は、図１３の（３）葉数特定〜（５）葉の構造体生成の詳細（Ｎ＝１１）を示す説明図である。
【図２０】図２０は、文字情報ごとの補正結果を示す説明図である。
【図２１】図２１は、葉へのポインタ生成の詳細（Ｎ＝１１）を示す説明図である。
【図２２】図２２は、図１３の（７）２N分枝無節点ハフマン木の構築の詳細（Ｎ＝１１）を示す説明図である。
【図２３】図２３は、図１３の（３）葉数特定〜（５）葉の構造体生成の詳細（Ｎ＝１２）を示す説明図である。
【図２４】図２４は、葉へのポインタ生成の詳細（Ｎ＝１２）を示す説明図である。
【図２５】図２５は、（７）２N分枝無節点ハフマン木の構築の詳細（Ｎ＝１２）を示す説明図である。
【図２６】図２６は、図１３の（３）葉数特定〜（５）葉の構造体生成の詳細（Ｎ＝１３）を示す説明図である。
【図２７】図２７は、葉へのポインタ生成の詳細（Ｎ＝１３）を示す説明図である。
【図２８】図２８は、図１３の（７）２N分枝無節点ハフマン木の構築の詳細（Ｎ＝１３）を示す説明図である。
【図２９】図２９は、葉の構造体を示す説明図である。
【図３０】図３０は、高位文字コードの構造体５００を示す説明図である。
【図３１】図３１は、分割文字コードの構造体６００を示す説明図である。
【図３２】図３２は、特殊単語の構造体１００を示す説明図（その１）である。
【図３３】図３３は、特殊単語の構造体１００を示す説明図（その２）である。
【図３４】図３４は、実施の形態にかかるコンピュータのハードウェア構成例を示すブロック図である。
【図３５】図３５は、コンピュータの機能的構成例を示すブロック図（その１）である。
【図３６】図３６は、ＵＴＦ１６での文字情報の分類例を示す説明図である。
【図３７】図３７は、ＡＳＣＩＩコードでの文字情報の分類例を示す説明図である。
【図３８】図３８は、シフトＪＩＳコードでの文字情報の分類例を示す説明図である。
【図３９】図３９は、２N分枝無節点ハフマン木の生成処理手順（前半）を示すフローチャートである。
【図４０】図４０は、２N分枝無節点ハフマン木の生成処理手順（後半）を示すフローチャートである。
【図４１】図４１は、図３９に示した第１集計処理（ステップＳ３９０１）の詳細な処理手順を示すフローチャートである。
【図４２】図４２は、図４１に示した対象ファイルＦｉの集計処理（ステップＳ４１０３）の詳細な処理手順を示すフローチャートである。
【図４３】図４３は、図４２に示した特殊単語集計処理（ステップＳ４２０２）の詳細な処理手順を示すフローチャートである。
【図４４】図４４は、図４３に示した最長一致検索処理（ステップＳ４３０１）の詳細な処理手順を示すフローチャートである。
【図４５】図４５は、図４３に示した特殊単語の出現マップ生成処理（ステップＳ４３０４）の詳細な処理手順を示すフローチャートである。
【図４６】図４６は、図４２に示した対象文字の出現マップ生成処理（ステップＳ４２０４）の詳細な処理手順を示すフローチャートである。
【図４７】図４７は、図３９に示した第２集計処理（ステップＳ３９０２）の詳細な処理手順を示すフローチャートである。
【図４８】図４８は、図４０に示した補正Ｂ+処理（ステップＳ４００３）の詳細な処理手順を示すフローチャートである。
【図４９】図４９は、図４０に示した補正Ｂ-処理（ステップＳ４００４）の詳細な処理手順を示すフローチャートである。
【図５０】図５０は、図４８および図４９に示した更新処理（ステップＳ４８０１）の詳細な処理手順を示すフローチャートである。
【図５１】図５１は、図４０に示した枝数特定処理（ステップＳ４００６）の詳細な処理手順を示すフローチャートである。
【図５２】図５２は、図４０に示した構築処理（ステップＳ４００７）の詳細な処理手順を示すフローチャートである。
【図５３】図５３は、図５２に示した葉へのポインタ生成処理（ステップＳ５２０３）の詳細な処理手順を示すフローチャートである。
【図５４】図５４は、補正Ｂ+処理（ステップＳ４００３）の他の例の詳細な処理手順を示すフローチャートである。
【図５５】図５５は、補正Ｂ-処理（ステップＳ４００４）の他の例の詳細な処理手順を示すフローチャートである。
【図５６】図５６は、図５４に示した補正Ｂ+処理の他の例を適用した場合における、図１３の（３）葉数特定〜（５）葉の構造体生成の詳細（Ｎ＝１２）を示す説明図である。
【図５７】図５７は、上述した補正Ｂ-処理の他の例を適用した場合における、図１３の（３）葉数特定〜（５）葉の構造体生成の詳細（Ｎ＝１１）を示す説明図である。
【図５８】図５８は、圧縮対象文字列の一例を示す説明図である。
【図５９】図５９は、図５８に示した圧縮対象文字列の圧縮符号を示す説明図である。
【図６０】図６０は、２N分枝無節点ハフマン木を用いた圧縮処理の具体例を示す説明図である。
【図６１】図６１は、コンピュータが自動実行する２N分枝無節点ハフマン木を用いたファイル圧縮処理手順を示すフローチャートである。
【図６２】図６２は、図６１に示した圧縮処理（ステップＳ６１０３）の詳細な処理手順を示すフローチャート（その１）である。
【図６３】図６３は、図６１に示した圧縮処理（ステップＳ６１０３）の詳細な処理手順を示すフローチャート（その２）である。
【図６４】図６４は、図６１に示した圧縮処理（ステップＳ６１０３）の詳細な処理手順を示すフローチャート（その３）である。
【図６５】図６５は、圧縮ファイルの絞込み例を示す説明図である。
【図６６】図６６は、圧縮符号列の伸長処理例を示す説明図（その１）である。
【図６７】図６７は、圧縮符号列の伸長処理例を示す説明図（その２）である。
【図６８】図６８は、圧縮符号列の伸長処理例を示す説明図（その３）である。
【図６９】図６９は、圧縮符号列の伸長処理例を示す説明図（その４）である。
【図７０】図７０は、圧縮符号列の伸長処理例を示す説明図（その５）である。
【図７１】図７１は、圧縮符号列の伸長処理例を示す説明図（その６）である。
【図７２】図７２は、本実施の形態にかかるコンピュータの機能的構成例（その２）を示すブロック図である。
【図７３】図７３は、本実施の形態にかかる検索処理手順を示すフローチャートである。
【図７４】図７４は、図７３に示したファイル絞込み処理（ステップＳ７３０２）の詳細な処理手順を示すフローチャート（その１）である。
【図７５】図７５は、図７３に示したファイル絞込み処理（ステップＳ７３０２）の詳細な処理手順を示すフローチャート（その２）である。
【図７６】図７６は、図７３に示した照合／置換テーブルＴ作成処理（ステップＳ７３０３）の詳細な処理手順を示すフローチャートである。
【図７７】図７７は、図７６に示した特殊単語設定処理（ステップＳ７６０３）の詳細な処理手順を示すフローチャートである。
【図７８】図７８は、図７６に示した非特殊単語設定処理（ステップＳ７６０７）の詳細な処理手順を示すフローチャート（その１）である。
【図７９】図７９は、図７６に示した非特殊単語設定処理（ステップＳ７６０７）の詳細な処理手順を示すフローチャート（その２）である。
【図８０】図８０は、図７６に示した文字コード設定処理（ステップＳ７６０８）の詳細な処理手順を示すフローチャートである。
【図８１】図８１は、図８０に示した分割文字コード設定処理（ステップＳ８００８）の詳細を示すフローチャートである。
【図８２】図８２は、２N分枝無節点ハフマン木を用いた伸長処理手順を示すフローチャートである。
【図８３】図８３は、図７３に示した２N分枝無節点ハフマン木を用いた伸長処理（ステップＳ７３０４）の詳細な処理手順を示すフローチャートである。
【図８４】図８４は、図８３に示した照合置換処理（ステップＳ８３０４）の詳細な処理手順を示すフローチャートである。
【発明を実施するための形態】
【０００９】
以下に添付図面を参照して、本発明にかかる検索プログラム、検索装置、および検索方法の実施の形態を詳細に説明する。なお、本明細書において、「文字情報」とは、テキストデータを構成する、単一文字、基礎単語、予約語などである。単一文字とは１つの文字コードで表現される文字である。単一文字の文字コード長は、文字コード種により異なる。
【００１０】
たとえば、ＵＴＦ（Ｕｎｉｃｏｄｅ  Ｔｒａｎｓｆｏｒｍａｔｉｏｎ  Ｆｏｒｍａｔ）１６の場合は１６ビットコード、ＡＳＣＩＩ（Ａｍｅｒｉｃａｎ  Ｓｔａｎｄａｒｄ  Ｃｏｄｅ  ｆｏｒ  Ｉｎｆｏｒｍａｔｉｏｎ  Ｉｎｔｅｒｃｈａｎｇｅ）コードの場合は８ビットコード、シフトＪＩＳ（Ｊａｐａｎｅｓｅ  Ｉｎｄｕｓｔｒｉａｌ  Ｓｔａｎｄａｒｄ）コードの場合は８ビットコードである。シフトＪＩＳコードで日本語の文字を表現する場合は、２個の８ビットコードを組み合わせることとなる。
【００１１】
また、単一文字以外に、たとえば、特定の文字列で表現される単語や予約語が挙げられる。単語としては、児童や生徒が学校教育で学習すべき数百〜数千の基礎単語が挙げられる。基礎単語は出現頻度が高い文字列である。予約語とは、予め決められた文字列であり、たとえば、ＨＴＭＬのタグ（たとえば、＜ｂｒ＞）が挙げられる。基礎単語および予約語を「特殊単語」と称す。なお、本実施の形態では、文字コードとしてＵＴＦ１６を例に挙げて説明する。
【００１２】
＜情報検索例＞
まず、本実施の形態にかかる情報検索例について説明する。本実施の形態では、対象ファイルを圧縮した圧縮ファイルを圧縮状態のまま、検索文字列の圧縮文字列に一致する圧縮符号列と照合する。そして、照合の結果、不一致となった圧縮符号列については、そのまま伸長する。一方、一致した圧縮符号列については、あらかじめ作成しておいた照合／置換テーブル内の置換文字列に置換する。
【００１３】
すなわち、本実施の形態では、情報検索に先立って、照合／置換テーブルを作成する作成処理を実行する。そして、作成された照合／置換テーブルを用いて、対象ファイルを圧縮した圧縮ファイルを圧縮状態のまま、照合、置換（不一致の場合は置換せず）しながら伸長する伸長処理を実行する。
【００１４】
特に、本実施の形態では、検索文字列の圧縮文字列が基礎単語の圧縮符号に一致しなかった場合であっても、検索文字列がヒットしたとして伸長後の対象ファイルで強調表示する。たとえば、４文字熟語「結婚活動」のうち「結婚」と「活動」が基礎単語として登録されており、「結婚活動」の略語「婚活」は基礎単語として登録されていないとする。
【００１５】
ここで、基礎単語ではない検索文字列「婚活」が与えられた場合、「結婚」や「活動」ではヒットしないため、単一文字「婚」、「活」のＡＮＤ検索でヒットさせることとなる。この場合、文字通り「婚活」という文字列のほか、「婚」および「活」が単独でそれぞれヒットすることとなる。すなわち、たまたま対象ファイル内で「婚活」と記述されていれば、「婚活」がヒットするが、それ以外では、「婚」および「活」は、単独でヒットすることとなる。
【００１６】
したがって、本実施の形態では、検索文字列のいわゆる『泣き別れ』を防止することで、伸長処理ひいては検索処理の効率化を図る。
【００１７】
図１は、本実施の形態にかかる情報検索例を示す説明図である。図１では、上述した「婚活」が検索文字列として与えられた例を示している。
【００１８】
（Ａ）例として、検索文字列「婚活」が与えられると、まず、コンピュータは、特殊単語の構造体１００を２分探索する。特殊単語の構造体１００とは、特殊単語と当該特殊単語に対応する２N分枝無節点ハフマン木の葉へのポインタとを、特殊単語ごとに格納したデータ構造体である。特殊単語の構造体１００の詳細については、図５１および図５２で後述する。検索文字列「婚活」は基礎単語ではないため、特殊単語の構造体１００ではヒットしない。
【００１９】
また、２N分枝無節点ハフマン木とは、根から分岐する枝が２N本あり、１または複数本の枝で葉を直接ポイントするハフマン木である。節点（内部節点）はない。節点がなく直接葉にヒットするため、節点を有する通常のハフマン木に比べて、伸長速度の高速化を図ることができる。葉は、該当する文字情報とその圧縮符号を含む構造体である。葉の構造体とも呼ぶ。葉に割り当てられる枝数は、割当先の葉に存在する圧縮符号の圧縮符号長に依存する。これらの詳細については、後述する。
【００２０】
（Ｂ）検索文字列「婚活」が特殊単語の構造体１００でヒットしなかった場合、コンピュータは、検索文字列「婚活」の先頭文字「婚」を末尾文字とする基礎単語と、検索文字列「婚活」の末尾文字「活」を先頭文字とする基礎単語とを探索する。この場合、先頭文字「婚」を末尾文字とする基礎単語「結婚」と末尾文字「活」を先頭文字とする基礎単語「活動」がヒットしたとする。
【００２１】
（Ｃ）基礎単語「結婚」および基礎単語「活動」がヒットした場合、特殊単語の構造体１００内の基礎単語「結婚」の葉へのポインタにより、２N分枝無節点ハフマン木の葉（結婚）がポイントされる。同様に、特殊単語の構造体１００内の基礎単語「活動」の葉へのポインタにより、２N分枝無節点ハフマン木の葉（活動）がポイントされる。そして、コンピュータは、ポイントされた葉のうち、先頭文字「婚」を末尾文字とする基礎単語「結婚」の葉の構造体内にある照合フラグをＯＮにする。照合フラグとは、その葉がポイントされた場合に、照合／置換テーブルを用いて照合をおこなうか否かを識別するフラグである。
【００２２】
そして、コンピュータは、連続単語「結婚」「活動」の圧縮符号列と、連続単語「結婚」「活動」の置換文字列と、を含む照合／置換テーブルＴを作成する。連続単語とは、先行の基礎単語の末尾に後続の基礎単語の先頭を連結させた文字列である。本例では、基礎単語「結婚」に基礎単語「活動」を連結した文字列「結婚活動」となる。
【００２３】
また、連続単語の圧縮符号列とは、先行の基礎単語の圧縮符号の末尾に後続の基礎単語の圧縮符号の先頭を連結させた圧縮符号列である。本例では、基礎単語「結婚」の圧縮符号に基礎単語「活動」の圧縮符号を連結した圧縮符号列となる。すなわち、連続単語「結婚活動」の圧縮符号となる。
【００２４】
連続単語の置換文字列とは、連続単語であり、かつ、連続単語のうち検索文字列に一致する文字列に特定の置換指示情報を埋め込んだ文字列である。本例の場合、連続単語「結婚活動」のうち検索文字列「婚活」に特定の置換指示情報を埋め込んだこととなる。特定の置換指示情報とは、検索文字列以外の表示形式とは異なる表示形式に置換する情報である。
【００２５】
たとえば、検索文字列に一致する文字列を他の文字列とは異なる色にしたり、検索文字列に一致する文字列の背景色を他の文字列の背景色とは異なる色にしたりするために埋め込まれるタグである。たとえば、連続単語「結婚」「活動」については、置換文字列「結＜ｃｏｌｏｒ＞婚活＜／ｃｏｌｏｒ＞動」とする。照合／置換テーブルＴの作成の詳細については図２〜図１２で後述する。
【００２６】
（Ｄ）また、コンピュータは、対象ファイル群を２N分枝無節点ハフマン木で圧縮した圧縮ファイル群ｆｓから、検索文字列「婚活」を構成する「婚」および「活」を含む圧縮ファイルｆｉを絞り込む。圧縮ファイルの絞込みの詳細については後述する。
【００２７】
（Ｅ）このあと、コンピュータは、（Ｄ）で絞り込まれた圧縮ファイルを２N分枝無節点ハフマン木を用いて伸長後の文字列を伸長バッファに書き込む。この伸長中に、コンピュータは、圧縮ファイルから取り出された圧縮符号についての葉の構造体で照合フラグがＯＮである場合、照合／置換テーブルＴを参照する。本例の場合、基礎単語「結婚」の圧縮符号が取り出された場合、葉の構造体で照合フラグがＯＮであるため、照合／置換テーブルＴを参照する。
【００２８】
そして、後続の圧縮符号までの圧縮符号列と照合／置換テーブルＴ内の圧縮符号列とが一致した場合、置換文字列を伸長バッファに書き込む。本例の場合、基礎単語「活動」の圧縮符号が、基礎単語「結婚」の圧縮符号の後続圧縮符号であるとすると、圧縮ファイルから連続して取り出された基礎単語「結婚」の圧縮符号とその後続の基礎単語「活動」の圧縮符号からなる圧縮符号列が、照合／置換テーブルＴにあるか否かを判断する。
【００２９】
本例では、連続単語「結婚」「活動」の圧縮符号列が照合／置換テーブルＴに存在するため、連続単語「結婚」「活動」の置換文字列「結＜ｃｏｌｏｒ＞婚活＜／ｃｏｌｏｒ＞動」を伸長バッファに書き込むこととなる。そして、伸長が完了すると、検索結果として伸長バッファの内容を表示することで、検索文字列「婚活」が他の文字列に対し強調表示されることとなる。
【００３０】
＜照合／置換テーブルＴの作成例＞
つぎに、図１（Ａ）〜（Ｃ）での照合／置換テーブルＴの作成例について説明する。図２〜図８では、基礎単語ではない検索文字列の例として「婚活」が与えられた場合の照合／置換テーブルＴの作成例を示す。また、比較するために、図９〜図１２では、基礎単語の例として「結婚」が検索文字列として与えられた場合の照合／置換テーブルＴの作成例を示す。なお、照合／置換テーブルＴの符号の末尾には、照合／置換テーブルＴの作成の時系列を示す番号を０から昇順に付すこととする。たとえば、初期状態はＴ０とし、Ｔ０から更新されたらＴ１、Ｔ１から更新されたらＴ２、…とする。
【００３１】
図２は、基礎単語ではない検索文字列「婚活」が与えられた場合の照合／置換テーブルＴの作成例（その１）を示す説明図である。図２のＴ０は、初期化された照合／置換テーブルＴである。照合／置換テーブルＴ０では、ポインタのアドレスｐ１、ｐ２、…ごとに、圧縮符号長項目、圧縮符号項目、置換文字列項目からなるレコードが設定されているが、初期状態なので各項目内にはまだ値が設定されていない。
【００３２】
（１）まず、検索文字列「婚活」が与えられると、コンピュータは、特殊単語の構造体１００を２分探索する。
【００３３】
（２）検索文字列「婚活」は特殊単語の構造体１００には登録されていないため、コンピュータは、つぎに、特殊単語の構造体１００において、検索文字列「婚活」の先頭文字「婚」を末尾文字とする基礎単語を２分探索する。
【００３４】
（３）そして、コンピュータは、特殊単語の構造体１００から、検索文字列「婚活」の先頭文字「婚」を末尾文字とする基礎単語「結婚」を特定する。
【００３５】
（４）つぎに、（３）の２分探索でヒットした基礎単語「結婚」の葉Ｌ＃へのポインタにより、２N分枝無節点ハフマン木の葉Ｌ＃（結婚）の構造体が指定される。葉Ｌ＃の構造体には、圧縮符号、圧縮符号長、対応する文字構造体へのポインタ、照合フラグ（デフォルトはＯＦＦ）が格納されている。図２の葉Ｌ＃（結婚）の構造体には、あらかじめ、基礎単語「結婚」の圧縮符号“０１０１００１００００００”、その圧縮符号長１３ビット、特殊単語の構造体１００の「結婚」へのポインタが格納されている。ここで、（３）で２分探索されたことで、照合フラグがＯＦＦからＯＮになる。
【００３６】
（５）また、コンピュータは、照合／置換テーブルＴの空きポインタｐ１を、葉Ｌ＃（結婚）における照合／置換テーブルＴへのポインタとして設定する。
【００３７】
（６）そして、コンピュータは、照合／置換テーブルＴのポインタｐ１で指定されるレコードの圧縮符号長項目に、葉Ｌ＃（結婚）の構造体の圧縮符号長１３ビットを書き込む。また、コンピュータは、照合／置換テーブルＴのポインタｐ１で指定されるレコードの圧縮符号項目に、葉Ｌ＃（結婚）の構造体の圧縮符号“０１０１００１００００００”を書き込む。さらに、コンピュータは、照合／置換テーブルＴのポインタｐ１で指定されるレコードの置換文字列項目に、「結婚」の置換文字列「結＜ｃｏｌｏｒ＞婚＜／ｃｏｌｏｒ＞」を書き込む。
【００３８】
ここでの置換文字列「結＜ｃｏｌｏｒ＞婚＜／ｃｏｌｏｒ＞」は、検索文字列「婚活」の先頭文字、すなわち、（３）でヒットした基礎単語「結婚」の末尾文字「婚」に特定の置換指示情報が埋め込まれた文字列となる。これにより、照合／置換テーブルＴ０は照合／置換テーブルＴ１に更新される。
【００３９】
図３は、基礎単語ではない検索文字列「婚活」が与えられた場合の照合／置換テーブルＴの作成例（その２）を示す説明図である。
【００４０】
（７）図２の（６）のあと、コンピュータは、特殊単語の構造体１００において、検索文字列「婚活」の末尾文字「活」を先頭文字とする基礎単語を２分探索する。
【００４１】
（８）そして、コンピュータは、特殊単語の構造体１００から、検索文字列「婚活」の末尾文字「活」を先頭文字とする基礎単語「活用」を特定する。コンピュータは、基礎単語「活用」が特定されると、基礎単語「活用」についての葉Ｌ＃（活用）へのポインタにより、葉Ｌ＃（活用）の構造体をポイントする。
【００４２】
（９）つぎに、コンピュータは、照合／置換テーブルＴへのポインタｐ１で指定されるレコードの値（圧縮符号長１３ビット、圧縮符号“０１０１００１００００００”置換文字列「結＜ｃｏｌｏｒ＞婚＜／ｃｏｌｏｒ＞」）を、空きポインタｐ２のレコードにコピーする。これにより、照合／置換テーブルＴ１は照合／置換テーブルＴ２に更新される。
【００４３】
（１０）そして、コンピュータは、照合／置換テーブルＴへのポインタｐ１で特定される圧縮符号長１３ビットに、葉Ｌ＃（活用）の構造体に格納されている圧縮符号長１３ビットを加算して２６ビットとする。
【００４４】
また、コンピュータは、照合／置換テーブルＴへのポインタｐ１で特定される圧縮符号“０１０１００１００００００”の末尾に、葉Ｌ＃（活用）の構造体に格納されている圧縮符号“０１０１００１０００００１”を連結する。さらに、コンピュータは、照合／置換テーブルＴへのポインタｐ１で特定される置換文字列「結＜ｃｏｌｏｒ＞婚＜／ｃｏｌｏｒ＞」の末尾に、基礎単語「活用」の置換文字列「＜ｃｏｌｏｒ＞活＜／ｃｏｌｏｒ＞用」を連結する。
【００４５】
ここで、置換文字列「＜ｃｏｌｏｒ＞活＜／ｃｏｌｏｒ＞用」は、検索文字列「婚活」の末尾文字、すなわち、（８）でヒットした基礎単語「活用」の先頭文字「活」に特定の置換指示情報が埋め込まれた文字列となる。連結後の置換文字列は、以下のようになる。
【００４６】
「結＜ｃｏｌｏｒ＞婚＜／ｃｏｌｏｒ＞＜ｃｏｌｏｒ＞活＜／ｃｏｌｏｒ＞用」
【００４７】
この場合、冗長さを回避するため、「婚」と「活」との間の「＜／ｃｏｌｏｒ＞＜ｃｏｌｏｒ＞」を削除して、「結＜ｃｏｌｏｒ＞婚活＜／ｃｏｌｏｒ＞用」を連結後の置換文字列とする。すなわち、終了タグと開始タグが連続した場合には削除する。これにより、照合／置換テーブルＴ２は照合／置換テーブルＴ３に更新される。
【００４８】
図４は、基礎単語ではない検索文字列「婚活」が与えられた場合の照合／置換テーブルＴの作成例（その３）を示す説明図である。
【００４９】
（１１）図３の（８）のあと、さらに、コンピュータは、検索文字列「婚活」の末尾文字「活」を先頭文字とする基礎単語について、特殊単語の構造体１００の２分探索を続け、検索文字列「婚活」の末尾文字「活」を先頭文字とする基礎単語「活動」を特定する。コンピュータは、基礎単語「活動」が特定されると、基礎単語「活動」についての葉Ｌ＃（活動）へのポインタにより、葉Ｌ＃（活動）の構造体をポイントする。
【００５０】
（１２）つぎに、コンピュータは、図３の（９）でコピー対象となった照合／置換テーブルＴへのポインタｐ２を、葉Ｌ＃（結婚）の構造体（葉Ｌ＃（活動）の構造体ではなく）に格納する。
【００５１】
（１３）これにより、葉Ｌ＃（結婚）の構造体は、照合／置換テーブルＴにおけるポインタｐ１のレコードおよびｐ２のレコードに指定することができる。
【００５２】
（１４）このあと、コンピュータは、照合／置換テーブルＴへのポインタｐ２で特定される圧縮符号長１３ビットに、葉Ｌ＃（活動）の構造体に格納されている圧縮符号長１３ビットを加算して２６ビットとする。
【００５３】
また、コンピュータは、照合／置換テーブルＴへのポインタｐ２で特定される圧縮符号“０１０１００１００００００”の末尾に、葉Ｌ＃（活動）の構造体に格納されている圧縮符号“０１０１００１００００１０”を連結する。さらに、コンピュータは、照合／置換テーブルＴへのポインタｐ２で特定される置換文字列「結＜ｃｏｌｏｒ＞婚＜／ｃｏｌｏｒ＞」の末尾に、基礎単語「活動」の置換文字列「＜ｃｏｌｏｒ＞活＜／ｃｏｌｏｒ＞動」を連結する。
【００５４】
ここで、置換文字列「＜ｃｏｌｏｒ＞活＜／ｃｏｌｏｒ＞動」は、検索文字列「婚活」の末尾文字、すなわち、（１１）でヒットした基礎単語「活動」の先頭文字「活」に特定の置換指示情報が埋め込まれた文字列となる。連結後の置換文字列は、以下のようになる。
【００５５】
「結＜ｃｏｌｏｒ＞婚＜／ｃｏｌｏｒ＞＜ｃｏｌｏｒ＞活＜／ｃｏｌｏｒ＞動」
【００５６】
この場合、冗長さを回避するため、「婚」と「活」との間の「＜／ｃｏｌｏｒ＞＜ｃｏｌｏｒ＞」を削除して、「結＜ｃｏｌｏｒ＞婚活＜／ｃｏｌｏｒ＞動」を連結後の置換文字列とする。これにより、照合／置換テーブルＴ３は照合／置換テーブルＴ４に更新される。これにより、検索文字列「婚活」についての更新は完了し、図５〜図８では、単一文字「婚」、「活」についての更新を説明する。
【００５７】
図５は、基礎単語ではない検索文字列「婚活」が与えられた場合の照合／置換テーブルＴの作成例（その４）を示す説明図である。
【００５８】
（１５）まず、コンピュータは、高位文字コードの構造体５００において、検索文字列「婚活」のうち先頭文字「婚」を２分探索する。高位文字コードの構造体５００は、高位文字コードｅ♯とその葉Ｌ♯へのポインタを格納するデータ構造体である。高位文字コードとは、対象ファイル群に記述されている文字の出現回数を集計した結果、上位所定番目（たとえば、１０２４位）までの文字群をいう。すなわち、高位文字コードの構造体５００でヒットした文字は、上位所定番目に入る高出現頻度の文字である。本例の文字「婚」は、高位文字コードの構造体５００でヒットしなかったものとする。
【００５９】
（１６）コンピュータは、高位文字コードの構造体５００でヒットしなかった低出現頻度の文字「婚」の文字コード「５Ａ５Ａ」を上位８ビット「０ｘ５Ａ」と下位８ビット「０ｘ５Ａ」とに分割する。ＵＴＦ１６ビットコードの文字は、８ビットコードの組み合わせで表現されるため、低出現頻度の文字については分割することで、低出現頻度の文字の総数を、たかだか２５６個に抑えることができる。
【００６０】
図６は、基礎単語ではない検索文字列「婚活」が与えられた場合の照合／置換テーブルＴの作成例（その５）を示す説明図である。
【００６１】
（１７）コンピュータは、分割文字コードの構造体において、図５の（１６）で分割された上位分割文字コード「０ｘ５Ａ」を２分探索する。分割文字コードの構造体は、分割文字コードとその葉Ｌ♯へのポインタを格納するデータ構造体である。分割文字コードの構造体６００についての２分探索では、かならずヒットすることとなる。
【００６２】
（１８）そして、分割文字コード「０ｘ５Ａ」がヒットするため、対応する葉Ｌ＃（０ｘ５Ａ）へのポインタにより、２N分枝無節点ハフマン木の葉Ｌ＃（０ｘ５Ａ）の構造体が指定される。図６の葉Ｌ＃（０ｘ５Ａ）の構造体には、あらかじめ、分割文字コード「０ｘ５Ａ」の圧縮符号“０１０１００１１０１１０”、その圧縮符号長１２ビット、分割文字コードの構造体６００の「０ｘ５Ａ」へのポインタが格納されている。
【００６３】
（１９）そして、コンピュータは、指定された葉Ｌ＃（０ｘ５Ａ）の構造体の照合フラグをＯＮにする。
【００６４】
（２０）また、コンピュータは、照合／置換テーブルＴの空きポインタｐ３を、葉Ｌ＃（０ｘ５Ａ）の構造体内の照合／置換テーブルＴへのポインタとして設定する。コンピュータは、これにより照合／置換テーブルＴのポインタｐ３で指定されるレコードにアクセスすることができる。
【００６５】
（２１）そして、コンピュータは、照合／置換テーブルＴのポインタｐ３で指定されるレコードの圧縮符号長項目に、葉Ｌ＃（０ｘ５Ａ）の構造体の圧縮符号長１２ビットを書き込む。また、コンピュータは、照合／置換テーブルＴのポインタｐ３で指定されるレコードの圧縮符号項目に、葉Ｌ＃（０ｘ５Ａ）の構造体の圧縮符号“０１０１００１１０１１０”を書き込む。さらに、コンピュータは、照合／置換テーブルＴのポインタｐ３で指定されるレコードの置換文字列項目に、「０ｘ５Ａ」の置換文字列「＜ｃｏｌｏｒ＞０ｘ５Ａ＜／ｃｏｌｏｒ＞」を書き込む。これにより、照合／置換テーブルＴ４は照合／置換テーブルＴ５に更新される。
【００６６】
図７は、基礎単語ではない検索文字列「婚活」が与えられた場合の照合／置換テーブルＴの作成例（その６）を示す説明図である。
【００６７】
（２２）コンピュータは、分割文字コードの構造体６００において、図５の（１６）で分割された下位分割文字コード「０ｘ５Ａ」を２分探索する。
【００６８】
（２３）そして、分割文字コード「０ｘ５Ａ」がヒットするため、対応する葉Ｌ＃（０ｘ５Ａ）へのポインタにより、２N分枝無節点ハフマン木の葉Ｌ＃（０ｘ５Ａ）の構造体が指定される。
【００６９】
（２４）そして、コンピュータは、上位分割文字コード「０ｘ５Ａ」の構造体で設定された照合／置換テーブルＴのポインタｐ３で特定される圧縮符号長１２ビットに、葉Ｌ＃（０ｘ５Ａ）の構造体に格納されている圧縮符号長１２ビットを加算して２４ビットとする。
【００７０】
また、コンピュータは、照合／置換テーブルＴへのポインタｐ３で特定される圧縮符号“０１０１００１１０１１０”の末尾に、葉Ｌ＃（０ｘ５Ａ）の構造体に格納されている圧縮符号“０１０１００１１０１１０”を連結する。さらに、コンピュータは、照合／置換テーブルＴへのポインタｐ３で特定される置換文字列「＜ｃｏｌｏｒ＞０ｘ５Ａ＜／ｃｏｌｏｒ＞」の末尾に、下位分割文字コード「０ｘ５Ａ」の置換文字列「＜ｃｏｌｏｒ＞０ｘ５Ａ＜／ｃｏｌｏｒ＞」を連結する。連結後の置換文字列は、以下のようになる。
【００７１】
「＜ｃｏｌｏｒ＞０ｘ５Ａ＜／ｃｏｌｏｒ＞＜ｃｏｌｏｒ＞０ｘ５Ａ＜／ｃｏｌｏｒ＞」
【００７２】
この場合、冗長さを回避するため、上位分割文字コード「０ｘ５Ａ」と下位分割文字コード「０ｘ５Ａ」との間の「＜／ｃｏｌｏｒ＞＜ｃｏｌｏｒ＞」を削除して、「＜ｃｏｌｏｒ＞婚＜／ｃｏｌｏｒ＞」を連結後の置換文字列とする。これにより、照合／置換テーブルＴ５は照合／置換テーブルＴ６に更新される。これにより、単一文字「婚」についての更新は完了する。
【００７３】
図８は、基礎単語ではない検索文字列「婚活」が与えられた場合の照合／置換テーブルＴの作成例（その７）を示す説明図である。
【００７４】
（２５）まず、コンピュータは、高位文字コードの構造体５００において、検索文字列「婚活」のうち末尾文字「活」を２分探索する。
【００７５】
（２６）そして、末尾文字「活」は高出現頻度の文字であるため、高位文字コードの構造体５００でヒットすることとなる。
【００７６】
（２７）そして、対応する葉Ｌ＃（活）へのポインタにより、２N分枝無節点ハフマン木の葉Ｌ＃（活）の構造体が指定される。図８の葉Ｌ＃（活）の構造体には、あらかじめ、高位文字「活」の圧縮符号“００１１１００１０”、その圧縮符号長９ビット、高位文字コードの構造体５００の「活」へのポインタが格納されている。そして、コンピュータは、指定された葉Ｌ＃（活）の構造体の照合フラグをＯＮにする。
【００７７】
（２８）また、コンピュータは、照合／置換テーブルＴの空きポインタｐ４を、葉Ｌ＃（活）の構造体内の照合／置換テーブルＴへのポインタとして設定する。コンピュータは、これにより照合／置換テーブルＴのポインタｐ４で指定されるレコードにアクセスすることができる。
【００７８】
（２９）そして、コンピュータは、照合／置換テーブルＴのポインタｐ４で指定されるレコードの圧縮符号長項目に、葉Ｌ＃（活）の構造体の圧縮符号長９ビットを書き込む。また、コンピュータは、照合／置換テーブルＴのポインタｐ４で指定されるレコードの圧縮符号項目に、葉Ｌ＃（活）の構造体の圧縮符号“００１１１００１０”を書き込む。さらに、コンピュータは、照合／置換テーブルＴのポインタｐ４で指定されるレコードの置換文字列項目に、「活」の置換文字列「＜ｃｏｌｏｒ＞活＜／ｃｏｌｏｒ＞」を書き込む。これにより、照合／置換テーブルＴ６は照合／置換テーブルＴ７に更新される。
【００７９】
図９は、基礎単語「結婚」が検索文字列として与えられた場合の照合／置換テーブルＴの作成例（その１）を示す説明図である。
【００８０】
（１）まず、コンピュータは、特殊単語の構造体１００において、検索文字列「結婚」を２分探索する。
【００８１】
（２）検索文字列「結婚」は特殊単語の構造体１００に登録されているため、ヒットする。そして、対応する葉Ｌ＃（結婚）へのポインタにより、２N分枝無節点ハフマン木の葉Ｌ＃（結婚）の構造体が指定される。図９の葉Ｌ＃（結婚）の構造体には、あらかじめ、基礎単語「結婚」の圧縮符号“０１０１００１００００００”、その圧縮符号長１３ビット、特殊単語の構造体１００の「結婚」へのポインタが格納されている。
【００８２】
（３）そして、コンピュータは、指定された葉Ｌ＃（結婚）の構造体の照合フラグをＯＮにする。
【００８３】
（４）また、コンピュータは、照合／置換テーブルＴの空きポインタｐ１を、葉Ｌ＃（結婚）の構造体内の照合／置換テーブルＴへのポインタとして設定する。コンピュータは、これにより照合／置換テーブルＴのポインタｐ１で指定されるレコードにアクセスすることができる。
【００８４】
（５）そして、コンピュータは、照合／置換テーブルＴのポインタｐ１で指定されるレコードの圧縮符号長項目に、葉Ｌ＃（結婚）の構造体の圧縮符号長１３ビットを書き込む。また、コンピュータは、照合／置換テーブルＴのポインタｐ１で指定されるレコードの圧縮符号項目に、葉Ｌ＃（結婚）の構造体の圧縮符号“０１０１００１００００００”を書き込む。さらに、コンピュータは、照合／置換テーブルＴのポインタｐ１で指定されるレコードの置換文字列項目に、「結婚」の置換文字列「＜ｃｏｌｏｒ＞結婚＜／ｃｏｌｏｒ＞」を書き込む。これにより、照合／置換テーブルＴ０は照合／置換テーブルＴ１に更新される。
【００８５】
図１０は、基礎単語「結婚」が検索文字列として与えられた場合の照合／置換テーブルＴの作成例（その２）を示す説明図である。
【００８６】
（６）つぎに、検索文字列「結婚」を単一文字「結」，「婚」に分割する。
【００８７】
（７）そして、コンピュータは、高位文字コードの構造体５００において、先頭の単一文字「結」を２分探索する。単一文字「結」は高出現頻度の文字であるため、高位文字コードの構造体５００でヒットすることとなる。このあと、対応する葉Ｌ＃（結）へのポインタにより、２N分枝無節点ハフマン木の葉Ｌ＃（結）の構造体が指定される。図１０の葉Ｌ＃（結）の構造体には、あらかじめ、高位文字「結」の圧縮符号“００００１００”、その圧縮符号長７ビット、高位文字コードの構造体５００の「結」へのポインタが格納されている。
【００８８】
（８）そして、コンピュータは、指定された葉Ｌ＃（結）の構造体の照合フラグをＯＮにする。
【００８９】
（９）また、コンピュータは、照合／置換テーブルＴの空きポインタｐ２を、葉Ｌ＃（結婚）の構造体内の照合／置換テーブルＴへのポインタとして設定する。コンピュータは、これにより照合／置換テーブルＴのポインタｐ２で指定されるレコードにアクセスすることができる。
【００９０】
（１０）そして、コンピュータは、照合／置換テーブルＴのポインタｐ２で指定されるレコードの圧縮符号長項目に、葉Ｌ＃（結）の構造体の圧縮符号長７ビットを書き込む。また、コンピュータは、照合／置換テーブルＴのポインタｐ２で指定されるレコードの圧縮符号項目に、葉Ｌ＃（結）の構造体の圧縮符号“００００１００”を書き込む。さらに、コンピュータは、照合／置換テーブルＴのポインタｐ２で指定されるレコードの置換文字列項目に、「結」の置換文字列「＜ｃｏｌｏｒ＞結＜／ｃｏｌｏｒ＞」を書き込む。これにより、照合／置換テーブルＴ１は照合／置換テーブルＴ２に更新される。
【００９１】
図１１は、基礎単語「結婚」が検索文字列として与えられた場合の照合／置換テーブルＴの作成例（その３）を示す説明図である。図１０の（１０）のあと、コンピュータは、高位文字コードの構造体５００において、検索文字列「結婚」のうち末尾文字「婚」を２分探索するが、図５に示したように、単一文字「婚」は低出現頻度の文字であるため、高位文字コードの構造体５００でヒットしない。
【００９２】
（１１）したがって、コンピュータは、高位文字コードの構造体５００でヒットしなかった低出現頻度の文字「婚」の文字コード「５Ａ５Ａ」を上位８ビット「０ｘ５Ａ」と下位８ビット「０ｘ５Ａ」とに分割する。ＵＴＦ１６ビットコードの文字は、８ビットコードの組み合わせで表現されるため、低出現頻度の文字については分割することで、低出現頻度の文字の総数を、たかだか２５６個に抑えることができる。
【００９３】
（１２）コンピュータは、分割文字コードの構造体６００において、（１１）で分割された上位分割文字コード「０ｘ５Ａ」を２分探索する。この場合、分割文字コード「０ｘ５Ａ」がヒットするため、対応する葉Ｌ＃（０ｘ５Ａ）へのポインタにより、２N分枝無節点ハフマン木の葉Ｌ＃（０ｘ５Ａ）の構造体が指定される。図１１の葉Ｌ＃（０ｘ５Ａ）の構造体には、あらかじめ、分割文字コード「０ｘ５Ａ」の圧縮符号“０１０１００１１０１１０”、その圧縮符号長１２ビット、分割文字コードの構造体６００の「０ｘ５Ａ」へのポインタが格納されている。
【００９４】
（１３）そして、コンピュータは、指定された葉Ｌ＃（０ｘ５Ａ）の構造体の照合フラグをＯＮにする。
【００９５】
（１４）また、コンピュータは、照合／置換テーブルＴの空きポインタｐ３を、葉Ｌ＃（０ｘ５Ａ）の構造体内の照合／置換テーブルＴへのポインタとして設定する。コンピュータは、これにより照合／置換テーブルＴのポインタｐ３で指定されるレコードにアクセスすることができる。
【００９６】
（１５）そして、コンピュータは、照合／置換テーブルＴのポインタｐ３で指定されるレコードの圧縮符号長項目に、葉Ｌ＃（０ｘ５Ａ）の構造体の圧縮符号長１２ビットを書き込む。また、コンピュータは、照合／置換テーブルＴのポインタｐ３で指定されるレコードの圧縮符号項目に、葉Ｌ＃（０ｘ５Ａ）の構造体の圧縮符号“０１０１００１１０１１０”を書き込む。さらに、コンピュータは、照合／置換テーブルＴのポインタｐ３で指定されるレコードの置換文字列項目に、「０ｘ５Ａ」の置換文字列「＜ｃｏｌｏｒ＞０ｘ５Ａ＜／ｃｏｌｏｒ＞」を書き込む。これにより、照合／置換テーブルＴ２は照合／置換テーブルＴ３に更新される。
【００９７】
下位分割文字コード「０ｘ５Ａ」についても、図６および図７のように、（１２）、（１４）、（１５）の処理をおこなう。具体的には、（１５）において、コンピュータは、上位分割文字コード「０ｘ５Ａ」の構造体で設定された照合／置換テーブルＴのポインタｐ３で特定される圧縮符号長１２ビットに、葉Ｌ＃（０ｘ５Ａ）の構造体に格納されている圧縮符号長１２ビットを加算して２４ビットとする。
【００９８】
また、コンピュータは、照合／置換テーブルＴへのポインタｐ３で特定される圧縮符号“０１０１００１１０１１０”の末尾に、葉Ｌ＃（０ｘ５Ａ）の構造体に格納されている圧縮符号“０１０１００１１０１１０”を連結する。さらに、コンピュータは、照合／置換テーブルＴへのポインタｐ３で特定される置換文字列「＜ｃｏｌｏｒ＞０ｘ５Ａ＜／ｃｏｌｏｒ＞」の末尾に、下位分割文字コード「０ｘ５Ａ」の置換文字列「＜ｃｏｌｏｒ＞０ｘ５Ａ＜／ｃｏｌｏｒ＞」を連結する。連結後の置換文字列は、以下のようになる。
【００９９】
「＜ｃｏｌｏｒ＞０ｘ５Ａ＜／ｃｏｌｏｒ＞＜ｃｏｌｏｒ＞０ｘ５Ａ＜／ｃｏｌｏｒ＞」
【０１００】
この場合、冗長さを回避するため、上位分割文字コード「０ｘ５Ａ」と下位分割文字コード「０ｘ５Ａ」との間の「＜／ｃｏｌｏｒ＞＜ｃｏｌｏｒ＞」を削除して、「＜ｃｏｌｏｒ＞婚＜／ｃｏｌｏｒ＞」を連結後の置換文字列とする。すなわち、終了タグと開始タグが連続した場合には削除する。これにより、照合／置換テーブルＴ２は照合／置換テーブルＴ３に更新される。これにより、単一文字「婚」についての更新は完了する。
【０１０１】
＜２N分枝無節点ハフマン木のサイズ決定方法＞
図１２は、２N分枝無節点ハフマン木のサイズ決定方法の一例を示す説明図である。文字情報群の総種類数Ｘが、どの範囲にあるかで、適用される２N分枝無節点ハフマン木のサイズが決定される。２N分枝無節点ハフマン木のサイズとは、最大枝数２Nである。べき数Ｎは、圧縮符号長の上限となる。したがって、２N分枝無節点ハフマン木のサイズを決定する場合は、べき数Ｎを文字情報群の総種類数Ｘに応じて決定すればよい。
【０１０２】
具体的には、文字情報群の総種類数Ｘが２x-2＜Ｘ≦２x-1である場合、少なくとも最大枝数２Nが２x-1本あればハフマン木が構築できる。サイズを最小限にするには、Ｎ＝ｘ−１とすればよい。また、文字情報群の総種類数Ｘが２x-1＜Ｘ≦２xである場合、少なくとも最大枝数２Nが２x本あればハフマン木が構築できる。サイズを最小限にするには、Ｎ＝ｘとすればよい。また、文字情報群の総種類数Ｘが２x＜Ｘ≦２x+1である場合、少なくとも最大枝数２Nが２x+1本あればハフマン木が構築できる。サイズを最小限にするには、Ｎ＝ｘ＋１とすればよい。
【０１０３】
たとえば、文字情報群の総種類数Ｘ＝１３０５個である場合、２10＜Ｘ≦２11となるため、最大枝数２Nのべき数Ｎは、Ｎ＝１１となる。したがって、２11分枝無節点ハフマン木が生成され、最大でも１１ビットの圧縮符号長の圧縮符号で文字情報を圧縮することができる。
【０１０４】
また、文字情報群の総種類数Ｘ＝３０４８個である場合、２11＜Ｘ≦２12となるため、最大枝数２Nのべき数Ｎは、Ｎ＝１２となる。したがって、２12分枝無節点ハフマン木が生成され、最大でも１２ビットの圧縮符号長の圧縮符号で文字情報を圧縮することができる。
【０１０５】
さらに、文字情報群の総種類数Ｘ＝５４０１個である場合、２12＜Ｘ≦２13となるため、最大枝数２Nのべき数Ｎは、Ｎ＝１３となる。したがって、２13分枝無節点ハフマン木が生成され、最大でも１３ビットの圧縮符号長の圧縮符号で文字情報を圧縮することができる。
【０１０６】
＜２N分枝無節点ハフマン木の生成までの流れ＞
図１３は、２N分枝無節点ハフマン木の生成までの流れを示す説明図である。
【０１０７】
（１）出現回数の集計
まず、コンピュータは、対象ファイル群に存在する文字情報の出現回数を計数する。計数対象となる対象ファイル群は、たとえば、文書ファイル、Ｗｅｂページなどの電子データであり、たとえば、テキスト形式、ＨＴＭＬ（ＨｙｐｅｒＴｅｘｔ  Ｍａｒｋｕｐ  Ｌａｎｇｕａｇｅ）形式、ＸＭＬ（Ｅｘｔｅｎｓｉｂｌｅ  Ｍａｒｋｕｐ  Ｌａｎｇｕａｇｅ）形式の電子データである。また、単一の対象ファイルを計数対象としてもよい。集計結果は、出現回数の降順にソートされ、出現回数の大きい方から昇順の順位がつけられる。なお、ここでは、文字情報の総種類数は、例として１３０５個（＜２０４８（＝２11））とする。
【０１０８】
（２）圧縮符号長算出
つぎに、（１）で得られた集計結果を基にして、コンピュータは、文字情報ごとの圧縮符号長を算出する。具体的には、コンピュータは、文字情報ごとに、出現率を算出する。出現率は、文字情報の出現回数を全文字情報の総出現回数で割ることで得られる。そして、コンピュータは、出現率に対応する生起確率を求め、生起確率から圧縮符号長を導き出す。
【０１０９】
生起確率は、１／２xで表現される。ｘはべき数である。圧縮符号長は、生起確率のべき数ｘとなる。具体的には、出現率が生起確率の以下のどの範囲であるかで圧縮符号長が決定される。ＡＲは出現率である。
１／２0＞ＡＲ≧１／２1・・・圧縮符号長は１ビット。
１／２1＞ＡＲ≧１／２2・・・圧縮符号長は２ビット。
１／２2＞ＡＲ≧１／２3・・・圧縮符号長は３ビット。
１／２3＞ＡＲ≧１／２4・・・圧縮符号長は４ビット。
・
・
・
１／２N-1＞ＡＲ≧１／２N・・・圧縮符号長はＮビット。
【０１１０】
（３）葉数特定
つぎに、コンピュータは、圧縮符号長ごとに葉数を集計することで圧縮符号長ごとの葉数を特定する。図１３では、最大圧縮符号長は１７ビットとする。また、葉数とは、文字情報の種類数である。したがって、圧縮符号長５ビットの葉数が２である場合、５ビットの圧縮符号が割り当てられる文字情報が２つ存在することを示している。
【０１１１】
（４）葉数補正
つぎに、コンピュータは、葉数を補正する。具体的には、コンピュータは、枝数の上限２Nのべき数Ｎが最大圧縮符号長となるように補正する。たとえば、べき数Ｎ＝１１の場合、圧縮符号長１１ビット〜１７ビットまでの葉数の総和を、補正後の圧縮符号長１１ビットの葉数にする。そして、コンピュータは、圧縮符号長ごとに葉当たりの枝数を割り当てる。具体的には、補正後の圧縮符号長に対し、その降順に、２0、２1、２2、２3、２4、２5、２6、２7として葉当たりの枝数を決定する。
【０１１２】
たとえば、図１３では、圧縮符号長１１ビットの圧縮符号が割り当てられる文字情報の総数（葉数）は１２１５個であるが、その葉当たりの枝数は１である。圧縮符号長１１ビットの圧縮符号が割り当てられる文字情報については、それぞれ１本の枝しか割り当てられないこととなる。一方、圧縮符号長６ビットの圧縮符号が割り当てられる文字情報の総数（葉数）は６個であるが、その葉当たりの枝数は３２である。圧縮符号長６ビットの圧縮符号が割り当てられる文字情報については、それぞれ３２本の枝が割り当てられることとなる。
【０１１３】
（５）葉の構造体生成
つぎに、コンピュータは、葉の構造体を生成する。葉の構造体とは、文字情報とその圧縮符号長とその圧縮符号長での圧縮符号が対応付けられたデータ構造体である。たとえば、出現順位が１位である文字「０」の圧縮符号長は６ビットであり、圧縮符号は「００００００」となる。図１３の例では、文字情報の種類数（葉数）は１３０５個であるため、葉Ｌ１の構造体〜葉Ｌ１３０５の構造体が生成されることとなる。
【０１１４】
（６）葉へのポインタ生成
つぎに、コンピュータは、葉の構造体ごとに葉へのポインタを生成する。葉へのポインタは、そのポイント先となる葉の構造体内の圧縮符号に、その葉当たりの枝数分の番号に相当するビット列を連結したビット列である。たとえば、葉Ｌ１である文字「０」に割り当てられた圧縮符号「００００００」の圧縮符号長は６ビットであるため、葉Ｌ１当たりの枝数は３２本である。
【０１１５】
したがって、葉Ｌ１へのポインタの先頭６ビットは、圧縮符号「００００００」となる。後続ビット列は、葉Ｌ１当たりの枝数で表現される３２（＝２5）種のビット列となる。すなわち、３２種の５ビットのビット列が圧縮符号「００００００」の後続ビット列となる。したがって、葉Ｌ１へのポインタは、先頭６ビットが「００００００」で固定された３２種の１１ビットのビット列となる。なお、葉当たりの枝数が１本の場合は、葉へのポインタは１個であり、圧縮符号とその葉へのポインタは同一ビット列となる。
【０１１６】
（７）２N分枝無節点ハフマン木の構築
最後に、コンピュータは、２N分枝無節点ハフマン木を構築する。具体的には、葉のポインタを根とすることで、葉の構造体を直接指定する２N分枝無節点ハフマン木が構築される。圧縮符号列が、先頭６ビットが「００００００」の１１ビットのビット列である場合、後続の５ビットが３２種のいずれのビット列であっても、２N分枝無節点ハフマン木により文字「０」の葉Ｌ１の構造体をポイントすることができる。
【０１１７】
＜（１）出現回数の集計の詳細＞
図１４は、図２の（１）出現回数の集計の詳細を示す説明図である。コンピュータは、対象ファイル群Ｆｓ内の文字コードについて出現回数を集計して降順にソートする。そして、高位（たとえば、１〜１０２４位まで）の文字コードと低位（１０２５位以下）の文字コードに分ける。
【０１１８】
高位の文字コードは出現頻度が高いため、１６ビットコードとして圧縮符号を割り当てる。低位の文字コードは、上位８ビットと下位８ビットに分割する。１６ビットコードでは最大で６５５３６（２５６×２５６）種の文字を扱えるが、低位の文字コードを、８ビットで分割することにより、６万種以上ある低位の文字コードを２５６種の分割文字コードに抑えることができる。
【０１１９】
たとえば、漢字の「兎」の１６ビットの文字コードは“０ｘ５１４Ｅ”であるため、上位８ビット“０ｘ５１”と下位８ビット“０ｘ４Ｅ”に分割する。同様に、漢字の「兆」の１６ビットの文字コードは“０ｘ５１４６”であるため、上位８ビット“０ｘ５１”と下位８ビット“０ｘ４６”に分割する。そして、分割された８ビットの分割文字コードの出現頻度を集計する。この「兎」および「兆」の例では、分割文字コード“０ｘ５１”の出現頻度は２回、分割文字コード“０ｘ４Ｅ”，“０ｘ４６”は１回となる。
【０１２０】
また、＜ｐ＞や＜ｐ／＞といったタグなどを予約語とする。予約語は数十種（例として２５種）決めておく。また、必要に応じて基礎単語も決めておく。基礎単語は例として４０９６種としておく。そして、高位文字コード群、分割文字コード群および予約語群、基礎単語群を混在させて出現頻度を再集計し、出現頻度の降順に再ソートする。再ソート結果が図１３の集計結果となる。
【０１２１】
基礎単語群を集計しない場合、出現頻度の降順にソートされた１３０５種の文字情報が得られる。文字情報の種類数をこの程度の数に抑えることで、１６ビットの文字コードを１２ビット以下の圧縮符号に圧縮し、圧縮符号を１６ビットの文字コードに伸長することが可能となる。
【０１２２】
また、基礎単語群を集計する場合、出現頻度の降順にソートされた５４０１種の文字情報が得られる。４０９６種の基礎単語を集計すると、１６ビットの文字コードを１３ビット以下の圧縮符号に圧縮することができ、圧縮符号を１６ビットの文字コードに伸長することが可能となる。また、基礎単語は１６ビットコードが複数連結された文字列であるため、文字数がｎ個である場合、ｎ×１６ビットコードをたかだか１３ビット以下の圧縮符号に圧縮でき、その圧縮符号をｎ×１６ビットコードの基礎単語に伸長することができる。
【０１２３】
つぎに、出現マップ群１５０１〜１５０３について説明する。出現マップ群とは、出現マップの集合である。出現マップ群は、高位文字、分割文字コード、特殊単語ごとに用意される。各出現マップ群を構成する出現マップは、文字情報ごとに存在する対象ファイルの番号に対応するビットをＯＮ（たとえば、１）にし、存在しない対象ファイルの番号に対応するビットをＯＦＦ（たとえば、０）にしたビット列である。出現マップは、対象ファイル群Ｆｓを対象ファイルごとに集計する際に生成される。
【０１２４】
図１５は、文字情報が高位文字である場合の出現マップ群１５０１を示す説明図である。図１５の出現マップ群１５０１では、高位文字ごとに、対象ファイル数ｎ個分のビット列が設定されている。ビット列のうち「１」になっているファイル番号の対象ファイルに、その高位文字が少なくとも１回出現したことを示している。たとえば、高位文字「結」は、対象ファイルＦ１、Ｆ３に少なくとも１回出現し、対象ファイルＦ２，Ｆｎには１回も出現しない。
【０１２５】
図１６は、文字情報が分割文字コードである場合の出現マップ群１５０２を示す説明図である。図１６の出現マップ群１５０２では、分割文字コードごとに、対象ファイル数ｎ個分のビット列が設定されている。ビット列のうち「１」になっているファイル番号の対象ファイルに、その分割文字コードが少なくとも１回出現したことを示している。たとえば、分割文字コード「０ｘ５Ａ」は、対象ファイルＦ１〜Ｆ３に少なくとも１回出現し、対象ファイルＦｎには１回も出現しない。すなわち、分割文字コード「０ｘ５Ａ」を上位ビットまたは下位ビットとする文字が対象ファイルＦ１〜Ｆ３に存在する。
【０１２６】
図１７は、文字情報が特殊単語である場合の出現マップ群１５０３を示す説明図である。図１７の出現マップ群１５０３では、特殊単語ごとに、対象ファイル数ｎ個分のビット列が設定されている。ビット列のうち「１」になっているファイル番号の対象ファイルに、その特殊単語が少なくとも１回出現したことを示している。たとえば、特殊単語「結婚」は、対象ファイルＦ３に少なくとも１回出現し、対象ファイルＦ１，Ｆ２，Ｆｎには１回も出現しない。
【０１２７】
＜（２）圧縮符号長算出の詳細（Ｎ＝１１）＞
図１８は、図１３の（２）圧縮符号長算出の詳細（Ｎ＝１１）を示す説明図である。図１８の文字情報テーブルは、図１４の集計結果を反映したテーブルであり、文字情報ごとに順位項目、伸長種別項目、コード項目、文字項目、出現回数項目、総回数項目、出現率項目、補正前での生起確率項目および圧縮符号長項目が設定されている。このうち、順位項目〜総回数項目までが図３の再ソート結果で得られた情報である。
【０１２８】
ここで、順位項目には、文字情報の出現回数の降順に順位（昇順）が書き込まれている。文字情報項目のうち伸長種別項目には、文字情報の種別が書き込まれる。「１６」は１６ビットコード（の単一文字）を示している。「８」は８ビットの分割文字コードを示している。「特」は特殊単語（基礎単語または予約語）を示している。
【０１２９】
文字情報項目のうちコード項目には、高位文字コードまたは分割文字コードが書き込まれている。特殊単語の場合は空欄とする。文字情報項目のうち文字項目には、文字や特殊単語が書き込まれている。分割文字コードの場合は空欄とする。出現回数項目には、対象ファイル群Ｆｓでの文字情報の出現回数が書き込まれている。総回数項目には、全文字情報の総出現回数が書き込まれている。
【０１３０】
出現率項目には、出現回数を総回数で割り算した値が出現率として書き込まれている。補正前項目の生起確率項目には、出現率に対応する生起確率が書き込まれている。圧縮符号長項目には、生起確率に応じた圧縮符号長、すなわち、生起確率１／２yのべき数ｙが圧縮符号長として書き込まれている。
【０１３１】
＜（３）葉数特定〜（５）葉の構造体生成の詳細（Ｎ＝１１）＞
図１９は、図１３の（３）葉数特定〜（５）葉の構造体生成の詳細（Ｎ＝１１）を示す説明図である。図１８の文字情報テーブルを圧縮符号長単位で葉数（文字情報の総種類数）を集計した結果が、図１９における補正前の葉数となる。ここで、補正Ａとは、圧縮符号長の上限長Ｎ（すなわち、２N分枝無節点ハフマン木の最大枝数２Nのべき数Ｎ）以上の圧縮符号長に割り当てられた葉数を、圧縮符号長の上限長Ｎに集約する補正である。この場合、補正前での最大圧縮符号長は１７ビットであるが、文字情報の総種類数が１３０５種であるため、圧縮符号長の上限長Ｎは、Ｎ＝１１となる。したがって、補正Ａでは、圧縮符号長１１ビットの葉数が、圧縮符号長が１１ビット〜１７ビットの葉数の総和（１１９０個）となる。
【０１３２】
そして、コンピュータは、生起確率総和を求める。圧縮符号長ごとの生起確率は決められているため（５ビットなら１／２5）、圧縮符号長ごとに生起確率を葉数で乗じることで、圧縮符号長ごとの乗算結果が得られる。たとえば、補正Ａにおける圧縮符号長５ビットの葉数は２である。圧縮符号長５ビットの生起確率は、１／２5である。したがって、補正Ａにおける圧縮符号長５ビットの生起確率は、２×（１／２5）＝１／２4となる。圧縮符号長６ビット以降も同様に補正Ａにおける圧縮符号長生起確率を求める。そして、補正Ａ後における各圧縮符号長の生起確率を合計することで、補正Ａでの生起確率総和が得られる。
【０１３３】
そして、コンピュータは、生起確率総和が１以下であるか否かを判断する。しきい値ｔは０＜ｔ≦１である。しきい値ｔを設けたくない場合は、ｔ＝１とすればよい。しきい値ｔ未満であれば、補正Ｂに移行する。しきい値ｔ以上１以下である場合は、補正Ｂに移行せず、この時点での圧縮符号長ごとの葉数で確定する。
【０１３４】
補正Ｂは、補正Ａでの圧縮符号長群（５ビット〜１２ビット）は変えずに、葉数を更新する補正である。具体的には、補正Ａでの生起確率総和が、しきい値ｔ以上１以下でない場合におこなわれる補正である。より具体的には、補正Ｂは２種類ある。
【０１３５】
１つ目は、生起確率総和がしきい値ｔ未満である場合、生起確率総和が１以下の最大値が得られるまで、たとえば、最大漸近値に収束するまで、生起確率総和を増加させる補正（以下、補正Ｂ+）である。もう１つは、生起確率総和が１より大きい場合、生起確率総和が１以下に割り込んでから１以下の最大値が得られるまで、たとえば、最大漸近値に収束するまで、生起確率総和を減少させる補正（以下、補正Ｂ-）である。
【０１３６】
図１９に示した例では、補正Ａでの生起確率総和が「１．１４６」であるため、補正Ｂ-をおこなうこととなる。なお、補正Ｂ+および補正Ｂ-のいずれの補正Ｂであっても、葉数を生起確率総和で割るという同じ補正をおこなう。
【０１３７】
まず、補正Ｂ-の１回目（補正Ｂ-１）では、圧縮符号長ごとの補正Ａでの葉数を、前回の補正（この場合は補正Ａ）の生起確率の総和（１．１４６）で割ることで、葉数を更新する。なお、小数点以下は切り捨てでも、四捨五入でもよい。なお、補正Ａでの圧縮符号長の上限長Ｎ（Ｎ＝１１ビット）については、前回の補正（この場合は補正Ａ）の生起確率総和（１．１４６）で割ることはせず、葉の総数（１３０５個）から、補正Ｂ-１での圧縮符号長ごとの葉の総数（圧縮符号長の上限長Ｎの葉数除く）を引くことで、圧縮符号長の上限長Ｎの葉数を求める。この場合は、１２０８個である。
【０１３８】
このあと、コンピュータは、補正Ａの場合と同様の計算処理により、補正Ｂ-１での生起確率総和を求める。そして、コンピュータは、補正Ｂ-１での生起確率総和が１以下の最大漸近値に収束したか否かを判断する。補正Ｂ-１での生起確率総和が１以下の最大漸近値に収束していなければ、補正Ｂ-の２回目（補正Ｂ-２）に移行する。最大漸近値に収束した場合は、補正Ｂ-２に移行せず、この時点での圧縮符号長ごとの葉数で確定する。補正Ｂ-１で更新された生起確率総和「１．０４２」は１より大きいため、最大漸近値に収束しておらず、補正Ｂ-２に移行する。
【０１３９】
補正Ｂ-２では、圧縮符号長ごとの補正Ｂ-１での葉数を、前回の補正（この場合は補正Ｂ-１）の生起確率総和（１．０４２）で割ることで、葉数を更新する。なお、小数点以下は切り捨てでも、四捨五入でもよい。なお、補正Ｂ-１での圧縮符号長の上限長Ｎ（Ｎ＝１１ビット）については、前回の補正（この場合は補正Ｂ-１）の生起確率総和（１．０４２）で割ることはせず、葉の総数（１３０５個）から、補正Ｂ-２での圧縮符号長ごとの葉の総数（圧縮符号長の上限長Ｎの葉数除く）を引くことで、圧縮符号長の上限長Ｎの葉数を求める。この場合は、１２１５個である。
【０１４０】
このあと、コンピュータは、補正Ｂ-１の場合と同様の計算処理により、補正Ｂ-２での生起確率総和を求める。そして、コンピュータは、補正Ｂ-２での生起確率総和が１以下の最大漸近値に収束したか否かを判断する。補正Ｂ-２での生起確率総和が１以下の最大漸近値に収束していなければ、補正Ｂ-の３回目（補正Ｂ-３）に移行する。最大漸近値に収束した場合は、補正Ｂ-３に移行せず、この時点での圧縮符号長ごとの葉数で確定する。補正Ｂ-２で更新された生起確率総和「０．９８２」は１以下であるが、最大漸近値に収束しているかが不明であるため、補正Ｂ-３に移行する。
【０１４１】
補正Ｂ-３では、圧縮符号長ごとの補正Ｂ-２での葉数を、前回の補正（この場合は補正Ｂ-２）の生起確率総和（０．９８２）で割ることで、葉数を更新する。なお、小数点以下は切り捨てでも、四捨五入でもよい。なお、補正Ｂ-２での圧縮符号長の上限長Ｎ（Ｎ＝１１ビット）については、前回の補正（この場合は補正Ｂ-２）の生起確率総和（０．９８２）で割ることはせず、葉の総数（１３０５個）から、補正Ｂ-３での圧縮符号長ごとの葉の総数（圧縮符号長の上限長Ｎの葉数除く）を引くことで、圧縮符号長の上限長Ｎの葉数を求める。この場合は、１２１５個である。
【０１４２】
このあと、コンピュータは、補正Ｂ-２の場合と同様の計算処理により、補正Ｂ-３での生起確率総和を求める。そして、コンピュータは、補正Ｂ-３での生起確率総和が１以下の最大漸近値に収束したか否かを判断する。補正Ｂ-３での生起確率総和が１以下の最大漸近値に収束していなければ、補正Ｂ-の４回目（補正Ｂ-４）に移行する。最大漸近値に収束した場合は、補正Ｂ-４に移行せず、この時点での圧縮符号長ごとの葉数で確定する。補正Ｂ-３で更新された生起確率総和「０．９８２」は、補正Ｂ-２で更新された生起確率総和「０．９８２」と同じ値である。すなわち、補正Ｂ-３での各圧縮符号長の葉数と補正Ｂ-２での各圧縮符号長の葉数とは同じである。この場合、コンピュータは、生起確率総和が最大漸近値に収束したと判断し、葉数が確定する。
【０１４３】
このようにして、葉数が確定するまで補正Ｂ-を継続することとなる。図１９の例では、補正Ｂ-３で圧縮符号長ごとの葉数が確定したこととなる。このあと、コンピュータは、圧縮符号長ごとに、葉当たりの枝数を算出することとなる。葉当たりの枝数の算出は、上述したように、圧縮符号長の上限長Ｎ（この場合はＮ＝１１ビット）から降順に、２0、２1、２2、２3、２4、２5、２6として葉当たりの枝数を割り当てることとなる。なお、枝数の小計は、圧縮符号長ごとに、葉当たりの枝数に確定した葉数を乗じた乗算結果である。
【０１４４】
図２０は、文字情報ごとの補正結果を示す説明図である。図２０において、文字情報テーブルには、補正Ａ、補正Ｂ-１〜補正Ｂ-２までの補正結果が追加されている。図１９に示したように、補正により圧縮符号長別の葉数が更新されるため、順位項目の１位の文字情報から短い圧縮符号長が割り当てられることとなる。
【０１４５】
たとえば、補正Ｂ-２で確定した場合、圧縮符号長６ビットでは葉数が６、圧縮符号長７ビットでは葉数が１８、…、圧縮符号長１１ビットでは葉数が１２１５となっている。したがって、順位が１位から６位までの文字情報（葉数６個分）については６ビットの圧縮符号長、順位が７位から２４位までの文字情報（葉数１８個分）については７ビットの圧縮符号長、…、順位が９１位から１３０５位までの文字情報（葉数１２１５個分）については１１ビットの圧縮符号長が割り当てられる。
【０１４６】
そして、コンピュータは、文字情報と文字情報に割り当てられた圧縮符号長と圧縮符号長ごとの葉数とに基づいて、文字情報ごとに圧縮符号を割り当て、葉の構造体を生成することとなる。たとえば、出現率１位の高位文字「０」は５ビットの圧縮符号長が割り当てられているため、圧縮符号が「００００００」となる。したがって、圧縮符号「００００００」、圧縮符号長「６」、文字情報「０」を含む葉Ｌ１の構造体が生成されることとなる。
【０１４７】
＜（６）葉へのポインタ生成の詳細（Ｎ＝１１）＞
図２１は、葉へのポインタ生成の詳細（Ｎ＝１１）を示す説明図である。図２１は、圧縮符号長の上限Ｎが１１ビットの場合の葉へのポインタを示している。図２１において、圧縮符号長が６ビットの葉数は６個であるため、圧縮符号は「００００００」〜「０００１０１」が割り当てられる。また、圧縮符号長が６ビットの葉当たりの枝数は、３２本である。したがって、圧縮符号長が６ビットの圧縮符号についての葉へのポインタは、３２（＝２5）個生成される。具体的には、葉へのポインタの先頭６ビットが圧縮符号で後続５ビットが３２種のビット列となる。したがって、圧縮符号長が６ビットの圧縮符号の各々について、３２種の葉へのポインタが生成されることとなる。
【０１４８】
なお、図示はしないが、圧縮符号長が７ビットの葉数は１８個であるため、圧縮符号「０００１１００」〜「００１１１１１」が割り当てられる。また、圧縮符号長が７ビットの葉当たりの枝数は、１６本である。したがって、圧縮符号長が７ビットの圧縮符号についての葉へのポインタは、１６（＝２4）個生成される。具体的には、葉へのポインタの先頭７ビットが圧縮符号で後続４ビットが１６種のビット列となる。したがって、圧縮符号長が７ビットの圧縮符号の各々について、１６種の葉へのポインタが生成されることとなる。
【０１４９】
同様に、圧縮符号長が８ビットの葉数は２３個であるため、圧縮符号「０１００００００」〜「０１０１０１１０」が割り当てられる。また、圧縮符号長が８ビットの葉当たりの枝数は、８本である。したがって、圧縮符号長が８ビットの圧縮符号についての葉へのポインタは、８（＝２3）個生成される。具体的には、葉へのポインタの先頭８ビットが圧縮符号で後続３ビットが８種のビット列となる。したがって、圧縮符号長が８ビットの圧縮符号の各々について、８種の葉へのポインタが生成されることとなる。
【０１５０】
同様に、圧縮符号長が９ビットの葉数は２３個であるため、圧縮符号「０１０１０１１１０」〜「０１１０００１００」が割り当てられる。また、圧縮符号長が９ビットの葉当たりの枝数は、４本である。したがって、圧縮符号長が９ビットの圧縮符号についての葉へのポインタは、４（＝２2）個生成される。具体的には、葉へのポインタの先頭９ビットが圧縮符号で後続２ビットが４種のビット列となる。したがって、圧縮符号長が９ビットの圧縮符号の各々について、４種の葉へのポインタが生成されることとなる。
【０１５１】
同様に、圧縮符号長が１０ビットの葉数は２０個であるため、圧縮符号「０１１００００１１０」〜「０１１００１１１０１」が割り当てられる。また、圧縮符号長が１０ビットの葉当たりの枝数は、２本である。したがって、圧縮符号長が１０ビットの圧縮符号についての葉へのポインタは、２（＝２1）個生成される。具体的には、葉へのポインタの先頭１０ビットが圧縮符号で後続１ビットが２種のビット列となる。したがって、圧縮符号長が１０ビットの圧縮符号の各々について、２種の葉へのポインタが生成されることとなる。
【０１５２】
同様に、圧縮符号長が１１ビットの葉数は１２１５個であるため、圧縮符号「０１１００１１１１００」〜「１１１１１１１１０１０」が割り当てられる。また、圧縮符号長が１１ビットの葉当たりの枝数は、１本である。したがって、圧縮符号長が１１ビットの圧縮符号についての葉へのポインタは、１（＝２0）個生成される。具体的には、圧縮符号がそのまま葉へのポインタとなる。したがって、圧縮符号長が１１ビットの圧縮符号の各々について、１種の葉へのポインタが生成されることとなる。
【０１５３】
＜（７）２N分枝無節点ハフマン木の構築の詳細（Ｎ＝１１）＞
図２２は、図１３の（７）２N分枝無節点ハフマン木の構築の詳細（Ｎ＝１１）を示す説明図である。図２２では、Ｎ＝１１とした場合の２０４８（＝２11）分枝無節点ハフマン木を示している。根の構造体には、葉へのポインタが格納されている。葉へのポインタはポイント先の葉の構造体を指定することができる。
【０１５４】
具体的には、圧縮符号長が６ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図２１に示したように３２個生成される。したがって、葉Ｌ１の構造体については、根の構造体に３２個の葉Ｌ１へのポインタＬ１Ｐ（１）〜Ｌ１Ｐ（３２）が格納される。葉Ｌ２の構造体〜葉Ｌ６の構造体についても同様である。葉Ｌ７以降の構造体については、図２２のとおりである。
【０１５５】
＜（３）葉数特定〜（５）葉の構造体生成の詳細（Ｎ＝１２）＞
図２３は、図１３の（３）葉数特定〜（５）葉の構造体生成の詳細（Ｎ＝１２）を示す説明図である。なお、Ｎ＝１２の場合は、図１８の文字情報テーブルには、たとえば１０２４種の基礎単語のレコードも追加されることとなる。基礎単語は、１３０５種の文字コード、分割文字コード、予約語よりも、出現回数が低いこととする。したがって、１３０５種に１０２４種を追加した２３２９種の文字情報についての文字情報テーブルが生成されているものとする。また、基礎単語の追加により、図１８の総回数がかわるため、２３２９種の文字情報の生起確率も図１８に示した値とは異なることとなる。
【０１５６】
そして、コンピュータは、図１９の場合と同様に、生起確率総和を求める。そして、コンピュータは、生起確率総和がしきい値ｔ以上１以下であるか否かを判断する。しきい値ｔ未満であれば、補正Ｂに移行する。しきい値ｔ以上１以下である場合は、補正Ｂに移行せず、この時点での圧縮符号長ごとの葉数で確定する。
【０１５７】
図２３の例では、補正Ａでの生起確率総和「０．８２３」はしきい値ｔ未満であるとして、補正Ｂ+をおこなうこととする。
【０１５８】
まず、補正Ｂ+の１回目（補正Ｂ+１）では、圧縮符号長ごとの補正Ａの葉数を、前回の補正（この場合は補正Ａ）の生起確率総和（０．８２３）で割ることで、葉数を更新する。なお、小数点以下は切り捨てでも、四捨五入でもよい。なお、補正Ａでの圧縮符号長の上限長Ｎ（Ｎ＝１２ビット）については、前回の補正（この場合は補正Ａ）の生起確率総和（０．８２３）で割ることはせず、葉の総数（２３２９個）から、補正Ｂ+１での圧縮符号長ごとの葉の総数（圧縮符号長の上限長Ｎの葉数除く）を引くことで、圧縮符号長の上限長Ｎの葉数を求める。この場合は、２１９２個である。
【０１５９】
このあと、コンピュータは、補正Ａの場合と同様の計算処理により、補正Ｂ+１での生起確率総和を求める。そして、コンピュータは、補正Ｂ+１での生起確率総和が１以下の最大漸近値に収束したか否かを判断する。補正Ｂ+１での生起確率総和が１以下の最大漸近値に収束していなければ、補正Ｂ+の２回目（補正Ｂ+２）に移行する。１以下の最大漸近値に収束した場合は、補正Ｂ+２に移行せず、この時点での圧縮符号長ごとの葉数で確定する。補正Ｂ+１で更新された生起確率総和「０．８６１」は１以下であるが、最大漸近値に収束しているかが不明であるため、補正Ｂ+２に移行する。
【０１６０】
補正Ｂ+２では、圧縮符号長ごとの補正Ｂ+１での葉数を、前回の補正（この場合は補正Ｂ+１）の生起確率総和（０．８６１）で割ることで、葉数を更新する。なお、小数点以下は切り捨てでも、四捨五入でもよい。なお、補正Ｂ+２での圧縮符号長の上限長Ｎ（Ｎ＝１２ビット）については、前回の補正（この場合は補正Ｂ+１）の生起確率総和（０．８６１）で割ることはせず、葉の総数（２３２９個）から、補正Ｂ+２での圧縮符号長ごとの葉の総数（圧縮符号長の上限長Ｎの葉数除く）を引くことで、圧縮符号長の上限長Ｎの葉数を求める。この場合は、２１７３個である。
【０１６１】
このあと、コンピュータは、補正Ｂ+１の場合と同様の計算処理により、補正Ｂ+２での生起確率総和を求める。そして、コンピュータは、補正Ｂ+２での生起確率総和が１以下の最大漸近値に収束したか否かを判断する。補正Ｂ+２での生起確率総和が１以下の最大漸近値に収束していなければ、補正Ｂ+の３回目（補正Ｂ+３）に移行する。１以下の最大漸近値に収束した場合は、補正Ｂ+３に移行せず、この時点での圧縮符号長ごとの葉数で確定する。補正Ｂ+２で更新された生起確率総和「０．８９７」は１以下であるが、補正Ｂ+１で更新された生起確率総和「０．８６１」よりも大きい。すなわち、補正Ｂ+１での生起確率総和は最大漸近値ではなく、補正Ｂ+２での生起確率総和は最大漸近値に収束しているかが不明であるため、補正Ｂ+３に移行する。
【０１６２】
このようにして、葉数が確定するまで補正Ｂ+を継続することとなる。図２３の例では、補正Ｂ+１０で更新された生起確率総和「０．９８４」は、補正Ｂ+１１で更新された生起確率総和「０．９８４」と同じ値である。すなわち、補正Ｂ+１０での各圧縮符号長の葉数と補正Ｂ+１１での各圧縮符号長の葉数とは同じである。この場合、コンピュータは、補正Ｂ+１０において、生起確率総和が最大漸近値に収束したと判断し、葉数が確定する。
【０１６３】
このあと、コンピュータは、圧縮符号長ごとに、葉当たりの枝数を算出することとなる。葉当たりの枝数の算出は、上述したように、圧縮符号長の上限長Ｎ（この場合はＮ＝１２ビット）から降順に、２0、２1、２2、２3、２4、２5、２6として葉当たりの枝数を割り当てることとなる。なお、枝数の小計は、圧縮符号長ごとに、葉当たりの枝数に確定した葉数を乗じた乗算結果である。
【０１６４】
＜（６）葉へのポインタ生成の詳細（Ｎ＝１２）＞
図２４は、葉へのポインタ生成の詳細（Ｎ＝１２）を示す説明図である。図２４は、圧縮符号長の上限Ｎが１２ビットの場合の葉へのポインタを示している。図２４において、圧縮符号長が６ビットの葉数は２個であるため、圧縮符号「００００００」，「０００００１」が割り当てられる。また、圧縮符号長が６ビットの葉当たりの枝数は、６４本である。したがって、圧縮符号長が６ビットの圧縮符号についての葉へのポインタは、６４（＝２6）個生成される。具体的には、葉へのポインタの先頭６ビットが圧縮符号で後続６ビットが６４種のビット列となる。したがって、圧縮符号長が６ビットの圧縮符号の各々について、６４種の葉へのポインタが生成されることとなる。
【０１６５】
また、図示はしないが、圧縮符号長が７ビットの圧縮符号の各々について、３２種の葉へのポインタが生成されることとなる。同様に、圧縮符号長が８ビットの圧縮符号の各々について、１６種の葉へのポインタが生成されることとなる。同様に、圧縮符号長が９ビットの圧縮符号の各々について、８種の葉へのポインタが生成されることとなる。同様に、圧縮符号長が１０ビットの圧縮符号の各々について、４種の葉へのポインタが生成されることとなる。同様に、圧縮符号長が１１ビットの圧縮符号の各々について、２種の葉へのポインタが生成されることとなる。同様に、圧縮符号長が１２ビットの圧縮符号の各々について、１種の葉へのポインタが生成されることとなる。
【０１６６】
＜（７）２N分枝無節点ハフマン木の構築の詳細（Ｎ＝１２）＞
図２５は、（７）２N分枝無節点ハフマン木の構築の詳細（Ｎ＝１２）を示す説明図である。図２５では、Ｎ＝１２とした場合の４０９６（＝２12）分枝無節点ハフマン木を示している。根の構造体には、葉へのポインタが格納されている。葉へのポインタはポイント先の葉の構造体を指定することができる。
【０１６７】
具体的には、圧縮符号長が６ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、６４個生成される。したがって、葉Ｌ１の構造体については、根の構造体に６４個の葉Ｌ１へのポインタＬ１Ｐ（１）〜Ｌ１Ｐ（６４）が格納される。葉Ｌ２の構造体についても同様である。葉Ｌ３以降の構造体については、図２５のとおりである。
【０１６８】
＜（３）葉数特定〜（５）葉の構造体生成の詳細（Ｎ＝１３）＞
図２６は、図１３の（３）葉数特定〜（５）葉の構造体生成の詳細（Ｎ＝１３）を示す説明図である。なお、Ｎ＝１３の場合は、図１８の文字情報テーブルには、たとえば４０９６種の基礎単語のレコードも追加されることとなる。基礎単語は、１３０５種の文字コード、分割文字コード、予約語よりも、出現回数が低いこととする。したがって、１３０５種に４０９６種を追加した５４０１種の文字情報についての文字情報テーブルが生成されているものとする。また、基礎単語の追加により、図１８の総回数がかわるため、５４０１種の文字情報の生起確率も図１９に示した値とは異なることとなる。図２６に示した例では、補正Ａでの生起確率総和が「０．８７７」であるため、補正Ｂ+が行われることとなる。
【０１６９】
＜（６）葉へのポインタ生成の詳細（Ｎ＝１３）＞
図２７は、葉へのポインタ生成の詳細（Ｎ＝１３）を示す説明図である。図２７は、圧縮符号長の上限ＮがＮ＝１３ビットの場合の葉へのポインタを示している。図２７において、圧縮符号長が６ビットの葉数は２個であるため、圧縮符号「００００００」，「０００００１」が割り当てられる。また、圧縮符号長が６ビットの葉当たりの枝数は、１２８本である。したがって、圧縮符号長が６ビットの圧縮符号についての葉へのポインタは、１２８（＝２7）個生成される。具体的には、葉へのポインタの先頭６ビットが圧縮符号で後続７ビットが１２８種のビット列となる。したがって、圧縮符号長が６ビットの圧縮符号の各々について、１２８種の葉へのポインタが生成されることとなる。
【０１７０】
図示はしないが、圧縮符号長が７ビットの圧縮符号の各々について、６４種の葉へのポインタが生成されることとなる。同様に、圧縮符号長が８ビットの圧縮符号の各々について、３２種の葉へのポインタが生成されることとなる。同様に、圧縮符号長が９ビットの圧縮符号の各々について、１６種の葉へのポインタが生成されることとなる。同様に、圧縮符号長が１０ビットの圧縮符号の各々について、８種の葉へのポインタが生成されることとなる。同様に、圧縮符号長が１１ビットの圧縮符号の各々について、４種の葉へのポインタが生成されることとなる。同様に、圧縮符号長が１２ビットの圧縮符号の各々について、２種の葉へのポインタが生成されることとなる。同様に、圧縮符号長が１３ビットの圧縮符号の各々について、１種の葉へのポインタが生成されることとなる。
【０１７１】
＜（７）２N分枝無節点ハフマン木の構築の詳細（Ｎ＝１３）＞
図２８は、図１３の（７）２N分枝無節点ハフマン木の構築の詳細（Ｎ＝１３）を示す説明図である。図２８では、Ｎ＝１３とした場合の８１９２（＝２13）分枝無節点ハフマン木を示している。根の構造体には、葉へのポインタが格納されている。葉へのポインタはポイント先の葉の構造体を指定することができる。
【０１７２】
具体的には、圧縮符号長が６ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、１２８個生成される。したがって、葉Ｌ１の構造体については、根の構造体に１２８個の葉Ｌ１へのポインタＬ１Ｐ（１）〜Ｌ１Ｐ（１２８）が格納される。葉Ｌ２の構造体についても同様である。葉Ｌ３以降の構造体については、図２８のとおりである。
【０１７３】
＜葉の構造体＞
図２９は、葉の構造体を示す説明図である。葉の構造体は、第１領域〜第４領域を有するデータ構造体である。葉の構造体は、第１領域には、圧縮符号およびその圧縮符号長が格納される。第２領域には、葉の標識と伸長種別（図１８参照）が格納される。第３領域には、伸長種別に応じて高位文字である１６ビットの高位文字、低位文字の文字コードが分割された８ビットの分割文字コード、または特殊単語へのポインタが格納される。特殊単語へのポインタにより特殊単語の構造体１００内の特殊単語が指定される。また、照合フラグも格納されている。照合フラグはデフォルトでは「０」である。「０」の場合は、照合／置換テーブルＴを参照せず、「１」の場合は、照合／置換テーブルＴを参照する。
【０１７４】
第４領域には、符号種別と符号区分が格納される。符号種別とは、文字コードが数字、英字、特殊記号、カタカナ、ひらがな、漢字のいずれに該当するか、または特殊単語へのポインタであるかを識別する情報である。符号区分とは、文字コードが１６ビットであるか８ビットであるかを識別する情報である。１６ビットの文字コードである場合または特殊単語である場合、符号区分として“１”を割り当て、８ビットの分割文字コードの場合、符号区分として“０”を割り当てる。
【０１７５】
＜文字コードの構造体＞
図３０は、高位文字コードの構造体５００を示す説明図である。高位文字コードの構造体５００は、高位文字コードｅ♯とその葉Ｌ♯へのポインタを格納するデータ構造体である。具体的には、たとえば、コンピュータは、対象ファイル群Ｆｓからの集計結果が得られたときに、コンピュータが、高位文字コードの構造体５００に高位文字コードｅ♯を格納する。そして、コンピュータは、２N分枝無節点ハフマン木が構築されると、２N分枝無節点ハフマン木における各葉の構造体に格納された圧縮符号に対応する、高位文字コードの構造体５００における高位文字コードｅ♯へのポインタを格納する。また、高位文字コードｅ♯へのポインタが対応する葉の構造体に格納されると、コンピュータは、２N分枝無節点ハフマン木における各高位文字コードｅ♯に対応する葉へのポインタを、高位文字コードの構造体５００内の対応する高位文字コードｅ♯に関連付けて格納する。これにより、高位文字コードの構造体５００が生成される。
【０１７６】
図３１は、分割文字コードの構造体６００を示す説明図である。分割文字コードの構造体６００は、分割文字コードとその葉Ｌ♯へのポインタを格納する。具体的には、たとえば、コンピュータは、対象ファイル群Ｆｓからの集計結果が得られたときに、コンピュータが、分割文字コードの構造体６００に分割文字コードを格納する。そして、コンピュータは、２N分枝無節点ハフマン木が構築されると、２N分枝無節点ハフマン木における各葉の構造体に格納された圧縮符号に対応する、分割文字コードの構造体６００における分割文字コードへのポインタを格納する。また、分割文字コードへのポインタが対応する葉の構造体に格納されると、コンピュータは、２N分枝無節点ハフマン木における各分割文字コードに対応する葉へのポインタを、分割文字コードの構造体６００内の対応する分割文字コードに関連付けて格納する。これにより、分割文字コードの構造体６００が生成される。
【０１７７】
図３２および図３３は、特殊単語の構造体１００を示す説明図である。図３２では、特殊単語が予約語のみであり、図３３では、特殊単語は予約語および基礎単語である。特殊単語の構造体１００は、特殊単語とその葉Ｌ♯へのポインタを格納するデータ構造体である。具体的には、たとえば、コンピュータは、対象ファイル群Ｆｓからの集計結果が得られたときに、コンピュータが、特殊単語の構造体１００に特殊単語を格納する。そして、コンピュータは、２N分枝無節点ハフマン木が構築されると、２N分枝無節点ハフマン木における各葉の構造体に格納された圧縮符号に対応する、特殊単語の構造体１００における特殊単語へのポインタを格納する。また、特殊単語へのポインタが対応する葉の構造体に格納されると、コンピュータは、２N分枝無節点ハフマン木における各特殊単語に対応する葉へのポインタを、特殊単語の構造体１００内の対応する特殊単語に関連付けて格納する。これにより、特殊単語の構造体１００が生成される。
【０１７８】
＜コンピュータのハードウェア構成＞
図３４は、実施の形態にかかるコンピュータのハードウェア構成例を示すブロック図である。図３４において、コンピュータは、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）３４０１と、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）３４０２と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）３４０３と、磁気ディスクドライブ３４０４と、磁気ディスク３４０５と、光ディスクドライブ３４０６と、光ディスク３４０７と、ディスプレイ３４０８と、Ｉ／Ｆ（Ｉｎｔｅｒｆａｃｅ）３４０９と、キーボード３４１０と、マウス３４１１と、スキャナ３４１２と、プリンタ３４１３と、を備えている。また、各構成部はバス３４００によってそれぞれ接続されている。
【０１７９】
ここで、ＣＰＵ３４０１は、コンピュータの全体の制御を司る。ＲＯＭ３４０２は、ブートプログラムなどのプログラムを記憶している。ＲＡＭ３４０３は、ＣＰＵ３４０１のワークエリアとして使用される。磁気ディスクドライブ３４０４は、ＣＰＵ３４０１の制御にしたがって磁気ディスク３４０５に対するデータのリード／ライトを制御する。磁気ディスク３４０５は、磁気ディスクドライブ３４０４の制御で書き込まれたデータを記憶する。
【０１８０】
光ディスクドライブ３４０６は、ＣＰＵ３４０１の制御にしたがって光ディスク３４０７に対するデータのリード／ライトを制御する。光ディスク３４０７は、光ディスクドライブ３４０６の制御で書き込まれたデータを記憶したり、光ディスク３４０７に記憶されたデータをコンピュータに読み取らせたりする。
【０１８１】
ディスプレイ３４０８は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。このディスプレイ３４０８は、たとえば、ＣＲＴ、ＴＦＴ液晶ディスプレイ、プラズマディスプレイなどを採用することができる。
【０１８２】
インターフェース（以下、「Ｉ／Ｆ」と略する。）３４０９は、通信回線を通じてＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどのネットワーク３４１４に接続され、このネットワーク３４１４を介して他の装置に接続される。そして、Ｉ／Ｆ３４０９は、ネットワーク３４１４と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。Ｉ／Ｆ３４０９には、たとえばモデムやＬＡＮアダプタなどを採用することができる。
【０１８３】
キーボード３４１０は、文字、数字、各種指示などの入力のためのキーを備え、データの入力をおこなう。また、タッチパネル式の入力パッドやテンキーなどであってもよい。マウス３４１１は、カーソルの移動や範囲選択、あるいはウィンドウの移動やサイズの変更などをおこなう。ポインティングデバイスとして同様に機能を備えるものであれば、トラックボールやジョイスティックなどであってもよい。
【０１８４】
スキャナ３４１２は、画像を光学的に読み取り、コンピュータ内に画像データを取り込む。なお、スキャナ３４１２は、ＯＣＲ（Ｏｐｔｉｃａｌ  Ｃｈａｒａｃｔｅｒ  Ｒｅａｄｅｒ）機能を持たせてもよい。また、プリンタ３４１３は、画像データや文書データを印刷する。プリンタ３４１３には、たとえば、レーザプリンタやインクジェットプリンタを採用することができる。
【０１８５】
なお、本実施の形態にかかる生成プログラムや、上述した２N分枝無節点ハフマン木、高位文字コードの構造体５００、分割文字コードの構造体６００、特殊単語の構造体１００は、上述したＲＡＭ３４０３や磁気ディスク３４０５などの記憶装置に記憶される。
【０１８６】
＜コンピュータの機能的構成例＞
図３５は、コンピュータの機能的構成例を示すブロック図（その１）である。コンピュータは、集計部３５０１と、決定部３５０２と、補正部３５０３と、算出部３５０４と、判断部３５０５と、更新部３５０６と、生成部３５０７と、特定部３５０８と、構築部３５０９と、を備える。集計部３５０１〜構築部３５０９は、具体的には、たとえば、図３４に示したＲＯＭ３４０２、ＲＡＭ３４０３、磁気ディスク３４０５、光ディスク３４０７などの記憶装置に記憶されたプログラムをＣＰＵ３４０１に実行させることにより、その機能を実現する。
【０１８７】
集計部３５０１は、データを集計する機能を有する。具体的には、対象ファイル群Ｆｓを読み込んで、単一文字の出現回数を集計する。たとえば、図１３に示したように、集計部３５０１は、出現回数を降順にソートして、所定順位（たとえば、１０２４位）までを高位文字コードとする。所定順位よりも下位の単一文字は、上位８ビットと下位８ビットに分割して、それぞれ８ビットの分割文字コードとして再集計される。
【０１８８】
また、集計部３５０１は、最長一致検索処理をおこなうことにより、特殊単語を特定し、特殊単語についても出現回数を集計する。そして、集計部３５０１は、高位文字コード、分割文字コード、特殊単語を混在させて出現回数を再ソートする。これにより、図１８に示した順位項目、伸長種別項目、コード項目、文字項目、出現回数項目が得られる。
【０１８９】
また、集計部３５０１は、文字情報ごとの出現回数が得られた場合、全文字情報の出現回数の総和を総回数として算出する。そして、集計部３５０１は、文字情報ごとに、出現回数を総回数で割ることで、出現率を算出する。集計部３５０１は、算出された出現率に応じた生起確率を、図１３の「（２）圧縮符号長算出」の項で説明したように特定し、そのべき数を圧縮符号長とする。これにより、文字情報ごとに圧縮符号長が特定されたこととなる（図１８を参照）。そして、集計部３５０１は、図１８の文字情報テーブルを参照して、圧縮符号長ごとに文字情報の種類数（図１８に示した補正前の葉数）を集計する。
【０１９０】
決定部３５０２は、対象ファイルに出現する文字情報の総種類数に基づいて、最小圧縮符号長から最大圧縮符号長までの圧縮符号長群の中から、文字情報に割り当てられる圧縮符号長の上限長Ｎを決定する機能を有する。具体的には、たとえば、決定部３５０２は、文字情報の総種類数が２K-1個より大きく２K個以下である場合は、上限長ＮをＫビットに決定する。たとえば、文字情報の総種類数が２10個より大きく２11個以下である場合は、決定部３５０２は、上限長Ｎを１１ビットに決定することとなる。
【０１９１】
また、文字情報の総種類数が２11個より大きく２12個以下である場合は、決定部３５０２は、上限長Ｎを１２ビットに決定することとなる。また、文字情報の総種類数が２12個より大きく２13個以下である場合は、決定部３５０２は、上限長Ｎを１３ビットに決定することとなる。ここで、文字コードの種別ごとの文字情報の分類について説明する。
【０１９２】
図３６は、ＵＴＦ１６での文字情報の分類例を示す説明図である。特殊単語には、２５種の予約語と最大４０９６種の基礎単語が含まれている。基礎単語を入れない場合は、予約語のみの２５種となる。ＵＴＦ１６において、基礎単語を含めない場合の文字情報の最大総数は、１３０５個である。したがって、２10＜１３０５≦２11となるため、上限長ＮはＮ＝１１ビットに決定される。また、基礎単語を２０４８個含める場合の文字情報の最大総数は、３３５３個である。したがって、２11＜３３５３≦２12となるため、上限長ＮはＮ＝１２ビットに決定される。また、基礎単語を４０９６個含める場合の文字情報の最大総数は、５４０１個である。したがって、２12＜５４０１≦２13となるため、上限長ＮはＮ＝１３ビットに決定される。
【０１９３】
図３７は、ＡＳＣＩＩコードでの文字情報の分類例を示す説明図である。特殊単語には、２５種の予約語と最大２０４８種の基礎単語が含まれている。基礎単語を１０２４個含める場合の文字情報の最大総数は、１３０５個である。したがって、２10＜１３０５≦２11となるため、上限長ＮはＮ＝１１ビットに決定される。基礎単語を２０４８個含める場合の文字情報の最大総数は、３３５３個である。したがって、２11＜３３５３≦２12となるため、上限長ＮはＮ＝１２ビットに決定される。
【０１９４】
図３８は、シフトＪＩＳコードでの文字情報の分類例を示す説明図である。特殊単語には、２５種の予約語と最大４０９６種の基礎単語が含まれている。また、シフトＪＩＳコードの場合、日本語の文字は２つの８ビットコードの組み合わせで表現されるため、偶数個の単語（文字列）とみなされる。基礎単語を２０４８個含める場合の文字情報の最大総数は、３３５３個である。したがって、２11＜３３５３≦２12となるため、上限長ＮはＮ＝１２ビットに決定される。また、基礎単語を４０９６個含める場合の文字情報の最大総数は、５４０１個である。したがって、２12＜５４０１≦２13となるため、上限長ＮはＮ＝１３ビットに決定される。
【０１９５】
また、図３５において、補正部３５０３は、集計部３５０１によって集計された圧縮符号長ごとの文字情報の種類数のうち、決定部３５０２によって決定された上限長Ｎを圧縮符号長とする文字情報の種類数を、上限長Ｎ以上の圧縮符号長での文字情報の種類数の総和に補正する機能を有する。具体的には、たとえば、補正部３５０３は、上述した補正Ａによる補正処理を実行する。
【０１９６】
算出部３５０４は、補正部３５０３による補正後の上限長Ｎまでの各圧縮符号長を規定する各生起確率の総和を算出する機能を有する。具体的には、たとえば、図１９、図２３、図２６に示した生起確率総和を算出する。
【０１９７】
判断部３５０５は、算出部３５０４によって算出された生起確率総和がしきい値ｔ以上１以下であるか否かを判断する機能を有する。しきい値ｔは、０＜ｔ≦１の値であり、あらかじめ設定される。しきい値ｔを１としてもよい。しきい値ｔ以上１以下である場合は、補正部３５０３による補正後の圧縮符号長ごとの文字情報の種類数を、圧縮符号長ごとの葉数として確定させてもよい。
【０１９８】
一方、しきい値ｔ未満である場合、まだ、生起確率総和を増加させることが可能であるため、上述した補正Ｂ+を実行することが可能となる。また、生起確率総和が１よりも大きくなった場合は、上述した補正Ｂ-を実行することが可能となる。
【０１９９】
更新部３５０６は、判断部３５０５によってしきい値ｔ以上１以下でないと判断された場合、上限長Ｎまでの各圧縮符号長の文字情報の種類数を、生起確率総和で割ることにより、上限長Ｎまでの各圧縮符号長の文字情報の種類数を更新する機能を有する。具体的には、たとえば、更新部３５０６は、しきい値ｔ未満と判断された場合は補正Ｂ+を開始し、１より大きいと判断された場合は補正Ｂ-を開始する。
【０２００】
この場合、算出部３５０４は、更新後における上限長Ｎまでの各圧縮符号長の文字情報の種類数に基づいて、生起確率総和を再算出する。そして、判断部３５０５は、算出部３５０４によって再算出された生起確率総和については、１以下の最大値が得られたか、具体的には、たとえば、１以下の最大漸近値に収束したか否かを判断することとなる。
【０２０１】
生成部３５０７は、文字情報に圧縮符号を割り当てた葉の構造体を生成する機能を有する。具体的には、たとえば、生成部３５０７による生成の条件は、判断部３５０５によって補正Ａによりしきい値ｔ以上１以下であると判断された場合、または、補正Ｂにより１以下の最大値が得られたと判断された場合である。そして、当該条件を満たした場合、生成部３５０７は、具体的には、たとえば、上限長Ｎまでの圧縮符号長と、上限長Ｎまでの圧縮符号長ごとの文字情報の種類数と、文字情報の出現率と、に基づいて、文字情報ごとに圧縮符号を割り付ける。そして、生成部３５０７は、割り付けた圧縮符号、その圧縮符号長、文字情報を含む葉の構造体を生成する。
【０２０２】
より具体的には、まず、出現率により順位付けされた文字情報群のうち第１位から昇順に文字情報を選択する。そして、生成部３５０７は、その選択文字情報の圧縮符号長を特定して、その圧縮符号長となる固有の圧縮符号を割り当てる。
【０２０３】
たとえば、出現回数第１位の文字情報は、高位文字の「０」である。Ｎ＝１２の場合、圧縮符号長は６ビットであるため、固有の圧縮符号「００００００」が割り当てられることとなる。次に、出現回数第２位の文字情報は、高位文字の「＞」である。Ｎ＝１２の場合、圧縮符号長は６ビットであるため、固有の圧縮符号「０００００１」が割り当てられることとなる。
【０２０４】
このようにして、出現回数の順位の昇順で圧縮符号を割り当てる。圧縮符号が決まると、生成部３５０７は、文字情報ごとに、その文字情報や圧縮符号長、伸長種別などをまとめて葉の構造体を生成することとなる。
【０２０５】
特定部３５０８は、上限長Ｎまでの圧縮符号長に基づいて、生成部３５０７によって生成された葉の構造体１つ当たりの枝数を、上限長Ｎまでの圧縮符号長ごとに特定する機能を有する。具体的には、たとえば、特定部３５０８は、図１９、図２３、図２６に示したように、葉当たりの枝数を、圧縮符号長ごとに特定する。
【０２０６】
構築部３５０９は、２N分枝無節点ハフマン木を構築する機能を有する。具体的には、たとえば、構築部３５０９は、葉の構造体内の圧縮符号に特定部３５０８によって特定された枝数分の枝番号をあらわす各ビット列を連結した葉へのポインタ群を、葉の構造体ごとに生成する。たとえば、Ｎ＝１１の場合は、図２１に示したように、葉へのポインタ群を葉の構造体ごとに生成する。また、Ｎ＝１２の場合は、図２４に示したように、葉へのポインタ群を葉の構造体ごとに生成する。また、Ｎ＝１３の場合は、図２７に示したように、葉へのポインタ群を葉の構造体ごとに生成する。
【０２０７】
また、構築部３５０９は、各葉の構造体についての葉へのポインタ群を根とする２N分枝無節点ハフマン木を構築する。具体的には、たとえば、Ｎ＝１１の場合は、図２２に示したように、２11分枝無節点ハフマン木を構築する。Ｎ＝１２の場合は、図２５に示したように、２12分枝無節点ハフマン木を構築する。Ｎ＝１３の場合は、図２８に示したように、２13分枝無節点ハフマン木を構築する。
【０２０８】
＜２N分枝無節点ハフマン木の生成処理手順＞
図３９は、２N分枝無節点ハフマン木の生成処理手順（前半）を示すフローチャートである。まず、図３９において、コンピュータは、集計部３５０１により、第１集計処理（ステップＳ３９０１）と第２集計処理（ステップＳ３９０２）を実行する。第１集計処理（ステップＳ３９０１）では、各文字情報の出現回数を集計する。第２集計処理（ステップＳ３９０２）では、圧縮符号長ごとの文字情報の種類数を集計する。第１集計処理（ステップＳ３９０１）と第２集計処理（ステップＳ３９０２）の詳細については後述する。
【０２０９】
つぎに、コンピュータは、決定部３５０２により、圧縮符号長の上限長Ｎを決定する（ステップＳ３９０３）。このＮが後述する補正Ａでの最大圧縮符号長となる。そして、コンピュータは、全文字情報の圧縮符号長がＮビット以内であるか否かを判断する（ステップＳ３９０４）。
【０２１０】
Ｎビット以内でない場合（ステップＳ３９０４：Ｎｏ）、コンピュータは、補正部３５０３により、補正Ａ処理を実行する（ステップＳ３９０５）。具体的には、コンピュータは、上限長Ｎが最大圧縮符号長となるように、Ｎビット以上の各圧縮符号長での文字情報の種類数（葉数）の総和を求め、この総和を、圧縮符号長Ｎビットでの文字情報の種類数に補正する。したがって、（Ｎ＋１）ビット以上の圧縮符号長での文字情報の種類数は０となり、最大圧縮符号長がＮビットとなる。このあと、ステップＳ３９０６に移行する。
【０２１１】
一方、Ｎビット以内である場合（ステップＳ３９０４：Ｙｅｓ）、コンピュータは、補正Ａ処理（ステップＳ３９０５）を実行せずに、ステップＳ３９０６に移行する。ステップＳ３９０６では、コンピュータは、算出部３５０４により、圧縮符号長ごとの生起確率を算出し（ステップＳ３９０６）、算出された圧縮符号長ごとの生起確率の総和（生起確率総和ＴＯＰ）を算出する（ステップＳ３９０７）。そして、図４０のステップＳ４００１に移行する。
【０２１２】
図４０は、２N分枝無節点ハフマン木の生成処理手順（後半）を示すフローチャートである。コンピュータは、判断部３５０５により、算出された生起確率総和ＴＯＰが、ｔ≦ＴＯＰ≦１であるか否かを判断する（ステップＳ４００１）。ｔは上述したしきい値である。ｔ≦ＴＯＰ≦１でない場合（ステップＳ４００１：Ｎｏ）、コンピュータは、判断部３５０５により、ｔ＞ＴＯＰであるか否かを判断する（ステップＳ４００２）。ｔ＞ＴＯＰである場合（ステップＳ４００２：Ｙｅｓ）、コンピュータは、更新部３５０６により、補正Ｂ+処理を実行する（ステップＳ４００３）。補正Ｂ+処理（ステップＳ４００３）の詳細については後述する。補正Ｂ+処理のあとは、ステップＳ４００５に移行する。
【０２１３】
一方、ステップＳ４００２において、ｔ＞ＴＯＰでない場合（ステップＳ４００２：Ｎｏ）、コンピュータは、更新部３５０６により、補正Ｂ-処理を実行する（ステップＳ４００４）。補正Ｂ-処理（ステップＳ４００４）の詳細については後述する。補正Ｂ-処理のあとは、ステップＳ４００５に移行する。また、ステップＳ４００１において、ｔ≦ＴＯＰ≦１である場合（ステップＳ４００１：Ｙｅｓ）、ステップＳ４００５に移行する。
【０２１４】
また、ステップＳ４００５において、コンピュータは、生成部３５０７により、文字情報ごとに葉の構造体を生成する（ステップＳ４００５）。そして、コンピュータは、特定部３５０８により、枝数特定処理を実行する（ステップＳ４００６）。枝数特定処理（ステップＳ４００６）では、圧縮符号長ごとの葉当たりの枝数を特定する。枝数特定処理（ステップＳ４００６）の詳細については後述する。
【０２１５】
そして、コンピュータは、構築部３５０９により、構築処理を実行する（ステップＳ４００７）。枝数特定処理（ステップＳ４００６）により葉の構造体ごとの枝数が特定されるため、まず、構築部３５０９は、葉の構造体ごとに、枝数分の葉へのポインタ群を生成する。そして、生成された各葉の構造体についての葉へのポインタ群を集約して根の構造体とする。これにより、２N分枝無節点ハフマン木が生成されることとなる。なお、生成された２N分枝無節点ハフマン木は、コンピュータ内の記憶装置（ＲＡＭ３４０３や磁気ディスク３４０５など）に格納される。
【０２１６】
＜第１集計処理（ステップＳ３９０１）＞
図４１は、図３９に示した第１集計処理（ステップＳ３９０１）の詳細な処理手順を示すフローチャートである。まず、コンピュータは、ファイル番号ｉをｉ＝１に設定し（ステップＳ４１０１）、対象ファイルＦｉを読み込む（ステップＳ４１０２）。そして、コンピュータは、対象ファイルＦｉの集計処理を実行する（ステップＳ４１０３）。このあと、コンピュータは、ファイル番号ｉがｉ＞ｎ（ｎは対象ファイルＦ１〜Ｆｎの総数）であるか否かを判断する（ステップＳ４１０４）。
【０２１７】
ｉ＞ｎでない場合（ステップＳ４１０４：Ｎｏ）、コンピュータは、ｉをインクリメントし（ステップＳ４１０５）、ステップＳ４１０２に戻る。一方、ｉ＞ｎである場合（ステップＳ４１０４：Ｙｅｓ）、コンピュータは、第２集計処理（ステップＳ３９０２）に移行して、第１集計処理（ステップＳ３９０１）を終了する。この第１集計処理（ステップＳ３９０１）によれば、対象ファイルＦｉごとに対象ファイルＦｉの集計処理（ステップＳ４１０３）を実行することができる。
【０２１８】
＜対象ファイルＦｉの集計処理（ステップＳ４１０３）＞
図４２は、図４１に示した対象ファイルＦｉの集計処理（ステップＳ４１０３）の詳細な処理手順を示すフローチャートである。まず、コンピュータは、対象文字を対象ファイルＦｉの先頭文字とし（ステップＳ４２０１）、特殊単語集計処理を実行する（ステップＳ４２０２）。特殊単語集計処理（ステップＳ４２０２）では、対象文字を先頭文字とする特殊単語の出現回数を集計する。特殊単語集計処理（ステップＳ４２０２）の詳細については、図４３で説明する。このあと、コンピュータは、対象文字の出現回数を１増加する（ステップＳ４２０３）。
【０２１９】
つぎに、コンピュータは、対象文字の出現マップ生成処理を実行する（ステップＳ４２０４）。対象文字の出現マップ生成処理（ステップＳ４２０４）では、対象ファイルＦｉでの対象文字の存否を示す出現マップを生成する。対象文字の出現マップ生成処理（ステップＳ４２０４）の詳細については、図４６で説明する。そして、コンピュータは、対象文字が対象ファイルＦｉの末尾文字であるか否かを判断する（ステップＳ４２０５）。
【０２２０】
対象文字が対象ファイルＦｉの末尾文字でない場合（ステップＳ４２０５：Ｎｏ）、コンピュータは、対象文字を末尾方向へ１文字シフトし（ステップＳ４２０６）、ステップＳ４２０２に戻る。一方、対象文字が対象ファイルＦｉの末尾文字である場合（ステップＳ４２０５：Ｙｅｓ）、コンピュータは、ステップＳ４１０４に移行して、対象ファイルＦｉの集計処理（ステップＳ４１０３）を終了する。この対象ファイルＦｉの集計処理（ステップＳ４１０３）によれば、対象ファイル群Ｆｓに存在する特殊単語および単一文字の出現頻度を集計することができる。
【０２２１】
＜特殊単語集計処理（ステップＳ４２０２）＞
図４３は、図４２に示した特殊単語集計処理（ステップＳ４２０２）の詳細な処理手順を示すフローチャートである。まず、コンピュータは、最長一致検索処理を実行し（ステップＳ４３０１）、最長一致した特殊単語があったか否かを判断する（ステップＳ４３０２）。最長一致した特殊単語があった場合（ステップＳ４３０２：Ｙｅｓ）、コンピュータは、特殊単語出現頻度テーブルにおいて最長一致した特殊単語の出現回数を１増加し（ステップＳ４３０３）、コンピュータは、特殊単語の出現マップ生成処理を実行する（ステップＳ４３０４）。特殊単語の出現マップ生成処理（ステップＳ４３０４）では、対象ファイルＦｉでの対象文字を先頭文字とする特殊単語の存否を示す出現マップを生成する。特殊単語の出現マップ生成処理（ステップＳ４３０４）の詳細については、図４５で説明する。このあと、ステップＳ４２０３に移行する。
【０２２２】
一方、最長一致した特殊単語がなかった場合（ステップＳ４３０２：Ｎｏ）、ステップＳ４２０３に移行する。これにより、特殊単語集計処理（ステップＳ４２０２）を終了する。この特殊単語集計処理（ステップＳ４２０２）によれば、最長一致検索処理（ステップＳ４３０１）により特殊単語を計数することができるため、文字列が長い特殊単語を優先的に計数することができる。
【０２２３】
＜最長一致検索処理（ステップＳ４３０１）＞
図４４は、図４３に示した最長一致検索処理（ステップＳ４３０１）の詳細な処理手順を示すフローチャートである。まず、コンピュータは、ｃ＝１とする（ステップＳ４４０１）。ｃは対象文字からの文字数（対象文字含む）である。ｃ＝１の場合は、対象文字だけである。つぎに、コンピュータは、対象文字からｃ文字目までの対象文字列と前方一致する特殊単語を２分探索する（ステップＳ４４０２）。そして、コンピュータは、検索により特殊単語があるか否かを判断する（ステップＳ４４０３）。２分探索により特殊単語がヒットしなかった場合（ステップＳ４４０３：Ｎｏ）、ステップＳ４４０６に移行する。
【０２２４】
一方、２分探索により特殊単語がヒットした場合（ステップＳ４４０３：Ｙｅｓ）、コンピュータは、ヒットした特殊単語と対象文字列とが完全一致するか否かを判断する（ステップＳ４４０４）。そして、完全一致しない場合（ステップＳ４４０４：Ｎｏ）、ステップＳ４４０６に移行する。一方、完全一致する場合（ステップＳ４４０４：Ｙｅｓ）、コンピュータは、最長一致候補として記憶装置に保持し（ステップＳ４４０５）、ステップＳ４４０６に移行する。
【０２２５】
ステップＳ４４０６では、コンピュータは、対象文字列について２分探索が終了したか否かを判断する（ステップＳ４４０６）。具体的には、コンピュータは、末尾の特殊単語まで２分探索したか否かを判断する。２分探索が終了していない場合（ステップＳ４４０６：Ｎｏ）、コンピュータは、ステップＳ４４０２に移行して、２分探索が終了するまで継続する。
【０２２６】
一方、対象文字列について２分探索が終了した場合（ステップＳ４４０６：Ｙｅｓ）、コンピュータは、ｃ文字目の文字が対象ファイルＦｉの末尾文字であるか否かを判断する（ステップＳ４４０７）。ｃ文字目の文字が対象ファイルＦｉの末尾文字である場合（ステップＳ４４０７：Ｙｅｓ）、ステップＳ４４１０に移行する。一方、ｃ文字目の文字が対象ファイルＦｉの末尾文字でない場合（ステップＳ４４０７：Ｎｏ）、コンピュータは、ｃ＞ｃｍａｘであるか否かを判断する（ステップＳ４４０８）。ｃｍａｘは予め設定された値であり、これにより対象文字列の上限文字数が設定される。
【０２２７】
ｃ＞ｃｍａｘでない場合（ステップＳ４４０８：Ｎｏ）、コンピュータは、ｃをインクリメントして（ステップＳ４４０９）、ステップＳ４４０２に戻る。一方、ｃ＞ｃｍａｘである場合（ステップＳ４４０８：Ｙｅｓ）、コンピュータは、最長一致候補があるか否かを判断する（ステップＳ４４１０）。具体的には、コンピュータは、ステップＳ４４０５において１つでも最長一致候補がメモリに保持されているか否かを判断する。
【０２２８】
最長一致候補がある場合（ステップＳ４４１０：Ｙｅｓ）、コンピュータは、最長一致候補のうち最長文字列を、最長一致した特殊単語に決定する（ステップＳ４４１１）。そして、ステップＳ４３０２に移行する。一方、ステップＳ４４１０において、最長一致候補が１つもない場合（ステップＳ４４１０：Ｎｏ）、ステップＳ４３０２に移行する。これにより、最長一致検索処理（ステップＳ４３０１）を終了する。この最長一致検索処理（ステップＳ４３０１）によれば、特殊単語構造体にある特殊単語の中から、完全一致した文字列の中でかつ最長の文字列を特殊単語として検索することができる。
【０２２９】
図４５は、図４３に示した特殊単語の出現マップ生成処理（ステップＳ４３０４）の詳細な処理手順を示すフローチャートである。まず、コンピュータは、最長一致した特殊単語について、特殊単語の出現マップがあるか否かを判断する（ステップＳ４５０１）。すなわち、コンピュータは、すでに特殊単語の出現マップが生成済みであるか否かを判断する。最長一致した特殊単語について、特殊単語の出現マップがない場合（ステップＳ４５０１：Ｎｏ）、コンピュータは、当該特殊単語の出現マップを設定する（ステップＳ４５０２）。具体的には、コンピュータは、特殊単語の出現マップ群の割り当て領域内でのオール０の空きビット列を、当該特殊単語の出現マップとして割り当てる。
【０２３０】
そして、コンピュータは、ステップＳ４５０２で設定された特殊単語の出現マップのうち、対象ファイルＦｉのビットをＯＮにする（ステップＳ４５０３）。そして、ステップＳ４２０３に移行する。一方、ステップＳ４５０１において、最長一致した特殊単語の出現マップがある場合（ステップＳ４５０１：Ｙｅｓ）、コンピュータは、その特殊単語の出現マップのうち、対象ファイルＦｉのビットがＯＮであるか否かを判断する（ステップＳ４５０４）。そして、ＯＦＦの場合（ステップＳ４５０４：Ｎｏ）、ステップＳ４５０３に移行し、ＯＮの場合（ステップＳ４５０４：Ｙｅｓ）、ステップＳ４２０３に移行することで、特殊単語の出現マップ生成処理（ステップＳ４３０４）を終了する。これにより、特殊単語の出現マップが生成されることとなる。
【０２３１】
図４６は、図４２に示した対象文字の出現マップ生成処理（ステップＳ４２０４）の詳細な処理手順を示すフローチャートである。まず、コンピュータは、高位文字コードの構造体５００において、対象文字を２分探索する（ステップＳ４６０１）。そして、ヒットした場合（ステップＳ４６０２：Ｙｅｓ）、コンピュータは、対象文字の出現マップがあるか否かを判断する（ステップＳ４６０３）。すなわち、コンピュータは、すでに生成済みであるか否かを判断する。対象文字の出現マップがない場合（ステップＳ４６０３：Ｎｏ）、コンピュータは、対象文字の出現マップを設定する（ステップＳ４６０４）。具体的には、コンピュータは、対象文字の出現マップ群の割り当て領域内でのオール０の空きビット列を、当該対象文字の出現マップとして割り当てる。
【０２３２】
そして、コンピュータは、ステップＳ４６０４で設定された対象文字の出現マップのうち、対象ファイルＦｉのビットをＯＮにする（ステップＳ４６０５）。そして、ステップＳ４６０２に移行する。一方、ステップＳ４６０３において、対象文字の出現マップがある場合（ステップＳ４６０３：Ｙｅｓ）、コンピュータは、その対象文字の出現マップのうち、対象ファイルＦｉのビットがＯＮであるか否かを判断する（ステップＳ４６０６）。そして、ＯＦＦの場合（ステップＳ４６０６：Ｎｏ）、ステップＳ４６０５に移行し、ＯＮの場合（ステップＳ４６０６：Ｙｅｓ）、ステップＳ４６０２に移行する。
【０２３３】
また、ステップＳ４６０２において、ヒットしなかった場合（ステップＳ４６０２：Ｎｏ）、コンピュータは、対象文字についての２分探索が終了したか否かを判断する（ステップＳ４６０７）。２分探索が終了していない場合（ステップＳ４６０７：Ｎｏ）、ステップＳ４６０２に戻る。一方、２分探索が終了した場合（ステップＳ４６０７：Ｙｅｓ）、ステップＳ４２０５に移行することで、対象文字の出現マップ生成処理（ステップＳ４２０４）を終了する。これにより、対象文字の出現マップが生成されることとなる。
【０２３４】
＜第２集計処理（ステップＳ３９０２）＞
図４７は、図３９に示した第２集計処理（ステップＳ３９０２）の詳細な処理手順を示すフローチャートである。まず、コンピュータは、文字情報ごとに出現率を算出する（ステップＳ４７０１）。つぎに、コンピュータは、未選択文字情報があるか否かを判断する（ステップＳ４７０２）。未選択文字情報がある場合（ステップＳ４７０２：Ｙｅｓ）、コンピュータは、出現率が最上位の未選択文字情報を選択する（ステップＳ４７０３）。そして、コンピュータは、選択文字情報の出現率に応じて生起確率および圧縮符号長を特定し（ステップＳ４７０４）、ステップＳ４７０２に戻る。
【０２３５】
そして、ステップＳ４７０２において、未選択文字情報がない場合（ステップＳ４７０２：Ｎｏ）、コンピュータは、圧縮符号長ごとに文字情報の種類数を計数する（ステップＳ４７０５）。これにより、圧縮符号長ごとの葉数（文字情報の種類数）が特定されることとなる。
【０２３６】
＜補正Ｂ+処理（ステップＳ４００３）＞
図４８は、図４０に示した補正Ｂ+処理（ステップＳ４００３）の詳細な処理手順を示すフローチャートである。まず、コンピュータは、更新処理を実行する（ステップＳ４８０１）。更新処理（ステップＳ４８０１）の詳細については後述する。つぎに、コンピュータは、更新処理（ステップＳ４８０１）後において、更新前後で葉数の変動があるか否かを判断する（ステップＳ４８０２）。変動がある場合（ステップＳ４８０２：Ｙｅｓ）、まだ、生起確率総和ＴＯＰが１以下の最大漸近値に収束していないため、更新処理（ステップＳ４８０１）に戻る。
【０２３７】
一方、変動がない場合（ステップＳ４８０２：Ｎｏ）、これ以上更新処理（ステップＳ４８０１）をしても葉数が変動しない。すなわち、前回の補正Ｂ+で最大漸近値に収束したこととなり、コンピュータは、今回の更新処理（ステップＳ４８０１）での圧縮符号長ごとの葉数で確定させ（ステップＳ４８０３）、ステップＳ４００５に移行する。これにより、生起確率総和ＴＯＰを増加させて、１に漸近させることができ、圧縮効率の向上を図ることができる。
【０２３８】
＜補正Ｂ-処理（ステップＳ４００４）＞
図４９は、図４０に示した補正Ｂ-処理（ステップＳ４００４）の詳細な処理手順を示すフローチャートである。補正Ｂ-処理（ステップＳ４００４）は、図４８に示した補正Ｂ+処理（ステップＳ４００３）と同一内容であるため、同一処理には同一ステップ番号を付す。補正Ｂ-処理（ステップＳ４００４）は、補正Ｂ+処理（ステップＳ４００３）と同一内容であるが、扱う生起確率総和ＴＯＰは１より大きい値であり、更新処理（ステップＳ４８０１）を繰り返すことで、ある時点の補正Ｂ-で生起確率総和ＴＯＰが１を下回ることとなる。
【０２３９】
生起確率総和ＴＯＰが１未満となると、補正Ｂ+の場合と同様、１以下の最大漸近値に収束するまで、更新処理（ステップＳ４８０１）を繰り返すこととなる。これにより、１より大きい生起確率総和ＴＯＰを減少させて、１に漸近させることができ、圧縮効率の向上を図ることができる。
【０２４０】
＜更新処理（ステップＳ４８０１）＞
図５０は、図４８および図４９に示した更新処理（ステップＳ４８０１）の詳細な処理手順を示すフローチャートである。まず、コンピュータは、未選択の圧縮符号長があるか否かを判断する（ステップＳ５００１）。未選択の圧縮符号長がある場合（ステップＳ５００１：Ｙｅｓ）、コンピュータは、未選択の中で最短の圧縮符号長を１つ選択する（ステップＳ５００２）。コンピュータは、選択圧縮符号長が上限長Ｎ（補正Ａでの最長圧縮符号長）であるか否かを判断する（ステップＳ５００３）。
【０２４１】
選択圧縮符号長が上限長Ｎでない場合（ステップＳ５００３：Ｎｏ）、コンピュータは、選択圧縮符号長の葉数（文字情報の種類数）を、生起確率総和ＴＯＰで割る（ステップＳ５００４）。生成部３５０７は、選択圧縮符号長の葉数をこの割り算結果の値に更新する（ステップＳ５００５）。割り算結果の値については、小数点以下は切り捨て、四捨五入、切り上げのいずれでもよい。そして、ステップＳ５００１に戻る。
【０２４２】
また、ステップＳ５００３において、選択圧縮符号長が上限長Ｎである場合（ステップＳ５００３：Ｙｅｓ）、コンピュータは、葉数の総和から、ステップＳ５００５で更新済みの葉数の総和を引くことにより、選択圧縮符号長（この場合は、上限長Ｎ）の葉数を引き算結果の値に更新する（ステップＳ５００６）。そして、ステップＳ５００１に戻る。
【０２４３】
ステップＳ５００１において、未選択の圧縮符号長（上限長Ｎ以下の圧縮符号長）がない場合（ステップＳ５００１：Ｎｏ）、コンピュータは、葉数の更新後における生起確率総和ＴＯＰを算出し（ステップＳ５００７）、図４８および図４９のステップＳ４８０２に移行する。
【０２４４】
＜枝数特定処理（ステップＳ４００６）＞
図５１は、図４０に示した枝数特定処理（ステップＳ４００６）の詳細な処理手順を示すフローチャートである。まず、コンピュータは、特定部３５０８により、最大圧縮符号長ＣＬｍａｘ（＝Ｎ）と最小圧縮符号長ＣＬｍｉｎ（＝Ｍ）との差分Ｄ（＝Ｎ−Ｍ）を算出する（ステップＳ５１０１）。たとえば、Ｎ＝１１の場合、図１９を参照すると、Ｍ＝６である。したがって、Ｄ＝５である。
【０２４５】
つぎに、コンピュータは、２のべき数の変数ｊをｊ＝０とし、圧縮符号長の変数ＣＬをＣＬ＝Ｎとする（ステップＳ５１０２）。そして、コンピュータは、ｊ＞Ｄであるか否かを判断する（ステップＳ５１０３）。ｊ＞Ｄでない場合（ステップＳ５１０３：Ｎｏ）、コンピュータは、圧縮符号長ＣＬの葉当たりの枝数ｂ（ＣＬ）を算出する（ステップＳ５１０４）。圧縮符号長ＣＬの葉当たりの枝数ｂ（ＣＬ）は、ｂ（ＣＬ）＝２jで算出される。たとえば、ｊ＝０のとき、圧縮符号長ＣＬ＝Ｎ＝１１であるため、圧縮符号長１１ビットでの葉当たりの枝数ｂ（１１）は、ｂ（１１）＝２j＝２0＝１となる。
【０２４６】
つぎに、コンピュータは、圧縮符号長ＣＬの総枝数Ｂ（Ｌ）を算出する（ステップＳ５１０５）。圧縮符号長ＣＬの総枝数Ｂ（Ｌ）は、Ｂ（Ｌ）＝Ｌ（ＣＬ）×ｂ（ＣＬ）で算出される。Ｌ（ＣＬ）は、圧縮符号長ＣＬでの葉数（文字情報の種類数）である。たとえば、ｊ＝０のとき、圧縮符号長ＣＬ＝Ｎ＝１１であるため、圧縮符号長１１ビットでの総枝数Ｂ（Ｌ）は、１２１６×２0＝１２１６となる。
【０２４７】
このあと、コンピュータは、ｊをインクリメントし、圧縮符号長ＣＬをデクリメントして（ステップＳ５１０６）、ステップＳ５１０３に戻り、インクリメント後のｊがｊ＞Ｄであるか否かが判断される。なお、Ｎ＝１１の場合は、ｊ＝Ｄになるとｊ＝Ｄ＝５となり、ＣＬ＝Ｍ＝６となる。したがって、ステップＳ５１０４では、圧縮符号長ＣＬ（５ビット）当たりの枝数ｂ（６）は、ｂ（６）＝２6＝６４となる。同様に、総枝数Ｂ（Ｌ）は、Ｂ（６）＝０×２6＝０となる。そして、ｊ＞Ｄである場合（ステップＳ５１０３：Ｙｅｓ）、構築処理（ステップＳ４００７）に移行する。
【０２４８】
＜構築処理（ステップＳ４００７）＞
図５２は、図４０に示した構築処理（ステップＳ４００７）の詳細な処理手順を示すフローチャートである。まず、コンピュータは、圧縮符号長ＣＬをＣＬ＝ＣＬｍｉｎ＝Ｍとする（ステップＳ５２０１）。つぎに、コンピュータは、圧縮符号長ＣＬでの未選択の葉があるか否かを判断する（ステップＳ５２０２）。未選択の葉がある場合（ステップＳ５２０２：Ｙｅｓ）、コンピュータは、葉へのポインタ生成処理（ステップＳ５２０３）を実行して、ステップＳ５２０２に戻る。葉へのポインタ生成処理（ステップＳ５２０３）では、葉の構造体ごとに、圧縮符号長ＣＬに応じた枝数分の葉へのポインタ群を生成する。なお、葉へのポインタ生成処理（ステップＳ５２０３）の詳細については後述する。
【０２４９】
一方、ステップＳ５２０２において、未選択の葉がない場合（ステップＳ５２０２：Ｎｏ）、コンピュータは、ＣＬ＞Ｎであるか否かを判断する（ステップＳ５２０４）。ＣＬ＞Ｎでない場合（ステップＳ５２０４：Ｎｏ）、コンピュータは、ＣＬをインクリメントして（ステップＳ５２０５）、ステップＳ５２０２に戻る。一方、ＣＬ＞Ｎである場合（ステップＳ５２０４：Ｙｅｓ）、２N分枝無節点ハフマン木が構築されたこととなり、一連処理が終了することとなる。
【０２５０】
＜葉へのポインタ生成処理（ステップＳ５２０３）＞
図５３は、図５２に示した葉へのポインタ生成処理（ステップＳ５２０３）の詳細な処理手順を示すフローチャートである。まず、コンピュータは、未選択の葉Ｌを選択し（ステップＳ５３０１）、選択葉へのポインタ数ｋをｋ＝１に設定する（ステップＳ５３０２）。そして、コンピュータは、選択葉へのポインタＰＬ（ｋ）の先行ビット列を、選択葉の圧縮符号に設定する（ステップＳ５３０３）。たとえば、上限長Ｎ＝１１については、選択葉が、文字情報「０」の葉の構造体である場合、圧縮符号は「００００００」である。したがって、選択葉へのポインタＰＬ（ｋ）の先行ビット列も、図２１に示したように、「００００００」となる。
【０２５１】
つぎに、コンピュータは、選択葉へのポインタＰＬ（ｋ）の後続ビット列のビット長を、最大圧縮符号長Ｎから選択葉の圧縮符号長ＣＬを引いた差分とし、後続ビット列の初期値をオール０に設定する（ステップＳ５３０４）。たとえば、選択葉が、文字情報「０」の葉の構造体である場合、圧縮符号長ＣＬは６ビットであるため、後続ビット列のビット長は５ビット（＝１１−６）となる。ｋ＝１の場合は、後続ビット列はオール０となるため、後続ビット列は、５ビットの「０００００」となる。
【０２５２】
そして、コンピュータは、選択葉へのポインタＰＬ（ｋ）を根の構造体に格納する（ステップＳ５３０５）。このあと、コンピュータは、ｋ＞ｂ（ＣＬ）であるか否かを判断する（ステップＳ５３０６）。ｂ（ＣＬ）は、選択葉の圧縮符号長ＣＬの葉当たりの枝数である。ｋ＞ｂ（ＣＬ）でない場合（ステップＳ５３０６：Ｎｏ）、選択葉に割り当てられたすべての枝について葉へのポインタが生成されていないため、コンピュータは、ｋをインクリメントする（ステップＳ５３０７）。
【０２５３】
そして、コンピュータは、現在の後続ビット列をインクリメントして、インクリメント後の後続ビット列を先行ビット列の末端に連結することで、あらたに、選択葉へのポインタＰＬ（ｋ）を生成する（ステップＳ５３０８）。そして、コンピュータは、選択葉へのポインタＰＬ（ｋ）を根の構造体に格納し（ステップＳ５３０９）、ステップＳ５３０６に戻る。ステップＳ５３０６〜ステップＳ５３０９を繰り返すことで、葉当たりの枝数分の葉へのポインタ群が生成されることとなる。そして、ステップＳ５３０６において、ｋ＞ｂ（ＣＬ）である場合（ステップＳ５３０６：Ｙｅｓ）、ステップＳ５２０２に移行する。
【０２５４】
このように、対象ファイル群Ｆｓに出現する文字情報の種類数に応じて、２N分枝無節点ハフマン木の最大枝数２Nを最適な本数に設定することができるため、２N分枝無節点ハフマン木のサイズの適正化を図ることができる。また、本実施の形態によれば、上限長Ｎが２〜４の整数倍でない場合（たとえば、上限長Ｎ＝１１，１３）であっても、圧縮効率のよい２N分枝無節点ハフマン木を生成することができる。
【０２５５】
このあと、コンピュータは、２N分枝無節点ハフマン木の各葉の構造体と、特殊単語の構造体１００，高位文字コードの構造体５００，分割文字コードの構造体６００とを、図１８の文字情報テーブルを参照して、相互に関連付ける。具体的には、上述したように、葉の構造体には、当該葉に格納されている圧縮符号に対応する高位文字、分割文字コードおよびへのポインタや特殊単語へのポインタを格納する。
【０２５６】
また、コンピュータは、特殊単語の構造体１００の特殊単語ごとに、対応する圧縮符号を格納する葉へのポインタを格納する。また、コンピュータは、高位文字コードの構造体５００の高位文字ごとに、対応する圧縮符号を格納する葉へのポインタを格納する。また、コンピュータは、分割文字コードの構造体６００の分割文字コードごとに、対応する圧縮符号を格納する葉へのポインタを格納する。なお、分割文字コードの構造体６００は、必ずしも生成する必要はなく、出現頻度が所定回数に満たない場合であっても、高位文字コードの構造体５００として登録してもよい。
【０２５７】
＜補正Ｂ処理の他の例＞
つぎに、補正Ｂ処理の他の例について説明する。上述した補正Ｂ+処理および補正Ｂ-処理では、圧縮符号長の葉数ごとに、各圧縮符号長の葉数を生起確率総和で割ることにより、各圧縮符号長の葉数を更新することとした。これに対し、本例では、最小圧縮符号長ＣＬｍｉｎから最大圧縮符号長ＣＬｍａｘ（すなわち、上限長Ｎ）に向かって、小さい圧縮符号長の葉数がそれより大きい圧縮符号長の葉数よりも増減するように、葉数を移動させる。
【０２５８】
具体的には、本例の補正Ｂ+処理では、小さい圧縮符号長の葉数がそれより大きい圧縮符号長の葉数よりも減少するように、葉数を補正する。一方、本例の補正Ｂ-処理では、小さい圧縮符号長の葉数がそれより大きい圧縮符号長の葉数よりも増加するように、葉数を移動させる。その後は、補正後の葉数を生起確率総和で割ることで、各圧縮符号長の葉数を更新する。
【０２５９】
なお、以下に説明する例では、ある圧縮符号長ＣＬの葉数Ｌ（ＣＬ）を、圧縮符号長（ＣＬ＋１）の葉数Ｌ（ＣＬ＋１）よりも増加／減少するように補正をおこなう例について説明するが、圧縮符号長ＣＬよりも大きい圧縮符号長（ＣＬ＋２），（ＣＬ＋３），…であってもよい。また、移動対象葉数の個数は、１個に限らず、２個以上でもよい。たとえば、移動元の圧縮符号長の葉数をすべて移動先に移動させてもよい。
【０２６０】
図５４は、補正Ｂ+処理（ステップＳ４００３）の他の例の詳細な処理手順を示すフローチャートである。補正Ｂ+処理（ステップＳ４００３）において、最小圧縮符号長ＣＬｍｉｎをＭとする。また、最大圧縮符号長ＣＬｍａｘは上限長Ｎとなる。図５４では、葉数を１個ずつ移動させる例を示している。
【０２６１】
まず、コンピュータは、圧縮符号長ＣＬをＣＬ＝Ｍに設定する（ステップＳ５４０１）。つぎに、コンピュータは、圧縮符号長ＣＬがＣＬ＝Ｎであるか否かを判断する（ステップＳ５４０２）。ＣＬ＝Ｎでない場合（ステップＳ５４０２：Ｎｏ）、圧縮符号長ＣＬが最大圧縮符号長ＣＬｍａｘに到達していないこととなる。この場合、コンピュータは、葉数Ｌ（ＣＬ）がＬ（ＣＬ）＝０であるか否かを判断する（ステップＳ５４０３）。
【０２６２】
Ｌ（ＣＬ）＝０の場合（ステップＳ５４０３：Ｙｅｓ）、移動させる葉数Ｌ（ＣＬ）がないため、コンピュータは、圧縮符号長ＣＬをインクリメントし（ステップＳ５４０４）、ステップＳ５４０２に戻る。そして、圧縮符号長ＣＬがＣＬ＝Ｎとなった場合（ステップＳ５４０２：Ｙｅｓ）、ステップＳ５４１３に移行し、コンピュータは、今回の補正における圧縮符号長ごとの葉数で確定させることとなる。
【０２６３】
また、ステップＳ５４０３において、葉数Ｌ（ＣＬ）がＬ（ＣＬ）＝０でない場合（ステップＳ５４０３：Ｎｏ）、コンピュータは、現在対象となっている圧縮符号長ＣＬの葉数Ｌ（ＣＬ）をデクリメントし（ステップＳ５４０５）、移動先となる圧縮符号長（ＣＬ＋１）の葉数Ｌ（ＣＬ＋１）をインクリメントする（ステップＳ５４０６）。
【０２６４】
そして、圧縮符号長ＣＬ，（ＣＬ＋１）については、ステップＳ５４０５，ステップＳ５４０６において葉数が増減したため、コンピュータは、圧縮符号長ＣＬについての生起確率と圧縮符号長（ＣＬ＋１）についての生起確率とを再計算する（ステップＳ５４０７）。このあと、コンピュータは、各圧縮符号長ＣＬｍｉｎ〜ＣＬｍａｘの最新の葉数での生起確率総和ＴＯＰを算出する（ステップＳ５４０８）。
【０２６５】
そして、コンピュータは、算出されたＴＯＰがｔ＞ＴＯＰであるか否かを判断する（ステップＳ５４０９）。ｔ＞ＴＯＰである場合（ステップＳ５４０９：Ｙｅｓ）、まだ改善の余地があるため、ステップＳ５４０３に戻る。一方、ｔ＞ＴＯＰでない場合（ステップＳ５４０９：Ｎｏ）、コンピュータは、ｔ≦ＴＯＰ≦１であるか否かを判断する（ステップＳ５４１０）。ｔ≦ＴＯＰ≦１である場合（ステップＳ５４１０：Ｙｅｓ）、これ以上補正する必要がないため、ステップＳ５４１３に移行する。
【０２６６】
一方、ｔ≦ＴＯＰ≦１でない場合（ステップＳ５４１０：Ｎｏ）、コンピュータは、現在対象となっている圧縮符号長Ｌの葉数Ｌ（ＣＬ）をインクリメントし（ステップＳ５４１１）、移動先の圧縮符号長（ＣＬ＋１）の葉数Ｌ（ＣＬ＋１）をデクリメントする（ステップＳ５４１２）。すなわち、ｔ≦ＴＯＰ≦１でない場合（ステップＳ５４１０：Ｎｏ）は、ＴＯＰ＞１であるため、今回の補正自体が失敗となる。
【０２６７】
したがって、ステップＳ５４０５およびステップＳ５４０６での葉数移動を、ステップＳ５４１１およびステップＳ５４１２で元に戻すこととなる。このあと、ステップＳ５４０４に戻る。ステップＳ５４０４では、圧縮符号長ＣＬがインクリメントされるため、葉数移動による生起確率の増加がインクリメント前の圧縮符号長ＣＬに比べて１／２に抑えられる。したがって、葉数ＣＬをインクリメントするほど、微調整が可能となり、より微小な補正幅でｔ≦ＴＯＰ≦１に収めることができる。
【０２６８】
また、ステップＳ５４１３になると、コンピュータは、そのときの圧縮符号長ＣＬｍｉｎ〜ＣＬｍａｘごとの葉数Ｌ（ＣＬｍｉｎ）〜葉数Ｌ（ＣＬｍａｘ）で確定させることとなる（ステップＳ５４１３）。その後、ステップＳ４００５に移行することで、補正Ｂ+処理（ステップＳ４００３）を終了する。
【０２６９】
図５５は、補正Ｂ-処理（ステップＳ４００４）の他の例の詳細な処理手順を示すフローチャートである。補正Ｂ-処理（ステップＳ４００４）は、図５４に示した補正Ｂ+処理（ステップＳ４００３）とほぼ同一内容であるため、同一処理には同一ステップ番号を付す。異なる点は、ステップＳ５５０５，ステップＳ５５０６，ステップＳ５５０９，ステップＳ５５１１，ステップＳ５５１２である。
【０２７０】
まず、コンピュータは、圧縮符号長ＣＬをＣＬ＝Ｍに設定する（ステップＳ５４０１）。つぎに、コンピュータは、圧縮符号長ＣＬがＣＬ＝Ｎであるか否かを判断する（ステップＳ５４０２）。ＣＬ＝Ｎでない場合（ステップＳ５４０２：Ｎｏ）、圧縮符号長ＣＬが最大圧縮符号長ＣＬｍａｘに到達していないこととなる。この場合、コンピュータは、葉数Ｌ（ＣＬ）がＬ（ＣＬ）＝０であるか否かを判断する（ステップＳ５４０３）。
【０２７１】
Ｌ（ＣＬ）＝０の場合（ステップＳ５４０３：Ｙｅｓ）、移動させる葉数Ｌ（ＣＬ）がないため、コンピュータは、圧縮符号長ＣＬをインクリメントし（ステップＳ５４０４）、ステップＳ５４０２に戻る。そして、圧縮符号長ＣＬがＣＬ＝Ｎとなった場合（ステップＳ５４０２：Ｙｅｓ）、ステップＳ５４１３に移行し、コンピュータは、今回の補正における圧縮符号長ごとの葉数で確定させることとなる。
【０２７２】
また、ステップＳ５４０３において、葉数Ｌ（ＣＬ）がＬ（ＣＬ）＝０でない場合（ステップＳ５４０３：Ｎｏ）、コンピュータは、現在対象となっている圧縮符号長ＣＬの葉数Ｌ（ＣＬ）をインクリメントし（ステップＳ５５０５）、移動先となる圧縮符号長（ＣＬ＋１）の葉数Ｌ（ＣＬ＋１）をデクリメントする（ステップＳ５５０６）。
【０２７３】
そして、圧縮符号長ＣＬ，（ＣＬ＋１）については、ステップＳ５５０５，ステップＳ５５０６において葉数が増減したため、コンピュータは、圧縮符号長ＣＬについての生起確率と圧縮符号長（ＣＬ＋１）についての生起確率とを再計算する（ステップＳ５４０７）。このあと、コンピュータは、各圧縮符号長ＣＬｍｉｎ〜ＣＬｍａｘの最新の葉数での生起確率総和ＴＯＰを算出する（ステップＳ５４０８）。
【０２７４】
そして、コンピュータは、算出されたＴＯＰが１＜ＴＯＰであるか否かを判断する（ステップＳ５５０９）。１＜ＴＯＰである場合（ステップＳ５５０９：Ｙｅｓ）、まだ改善の余地があるため、ステップＳ５４０３に戻る。一方、１＜ＴＯＰでない場合（ステップＳ５５０９：Ｎｏ）、コンピュータは、ｔ≦ＴＯＰ≦１であるか否かを判断する（ステップＳ５４１０）。ｔ≦ＴＯＰ≦１である場合（ステップＳ５４１０：Ｙｅｓ）、これ以上補正する必要がないため、ステップＳ５４１３に移行する。
【０２７５】
一方、ｔ≦ＴＯＰ≦１でない場合（ステップＳ５４１０：Ｎｏ）、コンピュータは、現在対象となっている圧縮符号長Ｌの葉数Ｌ（ＣＬ）をデクリメントし（ステップＳ５５１１）、移動先の圧縮符号長（ＣＬ＋１）の葉数Ｌ（ＣＬ＋１）をインクリメントする（ステップＳ５５１２）。すなわち、ｔ≦ＴＯＰ≦１でない場合（ステップＳ５４１０：Ｎｏ）は、ｔ＞ＴＯＰであるため、今回の補正自体が失敗となる。
【０２７６】
したがって、ステップＳ５５０５およびステップＳ５５０６での葉数移動を、ステップＳ５５１１およびステップＳ５５１２で元に戻すこととなる。このあと、ステップＳ５４０４に戻る。ステップＳ５４０４では、圧縮符号長ＣＬがインクリメントされるため、葉数移動による生起確率の減少がインクリメント前の圧縮符号長ＣＬに比べて１／２に抑えられる。したがって、葉数ＣＬをインクリメントするほど、微調整が可能となり、より微小な補正幅でｔ≦ＴＯＰ≦１に収めることができる。
【０２７７】
また、ステップＳ５４１３になると、コンピュータは、そのときの圧縮符号長ＣＬｍｉｎ〜ＣＬｍａｘごとの葉数Ｌ（ＣＬｍｉｎ）〜葉数Ｌ（ＣＬｍａｘ）で確定させることとなる（ステップＳ５４１３）。その後、ステップＳ４００５に移行することで、補正Ｂ-処理（ステップＳ４００４）を終了する。
【０２７８】
図５６は、図５４に示した補正Ｂ+処理の他の例を適用した場合における、図１３の（３）葉数特定〜（５）葉の構造体生成の詳細（Ｎ＝１２）を示す説明図である。図５６では、移動元の圧縮符号長の葉数を、１ビット小さい移動先の圧縮符号長の葉数に１個ずつシフトさせた例を示している。図５６では、図５３におけるしきい値ｔをｔ＝１とする。図５６では、補正Ａでの生起確率総和ＴＯＰが「０．８２３」であるため、補正Ｂ+処理が適用される。まず、移動先を最小圧縮符号長である６ビットとし、移動元を１ビット大きい７ビットとする。補正Ｂ+１では、圧縮符号長７ビットの葉数９を１つずつ、最小圧縮符号長６ビットに移動させる。
【０２７９】
コンピュータは、この移動ごとに、生起確率総和ＴＯＰを求めて、１以下の最大漸近値に収束するか否かを判断することとなる。本例において、補正Ｂ+１では生起確率総和ＴＯＰが１を超えていない。そして、移動元の圧縮符号長７ビットの葉数が０になった場合、移動先の圧縮符号長６ビットの葉数は１１（＝９＋２）となる。このときの補正Ｂ+１での生起確率総和ＴＯＰは「０．８９４」であるため、さらに補正Ｂ+が必要である。
【０２８０】
補正Ｂ+２についても同様な処理をおこなうことで、補正Ｂ+２での生起確率総和ＴＯＰは「０．９７９」となり、さらに補正Ｂ+が必要である。つぎに、補正Ｂ+３についても同様な処理をおこなうことで、補正Ｂ+３での生起確率総和ＴＯＰは「０．９９９」となり、さらに補正Ｂ+が必要である。
【０２８１】
つぎに、補正Ｂ+４についても同様な処理をおこなうことで、補正Ｂ+４での生起確率総和ＴＯＰは「１．０００」となり、さらに補正Ｂ+が可能である。つぎに、補正Ｂ+５についても同様な処理をおこなうことで、補正Ｂ+５での生起確率総和ＴＯＰは「１．０００」となり、さらに補正Ｂ+が必要である。つぎに、補正Ｂ+６では、移動先および移動元の圧縮符号長を１ビット大きくする。すなわち、移動先の圧縮符号長を１０ビットから１１ビットとし、移動元の圧縮符号長を１１ビットから１２ビットとする。
【０２８２】
そして、移動元の圧縮符号長１２ビットの葉数２２１４を１つずつ、補正Ｂ+５で葉数が２４になった移動先の圧縮符号長１１ビットに移動させる。コンピュータは、この移動ごとに、生起確率総和ＴＯＰを求めて、１以下の最大漸近値に収束するか否かを判断することとなる。本例において、移動元の圧縮符号長１２ビットの葉数が２２１４から２２１３になり、移動先の圧縮符号長１１ビットの葉数が２４から２５になると、生起確率総和ＴＯＰが１を超える。したがって、それぞれ葉数を１つ戻すこととなる。戻した葉数は、補正Ｂ+５終了時点での葉数となる。補正Ｂ+５終了時点での生起確率総和ＴＯＰは「１．０００」である。本例では、これ以上、移動元の圧縮符号長を大きくすることができないため、補正Ｂ+５終了時点での葉数が確定することとなる。
【０２８３】
図５７は、上述した補正Ｂ-処理の他の例を適用した場合における、図１３の（３）葉数特定〜（５）葉の構造体生成の詳細（Ｎ＝１１）を示す説明図である。図５７では、移動元の圧縮符号長の葉数をすべて、１ビット大きい移動先の圧縮符号長の葉数にシフトさせた例を示している。図５７では、図５５におけるしきい値ｔをｔ＝１とする。図５７では、補正Ａでの生起確率総和ＴＯＰが「１．１４６」であるため、補正Ｂ-処理が適用される。まず、移動元を最小圧縮符号長である５ビットとし、移動先を１ビット大きい６ビットとする。補正Ｂ-１では、移動元の圧縮符号長５ビットの葉数２を１つずつ、圧縮符号長６ビットに移動させる。
【０２８４】
コンピュータは、この移動ごとに、生起確率総和ＴＯＰを求めて、１以下の最大漸近値に収束するか否かを判断することとなる。本例において、補正Ｂ-１では生起確率総和ＴＯＰが１以下にならない。そして、移動元の圧縮符号長５ビットの葉数が０になった場合、移動先の圧縮符号長６ビットの葉数は１１（＝９＋２）となる。このときの補正Ｂ-１での生起確率総和ＴＯＰは「１．１１５」であるため、さらに補正Ｂ-が必要である。
【０２８５】
つぎに、補正Ｂ-２についても同様な処理をおこなうことで、補正Ｂ-２での生起確率総和ＴＯＰは「１．０２９」となり、さらに補正Ｂ-が必要である。
【０２８６】
つぎに、補正Ｂ-３では、移動元および移動先の圧縮符号長を１ビット大きくする。すなわち、移動元の圧縮符号長を６ビットから７ビットとし、移動先の圧縮符号長を７ビットから８ビットとする。
【０２８７】
そして、移動元の圧縮符号長７ビットの葉数３３を１つずつ、移動先の圧縮符号長８ビットの葉数２８に移動させる。コンピュータは、この移動ごとに、生起確率総和ＴＯＰを求めて、１以下の最大漸近値に収束するか否かを判断することとなる。本例において、補正Ｂ-３では、移動元である圧縮符号長７ビットの葉数が２５、移動先である圧縮符号長８ビットの葉数が３６に到達すると、生起確率総和ＴＯＰが１以下の「０．９９８」となる。これ以上葉数移動をしても、生起確率総和ＴＯＰが低下するため、このときの各圧縮符号長の葉数で確定させることとなる。
【０２８８】
＜圧縮処理＞
つぎに、上述した２N分枝無節点ハフマン木を用いた対象ファイル群Ｆｓの圧縮処理について説明する。圧縮処理は、コンピュータが実行してもよく、また、２N分枝無節点ハフマン木が格納された情報処理装置が実行してもよい。すなわち、少なくとも２N分枝無節点ハフマン木が格納されていればよい。以下、コンピュータおよび情報処理装置を総称してコンピュータとする。ここで、まず、圧縮対象文字列とその圧縮符号を例に挙げて説明する。
【０２８９】
図５８は、圧縮対象文字列の一例を示す説明図である。図５８では、「婚活は結婚活動」という文字列の１６ビットコード（１６進と２進）を示している。
【０２９０】
図５９は、図５８に示した圧縮対象文字列の圧縮符号を示す説明図である。図５９に示した圧縮符号は、図２８に示した２N分枝無節点ハフマン木（Ｎ＝１３）を用いて圧縮した例を示している。図５９では、図５８と比較すると、文字「婚」は、低出現頻度文字であるため、上位８ビットの分割文字コード「０ｘ５Ａ」が１２ビットの圧縮符号に圧縮されている。また、下位８ビットの分割文字コード「０ｘ５Ａ」も１２ビットの圧縮符号に圧縮されている。高位文字「活」は、１６ビットから９ビットに圧縮されている。高位文字「は」は、１６ビットから９ビットに圧縮されている。
【０２９１】
「結婚」は基礎単語に該当するため、３２ビットから１３ビットに圧縮されている。また、「活動」は、基礎単語に該当するため、３２ビットから１３ビットに圧縮されている。
【０２９２】
なお、分割文字コードについては、圧縮後のほうがビット長が長いが、「婚」のような単一文字はそもそも出現回数が少ないために分割されているため、対象ファイル群Ｆｓ全体で見れば問題ない。また、基礎単語は、そのビット列に比べて圧縮符号が非常に短くなるため（最大でも１３ビット）、２文字（高位文字）以上であれば十分圧縮効率が向上することとなる。
【０２９３】
＜圧縮処理の具体例＞
図６０は、２N分枝無節点ハフマン木を用いた圧縮処理の具体例を示す説明図である。まず、コンピュータは、対象ファイル群Ｆｓから１文字目の圧縮対象文字コードを取得し、対象ファイル上の位置を保持しておく。そして、コンピュータは、特殊単語の構造体１００に対して２分木探索をおこなう。特殊単語は２文字以上の文字コード列であるため、１文字目の圧縮対象文字コードがヒットした場合、２文字目の文字コードを圧縮対象文字コードとして取得する。
【０２９４】
そして、２文字目の文字コードは、１文字目の圧縮対象文字コードがヒットした位置から探索する。３文字目以降も、不一致の圧縮対象文字コードが出現するまで繰り返し２分木探索をおこなう。一致する特殊単語ｒａ（ａは葉の番号）が探索された場合、特殊単語の構造体１００において対応付けされている葉Ｌａへのポインタにより葉Ｌａの構造体にアクセスする。そして、コンピュータは、アクセス先の葉Ｌａの構造体に格納されている特殊単語ｒａの圧縮符号を探索して、圧縮バッファ６０００に格納する。
【０２９５】
一方、不一致の圧縮文字コードが出現した場合、特殊単語の構造体１００に対する２分木探索を終了する（ＥＯＴ（Ｅｎｄ  Ｏｆ  Ｔｒａｎｓｍｉｓｓｉｏｎ）まで進む）。そして、コンピュータは、１文字目の圧縮対象文字コードを再度レジスタにセットして、高位文字コードの構造体５００に対する２分木探索をおこなう。
【０２９６】
一致する文字コードｅｂ（ｂは葉の番号）が探索された場合、コンピュータは、その葉Ｌｂへのポインタにより葉Ｌｂの構造体にアクセスする。そして、コンピュータは、アクセス先の葉Ｌｂの構造体に格納されている文字コードｅｂの圧縮符号を探索して、圧縮バッファ６０００に格納する。
【０２９７】
一方、一致する文字コードが出現せず２分木探索を終了した場合、圧縮対象文字コードは高位文字コードではないため、コンピュータは、上位８ビットと下位８ビットに分割する。そして、コンピュータは、上位８ビットの分割文字コードについて、分割文字コードの構造体６００に対する２分木探索をおこなう。一致する分割文字コードＤｃ１（ｃ１は葉の番号）が探索された場合、コンピュータは、その葉Ｌｃ１へのポインタにより葉Ｌｃ１の構造体にアクセスする。そして、コンピュータは、アクセス先の葉Ｌｃ１の構造体に格納されている分割文字コードＤｃ１の圧縮符号を探索して、圧縮バッファ６０００に格納する。
【０２９８】
引き続き、コンピュータは、下位８ビットの分割文字コードについて、分割文字コードの構造体６００に対する２分木探索をおこなう。一致する分割文字コードＤｃ２（ｃ２は葉の番号）が探索された場合、コンピュータは、その葉Ｌｃ２へのポインタにより葉Ｌｃ２の構造体にアクセスする。そして、コンピュータは、アクセス先の葉Ｌｃ２の構造体に格納されている分割文字コードＤｃ２の圧縮符号を探索して、圧縮バッファ６０００に格納する。
【０２９９】
＜ファイル圧縮処理＞
図６１は、コンピュータが自動実行する２N分枝無節点ハフマン木を用いたファイル圧縮処理手順を示すフローチャートである。まず、コンピュータは、ファイル番号：ｐをｐ＝１とし（ステップＳ６１０１）、対象ファイルＦｐを読み込む（ステップＳ６１０２）。つぎに、コンピュータは、圧縮処理を実行して（ステップＳ６１０３）、ファイル番号：ｐをインクリメントする（ステップＳ６１０４）。そして、コンピュータは、ｐ＞ｎであるか否かを判断する（ステップＳ６１０５）。ｎは対象ファイル群Ｆｓの総数である。ｐ＞ｎでない場合（ステップＳ６１０５：Ｎｏ）、ステップＳ６１０２に戻る。一方、ｐ＞ｎである場合（ステップＳ６１０５：Ｙｅｓ）、一連のファイル圧縮処理を終了する。
【０３００】
図６２は、図６１に示した圧縮処理（ステップＳ６１０３）の詳細な処理手順を示すフローチャート（その１）である。図６２において、まず、コンピュータは、対象ファイル群Ｆｓに圧縮対象文字コードがあるか否かを判断する（ステップＳ６２０１）。ある場合（ステップＳ６２０１：Ｙｅｓ）、コンピュータは、圧縮対象文字コードを取得してレジスタにセットする（ステップＳ６２０２）。そして、コンピュータは、先頭の圧縮対象文字コードか否かを判断する（ステップＳ６２０３）。
【０３０１】
ここで、先頭の圧縮対象文字コードとは、未圧縮の１文字目の文字コードをいう。先頭である場合（ステップＳ６２０３：Ｙｅｓ）、コンピュータは、その圧縮対象文字コードの対象ファイル群Ｆｓ上の位置（先頭位置）となるポインタを取得し（ステップＳ６２０４）、ステップＳ６２０５に移行する。一方、先頭でない場合（ステップＳ６２０３：Ｎｏ）、先頭位置を取得せずにステップＳ６２０５に移行する。
【０３０２】
そして、コンピュータは、特殊単語の構造体１００に対して２分木探索をおこなう（ステップＳ６２０５）。圧縮対象文字コードが一致した場合（ステップＳ６２０６：Ｙｅｓ）、コンピュータは、連続して一致した文字コード列が特殊単語（の文字コード列）に該当するか否かを判断する（ステップＳ６２０７）。該当しない場合（ステップＳ６２０７：Ｎｏ）、コンピュータは、ステップＳ６２０２に戻って後続の文字コードを圧縮対象文字コードとして取得する。この場合、後続の文字コードは先頭ではないため、先頭位置は取得しないこととなる。
【０３０３】
一方、ステップＳ６２０７において、特殊単語に該当する場合（ステップＳ６２０７：Ｙｅｓ）、コンピュータは、該当する特殊単語の葉Ｌ♯へのポインタにより葉Ｌ♯の構造体にアクセスする（ステップＳ６２０８）。そして、コンピュータは、ポイントされた葉Ｌ♯の構造体に格納されている特殊単語の圧縮符号を抽出する（ステップＳ６２０９）。
【０３０４】
この後、コンピュータは、抽出された圧縮符号を圧縮バッファ６０００に格納して（ステップＳ６２１０）、ステップＳ６２０１に戻る。このループが特殊単語の圧縮処理の流れとなる。ステップＳ６２０１において、圧縮対象文字コードがない場合（ステップＳ６２０１：Ｎｏ）、コンピュータは、対象ファイルＦｐから圧縮された圧縮ファイルｆｐを圧縮バッファ６０００からファイル出力して保存する（ステップＳ６２１１）。そして、ステップＳ６１０４に移行する。一方、ステップＳ６２０６において不一致となった場合（ステップＳ６２０６：Ｎｏ）、１６ビットの文字コードの圧縮処理のループに入る。
【０３０５】
図６３は、図６１に示した圧縮処理（ステップＳ６１０３）の詳細な処理手順を示すフローチャート（その２）である。図６３において、コンピュータは、ステップＳ６２０４で取得された先頭位置のポインタを参照して、対象ファイル群Ｆｓから圧縮対象文字コードを取得してレジスタにセットする（ステップＳ６３０１）。
【０３０６】
つぎに、コンピュータは、圧縮対象文字コードについて、高位文字コードの構造体５００に対して２分木探索をおこなう（ステップＳ６３０２）。一致した場合（ステップＳ６３０３：Ｙｅｓ）、コンピュータは、該当する文字の葉Ｌ♯へのポインタにより葉Ｌ♯の構造体にアクセスする（ステップＳ６３０４）。そして、コンピュータは、ポイントされた葉Ｌ♯の構造体に格納されている圧縮対象文字コードの圧縮符号を抽出する（ステップＳ６３０５）。
【０３０７】
この後、コンピュータは、探索された圧縮符号を圧縮バッファ６０００に格納して（ステップＳ６３０６）、ステップＳ６２０１に戻る。このループが１６ビットの文字コードの圧縮処理の流れとなる。一方、ステップＳ６３０３において一致する文字コードが存在しなかった場合（ステップＳ６３０３：Ｎｏ）、分割文字コードの圧縮処理のループに入る。
【０３０８】
図６４は、図６１に示した圧縮処理（ステップＳ６１０３）の詳細な処理手順を示すフローチャート（その３）である。図６４において、まず、コンピュータは、圧縮対象文字コードを上位８ビットと下位８ビットとに分割し（ステップＳ６４０１）、上位８ビットの分割文字コードを抽出する（ステップＳ６４０２）。そして、コンピュータは、分割文字コードの構造体６００に対して２分木探索をおこなう（ステップＳ６４０３）。
【０３０９】
そして、コンピュータは、探索された分割文字コードの葉Ｌ♯へのポインタにより葉Ｌ♯の構造体にアクセスする（ステップＳ６４０４）。そして、コンピュータは、ポイントされた葉Ｌ♯の構造体に格納されている分割文字コードの圧縮符号を抽出する（ステップＳ６４０５）。この後、コンピュータは、探索された圧縮符号を圧縮バッファ６０００に格納する（ステップＳ６４０６）。
【０３１０】
つぎに、コンピュータは、下位８ビットが探索済みか否かを判断し（ステップＳ６４０７）、探索済みでない場合（ステップＳ６４０７：Ｎｏ）、コンピュータは、下位８ビットの分割文字コードを抽出して（ステップＳ６４０８）、ステップＳ６４０３〜Ｓ６４０６を実行する。一方、下位８ビットが探索済みである場合（ステップＳ６４０７：Ｙｅｓ）、ステップＳ６２０１に戻り、特殊単語の圧縮処理のループに入る。
【０３１１】
このように、２N分枝無節点ハフマン木を用いた圧縮処理では、内部節点がないため根に向かって探索する必要はなく、ポイントされた葉Ｌ♯の構造体に格納されている文字情報を抽出して、圧縮バッファ６０００に書き込むだけでよい。したがって、圧縮処理の高速化を図ることができる。
【０３１２】
また、圧縮対象文字コードが格納されている葉Ｌ♯の構造体を、特殊単語の構造体１００、高位文字コードの構造体５００および分割文字コードの構造体６００により即座に特定することができる。したがって、２N分枝無節点ハフマン木の葉を探索する必要がなく、圧縮処理の高速化を図ることができる。また、低位文字コードを上位ビットコードと下位ビットコードに分割することで、６万種以上ある低位の文字コードをたかだか２５６種の分割文字コードの圧縮符号に圧縮することができる。したがって、圧縮率の向上を図ることができる。
【０３１３】
＜圧縮ファイルの絞込み例＞
つぎに、圧縮ファイルの絞り込み例について説明する。対象ファイル群Ｆｓは、２N分枝無節点ハフマン木で圧縮されて、圧縮ファイル群Ｆｓとなっている。コンピュータは、圧縮ファイル群Ｆｓの中から、検索文字列を２N分枝無節点ハフマン木で圧縮した圧縮文字列の各圧縮文字をすべて含む圧縮ファイルを絞り込む。圧縮ファイルの絞込みは、検索文字列を構成する文字情報の出現マップ群をＡＮＤ演算する。
【０３１４】
図６５は、圧縮ファイルの絞込み例を示す説明図である。（Ａ）は、検索文字列が「結婚」の場合の出現マップ群のＡＮＤ演算結果を示している。検索文字列「結婚」の場合、基礎単語「結婚」の出現マップのみ取得する。（Ａ）の例では、対象ファイルＦ３にのみ、検索文字列「結婚」が記述されていることがわかる。
【０３１５】
（Ｂ）は、検索文字列が「結婚活動」の場合の出現マップ群のＡＮＤ演算結果を示している。検索文字列「結婚活動」の場合、基礎単語「結婚」の出現マップと、基礎単語「活動」の出現マップと、のＡＮＤ演算となる。（Ｂ）の例では、対象ファイルＦ３にのみ、検索文字列「結婚活動」が記述されていることがわかる。
【０３１６】
（Ｃ）は、検索文字列が「婚活」の場合の出現マップ群のＡＮＤ演算結果を示している。検索文字列「婚活」の場合、高位文字「活」の出現マップと、分割文字コード「０ｘ５Ａ」の出現マップと、のＡＮＤ演算となる。（Ｃ）の例では、対象ファイルＦ１〜Ｆ３に、検索文字列「婚活」が記述されている可能性があることがわかる。このように、検索文字列が基礎単語に登録されていない場合は、基礎単語の出現マップが使えないため、圧縮ファイルの絞込みが甘くなる傾向があり、伸長対象となる圧縮ファイルが増加する。したがって、伸長速度の効率化を図る必要がある。
【０３１７】
＜伸長処理例＞
つぎに、２N分枝無節点ハフマン木により圧縮された圧縮符号列を伸長する伸長処理例について説明する。
【０３１８】
図６６〜図７１は、圧縮符号列の伸長処理例を示す説明図である。図６６〜図７１では、圧縮ファイルを伸長する過程において、圧縮ファイル内の圧縮符号列と検索文字列「婚活」の圧縮符号列とを照合し、一致した場合には照合／置換テーブルＴ（Ｔ６）の置換文字列を伸長バッファに書き出す例を示す。なお、照合不一致の場合は、伸長された文字列を伸長バッファに書き出すこととなる。
【０３１９】
また、伸長処理では、コンピュータは、レジスタｒ１に圧縮符号列をセットし、マスクパターンにより圧縮符号を抽出する。コンピュータは、抽出した圧縮符号を、１パス（１枝分のアクセス）で２N分枝無節点ハフマン木の根から探索する。そして、コンピュータは、アクセスした葉Ｌ♯の構造体に格納されている文字コードを読み出して伸長バッファ６６００に格納する。
【０３２０】
圧縮符号を抽出するため、コンピュータは、マスクパターンのマスク位置をオフセットする。また、マスクパターンの初期値を“０ｘＦＦＦ１００００”とする。このマスクパターンは先頭１３ビットが“１”であり、後続の１９ビットが“０”のビット列である。
【０３２１】
コンピュータは、ビットアドレスａｂｉとバイトオフセットｂｙｏｓとビットオフセットｂｉｏｓとを算出する。ビットアドレスａｂｉは、抽出された圧縮符号のビット位置を示す値であり、今回のビットアドレスａｂｉは、前回のビットアドレスａｂｉに前回抽出された圧縮符号の圧縮符号長ｌｅｇを加算した値となる。なお、初期状態では、ビットアドレスａｂｉはａｂｉ＝０とする。
【０３２２】
バイトオフセットｂｙｏｓは、メモリに保持されている圧縮符号列のバイト境界を示す値であり、ビットアドレスａｂｉ／８の商で求められる。たとえば、バイトオフセットｂｙｏｓ＝０のときは、メモリに記憶されている先頭からの圧縮符号列をレジスタにセットし、バイトオフセットｂｙｏｓ＝１のときは、メモリに記憶されている先頭１バイト目からの圧縮符号列をレジスタにセットする。
【０３２３】
また、ビットオフセットｂｉｏｓは、マスクパターンのマスク位置（“ＦＦＦ”）をオフセットする値であり、ビットアドレスａｂｉ／８の余りである。たとえば、ビットオフセットｂｉｏｓ＝０のときは、マスク位置はシフトされないこととなり、マスクパターンは、“０ｘＦＦＦ１００００”となる。一方、ビットオフセットｂｉｏｓ＝４のときは、マスク位置は末尾方向に４ビットシフトすることとなり、マスクパターンは、“０ｘ０ＦＦＦ００００”となる。
【０３２４】
レジスタシフト数ｒｓは、マスクパターンとのＡＮＤ演算後のレジスタｒ２内の圧縮符号列を末尾方向にシフトするビット数であり、ｒｓ＝３２−１３−ｂｉｏｓで求められる。このシフトにより、コンピュータは、シフト後のレジスタｒ２の末尾ｍビットのビット列を対象ビット列として抽出する。コンピュータは、対象ビット列の抽出後はレジスタｒ２をクリアする。
【０３２５】
なお、図６６〜図７１において、メモリには図５９に示した圧縮符号列が保持されているものとする。また、図６６〜図７１のメモリ内のブロックは１バイトのビット列を示しており、内部の数字は、バイト境界となるバイト位置を示している。
【０３２６】
図６６は、初期状態（（Ａ）の状態）を示している。（Ａ）では、ビットアドレスａｂｉ＝０により、バイトオフセットｂｙｏｓ＝０、ビットオフセットｂｉｏｓ＝０となる。バイトオフセットｂｙｏｓ＝０により、コンピュータは、メモリに保持されている圧縮符号列のうち先頭から４バイト分（図中、網掛け）の圧縮符号列をレジスタｒ１にセットする。
【０３２７】
また、ビットオフセットｂｉｏｓ＝０により、マスクパターンは、“０ｘＦＦＦ８００００”であり、レジスタｒ２にセットされる。したがって、レジスタｒ１にセットされた圧縮符号列とレジスタｒ２にセットされたマスクパターン“０ｘＦＦＦ８００００”を論理積（ＡＮＤ）演算することにより、レジスタｒ２においてＡＮＤ結果が得られる。
【０３２８】
また、ビットオフセットｂｉｏｓ＝０により、レジスタシフト数ｒｓは、ｒｓ＝３２−ｍ―ｂｉｏｓ＝３２−１３−０＝１９となる。したがって、レジスタｒ２内のＡＮＤ結果を末尾方向に１９ビット分シフトする。このシフトによりレジスタｒ２には、“０１０１００１１０１１００”が残されるため、コンピュータは、末尾１３ビットを対象ビット列として抽出する。この場合は、“０１０１００１１０１１００”が対象ビット列として抽出される。抽出後、レジスタｒ２はクリアされる。
【０３２９】
図２８に示したように、２N分枝無節点ハフマン木の根の構造体には、葉Ｌ１〜Ｌ５４０１へのポインタが格納されている。したがって、コンピュータは、２N分枝無節点ハフマン木の根の構造体の中から、抽出された対象ビット列“０１０１００１１０１１００”と一致する葉Ｌ♯へのポインタを探索する。この場合、葉Ｌ＃（０ｘ５Ａ）へのポインタ群の中の１つと一致するため、コンピュータは、該当する葉Ｌ＃（０ｘ５Ａ）へのポインタを読み出して、葉Ｌ＃（０ｘ５Ａ）の構造体にアクセスする。
【０３３０】
葉Ｌ＃（０ｘ５Ａ）の構造体には、分割文字コード「０ｘ５Ａ」へのポインタが格納されているため、コンピュータは、分割文字コードの構造体６００の中から、分割文字コード“０ｘ５Ａ”へのポインタで分割文字コード「０ｘ５Ａ」を指定して、読み出す。
【０３３１】
また、アクセス先となる葉Ｌ＃（０ｘ５Ａ）の構造体においては、対象ビット列“０１０１００１１０１１００”のうち先頭１２ビットの圧縮符号“０１０１００１１０１１０”が格納されている。また、葉Ｌ＃（０ｘ５Ａ）の構造体の照合フラグがＯＮであるため、コンピュータは、葉Ｌ＃（０ｘ５Ａ）の構造体の照合／置換テーブルＴへのポインタｐ３により、当該ポインタｐ３のレコードと圧縮符号“０１０１００１１０１１０”とを照合する。この場合、前方一致となるため、ポインタｐ３のレコードの指定中フラグをＯＮ（０⇒１）にする。
【０３３２】
また、葉Ｌ＃（０ｘ５Ａ）の構造体には、圧縮符号長ｌｅｇ（＝１２ビット）も格納されているため、コンピュータは、圧縮符号長ｌｅｇも抽出する。コンピュータは、この抽出された圧縮符号長ｌｅｇによりビットアドレスａｂｉを更新する。この場合、更新後のビットアドレスａｂｉはａｂｉ＝０＋１２＝１２となる。
【０３３３】
図６７は、図６６に示した（Ａ）の状態からレジスタをバイトオフセットｂｙｏｓ分シフトした場合の伸長処理（（Ｂ）の状態）を示している。前回である（Ａ）のビットアドレスａｂｉはａｂｉ＝０、圧縮符号長ｌｅｇは１２ビットであるため、（Ｂ）のビットアドレスａｂｉはａｂｉ＝１２ビットとなる。
【０３３４】
また、このビットアドレスａｂｉ＝１２により、バイトオフセットｂｙｏｓ＝１、ビットオフセットｂｉｏｓ＝４となる。バイトオフセットｂｙｏｓ＝１により、コンピュータは、メモリに保持されている圧縮符号列のうち先頭１バイト目から４バイト分（図中、網掛け）の圧縮符号列をレジスタｒ２にセットする。
【０３３５】
また、ビットオフセットｂｉｏｓ＝４により、マスクパターンは、“０ｘ０ＦＦＦ８０００”であり、レジスタｒ２にセットされる。したがって、レジスタｒ１にセットされた圧縮符号列とレジスタｒ２にセットされたマスクパターン“０ｘ０ＦＦＦ８０００”を論理積（ＡＮＤ）演算することにより、レジスタｒ２においてＡＮＤ結果が得られる。
【０３３６】
また、ビットオフセットｂｉｏｓ＝４により、レジスタシフト数ｒｓは、ｒｓ＝３２−ｍ―ｂｉｏｓ＝３２−１３−４＝１５となる。したがって、コンピュータは、レジスタｒ２内のＡＮＤ結果を末尾方向に１５ビット分シフトする。このシフトによりレジスタｒ２には、“０００００１０１００１１０１１００”が残されるため、コンピュータは、末尾１３ビットを対象ビット列として抽出する。この場合は、“０１０１００１１０１１００”が対象ビット列として抽出される。抽出後、レジスタｒ２はクリアされる。
【０３３７】
図２８に示したように、２N分枝無節点ハフマン木の根の構造体には、葉Ｌ１〜Ｌ５４０１へのポインタが格納されている。したがって、コンピュータは、２N分枝無節点ハフマン木の根の構造体の中から、抽出された対象ビット列“０１０１００１１０１１００”と一致する葉Ｌ♯へのポインタを探索する。この場合、対象ビット列“０１０１００１１０１１００”が葉Ｌ＃（０ｘ５Ａ）へのポインタ群の中の１つと一致するため、コンピュータは、該当する葉Ｌ＃（０ｘ５Ａ）へのポインタを読み出して、葉Ｌ＃（０ｘ５Ａ）の構造体にアクセスする。
【０３３８】
葉Ｌ＃（０ｘ５Ａ）の構造体には、分割文字コード「０ｘ５Ａ」へのポインタが格納されているため、コンピュータは、分割文字コードの構造体６００の中から、分割文字コード“０ｘ５Ａ”へのポインタで分割文字コード「０ｘ５Ａ」を指定して、読み出す。
【０３３９】
また、アクセス先となる葉Ｌ＃（０ｘ５Ａ）の構造体においては、対象ビット列“０１０１００１１０１１００”のうち先頭１２ビットの圧縮符号“０１０１００１１０１１０”が格納されている。したがって、コンピュータは、照合／置換テーブルＴのうち指定中フラグがＯＮになっているレコード、ここでは、ポインタｐ３のレコードと圧縮符号“０１０１００１１０１１０”とを照合する。この照合は、指定中フラグがＯＮのため、後方一致照合をおこなう。そして、後方一致するため、ポインタｐ３のレコードの置換文字列「＜ｃｏｌｏｒ＞婚＜／ｃｏｌｏｒ＞」を伸長バッファ６６００に書き出す。このあと、コンピュータは指定中フラグを０に戻す。
【０３４０】
また、葉Ｌ＃（０ｘ５Ａ）の構造体には、圧縮符号長ｌｅｇ（＝１２ビット）も格納されているため、コンピュータは、圧縮符号長ｌｅｇも抽出する。コンピュータは、この抽出された圧縮符号長ｌｅｇによりビットアドレスａｂｉを更新する。この場合、更新後のビットアドレスａｂｉはａｂｉ＝１２＋１２＝２４となる。
【０３４１】
図６８は、図６７に示した（Ｂ）の状態からレジスタをバイトオフセットｂｙｏｓ分シフトした場合の伸長処理（（Ｃ）の状態）を示している。前回である（Ｂ）のビットアドレスａｂｉはａｂｉ＝１２、圧縮符号長ｌｅｇは１２ビットであるため、（Ｃ）のビットアドレスａｂｉはａｂｉ＝２４ビットとなる。
【０３４２】
また、このビットアドレスａｂｉ＝２４により、バイトオフセットｂｙｏｓ＝３、ビットオフセットｂｉｏｓ＝０となる。バイトオフセットｂｙｏｓ＝３により、メモリに保持されている圧縮符号列のうち先頭３バイト目から４バイト分（図中、網掛け）の圧縮符号列をレジスタｒ１にセットする。
【０３４３】
また、ビットオフセットｂｉｏｓ＝０により、マスクパターンは、“０ｘＦＦＦ８００００”であり、レジスタｒ２にセットされる。したがって、レジスタｒ１にセットされた圧縮符号列とレジスタｒ２にセットされたマスクパターン“０ｘＦＦＦ８００００”を論理積（ＡＮＤ）演算することにより、レジスタｒ２においてＡＮＤ結果が得られる。
【０３４４】
また、ビットオフセットｂｉｏｓ＝０により、レジスタシフト数ｒｓは、ｒｓ＝３２−ｍ―ｂｉｏｓ＝３２−１３−０＝１９となる。したがって、コンピュータは、レジスタｒ２内のＡＮＤ結果を末尾方向に１９ビット分シフトする。このシフトによりレジスタｒ２には、“００１１１００１０００１１”が残されるため、末尾１３ビットを対象ビット列として抽出する。この場合は、“００１１１００１０００１１”が対象ビット列として抽出される。抽出後、レジスタｒ２はクリアされる。
【０３４５】
図２８に示したように、２N分枝無節点ハフマン木の根の構造体には、葉Ｌ１〜Ｌ５４０１へのポインタが格納されている。したがって、コンピュータは、２N分枝無節点ハフマン木の根の構造体セルの中から、抽出された対象ビット列“００１１１００１０００１１”と一致する葉Ｌ♯へのポインタを探索する。この場合、対象ビット列“００１１１００１０００１１”が葉Ｌ＃（活）へのポインタ群の中の１つと一致するため、コンピュータは、該当する葉Ｌ＃（活）へのポインタを読み出して、葉Ｌ＃（活）の構造体にアクセスする。
【０３４６】
葉Ｌ＃（活）の構造体には、高位文字「活」へのポインタが格納されているため、コンピュータは、高位文字コードの構造体５００の中から、高位文字「活」へのポインタで高位文字「活」を指定して、読み出す。
【０３４７】
また、アクセス先となる葉Ｌ＃（活）の構造体においては、対象ビット列“００１１１００１０００１１”のうち先頭９ビットの圧縮符号“００１１１００１０”が格納されている。また、葉Ｌ＃（活）の構造体の照合フラグがＯＮであるため、コンピュータは、葉Ｌ＃（活）の構造体の照合／置換テーブルＴへのポインタｐ４により、当該ポインタｐ４のレコードと圧縮符号“００１１１００１０”とを照合する。この場合、完全一致となるため、ポインタｐ４のレコードの置換文字列「＜ｃｏｌｏｒ＞活＜／ｃｏｌｏｒ＞」を伸長バッファ６６００に書き出す。
【０３４８】
また、葉Ｌ＃（活）の構造体には、圧縮符号長ｌｅｇ（＝９ビット）も格納されているため、コンピュータは、圧縮符号長ｌｅｇも抽出する。コンピュータは、この抽出された圧縮符号長ｌｅｇによりビットアドレスａｂｉを更新する。この場合、更新後のビットアドレスａｂｉはａｂｉ＝２４＋９＝３３となる。
【０３４９】
図６９は、図６８に示した（Ｃ）の状態からレジスタをバイトオフセットｂｙｏｓ分シフトした場合の伸長処理（（Ｄ）の状態）を示している。前回である（Ｃ）のビットアドレスａｂｉはａｂｉ＝２４、圧縮符号長ｌｅｇは９ビットであるため、（Ｄ）のビットアドレスａｂｉはａｂｉ＝３３ビットとなる。
【０３５０】
また、このビットアドレスａｂｉ＝３３により、バイトオフセットｂｙｏｓ＝４、ビットオフセットｂｉｏｓ＝１となる。バイトオフセットｂｙｏｓ＝４により、コンピュータは、メモリに保持されている圧縮符号列のうち先頭４バイト目から４バイト分（図中、網掛け）の圧縮符号列をレジスタｒ１にセットする。
【０３５１】
また、ビットオフセットｂｉｏｓ＝１により、マスクパターンは、“０ｘ０７ＦＦＣ０００”であり、レジスタｒ２にセットされる。したがって、レジスタｒ１にセットされた圧縮符号列とレジスタｒ２にセットされたマスクパターン“０ｘ０７ＦＦＣ０００”を論理積（ＡＮＤ）演算することにより、ＡＮＤ結果が得られる。
【０３５２】
また、ビットオフセットｂｉｏｓ＝１により、レジスタシフト数ｒｓは、ｒｓ＝３２−ｍ―ｂｉｏｓ＝３２−１３−１＝１８となる。したがって、コンピュータは、レジスタｒ２内のＡＮＤ結果を末尾方向に１８ビット分シフトする。このシフトによりレジスタｒ２には、“０００１１１００１１０１０１”が残されるため、コンピュータは、末尾１３ビットを対象ビット列として抽出する。この場合は、“００１１１００１１０１０１”が対象ビット列として抽出される。抽出後、レジスタｒ２はクリアされる。
【０３５３】
図２８に示したように、２N分枝無節点ハフマン木の根の構造体には、葉Ｌ１〜Ｌ５４０１へのポインタが格納されている。したがって、コンピュータは、２N分枝無節点ハフマン木の根の構造体の中から、抽出された対象ビット列“００１１１００１１０１０１”と一致する葉Ｌ♯へのポインタを探索する。この場合、対象ビット列“００１１１００１１０１０１”が葉Ｌ＃（は）へのポインタ群の中の一つと一致するため、葉Ｌ＃（は）へのポインタを読み出して、葉Ｌ＃（は）の構造体にアクセスする。
【０３５４】
葉Ｌ＃（は）の構造体には、高位文字「は」へのポインタが格納されているため、コンピュータは、高位文字コードの構造体５００の中から、高位文字「は」へのポインタで高位文字「は」を指定して、読み出す。
【０３５５】
また、アクセス先となる葉Ｌ＃（は）の構造体においては、対象ビット列“００１１１００１１０１０１”のうち先頭９ビットの圧縮符号“００１１１００１１”が格納されている。また、葉Ｌ＃（は）の構造体の照合フラグがＯＦＦであるため、コンピュータは、照合／置換テーブルＴを参照しない。したがって、コンピュータは、高位文字コードの構造体５００から読み出された高位文字「は」を伸長バッファ６６００に書き出す。
【０３５６】
また、葉Ｌ＃（は）の構造体には、圧縮符号長ｌｅｇ（＝９ビット）も格納されているため、コンピュータは、圧縮符号長ｌｅｇも抽出する。コンピュータは、この抽出された圧縮符号長ｌｅｇによりビットアドレスａｂｉを更新する。この場合、更新後のビットアドレスａｂｉはａｂｉ＝３３＋９＝４２となる。
【０３５７】
図７０は、図６９に示した（Ｄ）の状態からレジスタをバイトオフセットｂｙｏｓ分シフトした場合の伸長処理（（Ｅ）の状態）を示している。前回である（Ｄ）のビットアドレスａｂｉはａｂｉ＝３３、圧縮符号長ｌｅｇは９ビットであるため、（Ｅ）のビットアドレスａｂｉはａｂｉ＝４２ビットとなる。
【０３５８】
また、このビットアドレスａｂｉ＝４２により、バイトオフセットｂｙｏｓ＝５、ビットオフセットｂｉｏｓ＝２となる。バイトオフセットｂｙｏｓ＝５により、コンピュータは、メモリに保持されている圧縮符号列のうち先頭５バイト目から４バイト分（図中、網掛け）の圧縮符号列をレジスタｒ１にセットする。
【０３５９】
また、ビットオフセットｂｉｏｓ＝２により、マスクパターンは、“０ｘ３ＦＦＥ００００”であり、レジスタｒ２にセットされる。したがって、レジスタｒ１にセットされた圧縮符号列とレジスタｒ２にセットされたマスクパターン“０ｘ３ＦＦＥ００００”を論理積（ＡＮＤ）演算することにより、ＡＮＤ結果が得られる。
【０３６０】
また、ビットオフセットｂｉｏｓ＝２により、レジスタシフト数ｒｓは、ｒｓ＝３２−ｍ―ｂｉｏｓ＝３２−１３−２＝１７となる。したがって、コンピュータは、レジスタｒ２内のＡＮＤ結果を末尾方向に１７ビット分シフトする。このシフトによりレジスタｒ２には、“０００１０１００１００００００”が残されるため、コンピュータは、末尾１３ビットを対象ビット列として抽出する。この場合は、“０１０１００１００００００”が対象ビット列として抽出される。抽出後、レジスタｒ２はクリアされる。
【０３６１】
図２８に示したように、２N分枝無節点ハフマン木の根の構造体には、葉Ｌ１〜Ｌ５４０１へのポインタが格納されている。したがって、コンピュータは、２N分枝無節点ハフマン木の根の構造体の中から、抽出された対象ビット列“０１０１００１００００００”と一致する葉Ｌ♯へのポインタを探索する。この場合、対象ビット列“０１０１００１００００００”が葉Ｌ＃（結婚）へのポインタと一致するため、コンピュータは、葉Ｌ（結婚）へのポインタを読み出して、葉Ｌ（結婚）の構造体にアクセスする。
【０３６２】
葉Ｌ＃（結婚）の構造体には、基礎単語「結婚」へのポインタが格納されているため、コンピュータは、特殊単語の構造体１００の中から、基礎単語「結婚」へのポインタで基礎単語「結婚」を指定して、読み出す。
【０３６３】
また、アクセス先となる葉Ｌ＃（結婚）の構造体においては、対象ビット列“０１０１００１００００００”のうち先頭１３ビットの圧縮符号“０１０１００１００００００”が格納されている。また、葉Ｌ＃（結婚）の構造体の照合フラグがＯＮであるため、コンピュータは、葉Ｌ＃（結婚）の構造体の照合／置換テーブルＴへのポインタｐ２により、当該ポインタｐ２のレコードと圧縮符号“０１０１００１００００００”とを照合する。この場合、前方一致となるため、ポインタｐ２のレコードの指定中フラグをＯＮ（０⇒１）にする。
【０３６４】
また、葉Ｌ＃（結婚）の構造体には、圧縮符号長ｌｅｇ（＝１３ビット）も格納されているため、コンピュータは、圧縮符号長ｌｅｇも抽出する。コンピュータは、この抽出された圧縮符号長ｌｅｇによりビットアドレスａｂｉを更新する。この場合、更新後のビットアドレスａｂｉはａｂｉ＝４２＋１３＝５５となる。
【０３６５】
図７１は、図７０に示した（Ｅ）の状態からレジスタをバイトオフセットｂｙｏｓ分シフトした場合の伸長処理（（Ｆ）の状態）を示している。前回である（Ｅ）のビットアドレスａｂｉはａｂｉ＝４２、圧縮符号長ｌｅｇは１３ビットであるため、（Ｆ）のビットアドレスａｂｉはａｂｉ＝５５ビットとなる。
【０３６６】
また、このビットアドレスａｂｉ＝５５により、バイトオフセットｂｙｏｓ＝６、ビットオフセットｂｉｏｓ＝７となる。バイトオフセットｂｙｏｓ＝６により、コンピュータは、メモリに保持されている圧縮符号列のうち先頭６バイト目から４バイト分（図中、網掛け）の圧縮符号列をレジスタｒ１にセットする。
【０３６７】
また、ビットオフセットｂｉｏｓ＝７により、マスクパターンは、“０ｘ０１ＦＦＦ０００”であり、レジスタｒ２にセットされる。したがって、レジスタｒ１にセットされた圧縮符号列とレジスタｒ２にセットされたマスクパターン“０ｘ０１ＦＦＦ０００”を論理積（ＡＮＤ）演算することにより、ＡＮＤ結果が得られる。
【０３６８】
また、ビットオフセットｂｉｏｓ＝７により、レジスタシフト数ｒｓは、ｒｓ＝３２−ｍ―ｂｉｏｓ＝３２−１３−７＝１２となる。したがって、コンピュータは、レジスタｒ２内のＡＮＤ結果を末尾方向に１２ビット分シフトする。このシフトによりレジスタｒ２には、“００００００００１０１００１００００１０”が残されるため、コンピュータは、末尾１３ビットを対象ビット列として抽出する。この場合は、“０１０１００１００００１０”が対象ビット列として抽出される。抽出後、レジスタｒ２はクリアされる。
【０３６９】
図２８に示したように、２N分枝無節点ハフマン木の根の構造体には、葉Ｌ１〜Ｌ５４０１へのポインタが格納されている。したがって、コンピュータは、２N分枝無節点ハフマン木の根の構造体の中から、抽出された対象ビット列“０１０１００１００００１０”と一致する葉Ｌ♯へのポインタを探索する。この場合、対象ビット列“０１０１００１００００１０”が葉Ｌ＃（活動）へのポインタと一致するため、コンピュータは、葉Ｌ（活動）へのポインタを読み出して、葉Ｌ（活動）の構造体にアクセスする。
【０３７０】
葉Ｌ＃（活動）の構造体には、基礎単語「活動」へのポインタが格納されているため、コンピュータは、特殊単語の構造体１００の中から、基礎単語「活動」へのポインタで基礎単語「活動」を指定して、読み出す。
【０３７１】
また、アクセス先となる葉Ｌ＃（活動）の構造体においては、対象ビット列“０１０１００１００００１０”のうち先頭１３ビットの圧縮符号“０１０１００１００００１０”が格納されている。したがって、コンピュータは、照合／置換テーブルＴのうち指定中フラグがＯＮになっているレコード、ここでは、ポインタｐ２のレコードと圧縮符号“０１０１００１００００１０”とを照合する。この照合は、指定中フラグがＯＮのため、後方一致照合をおこなう。そして、後方一致するため、ポインタｐ２のレコードの置換文字列「結＜ｃｏｌｏｒ＞婚活＜／ｃｏｌｏｒ＞動」を伸長バッファ６６００に書き出す。このあと、コンピュータは指定中フラグを０に戻す。
【０３７２】
また、葉Ｌ＃（活動）の構造体には、圧縮符号長ｌｅｇ（＝１３ビット）も格納されているため、コンピュータは、圧縮符号長ｌｅｇも抽出する。コンピュータは、この抽出された圧縮符号長ｌｅｇによりビットアドレスａｂｉを更新する。この場合、更新後のビットアドレスａｂｉはａｂｉ＝５５＋１３＝６８となる。したがって、圧縮符号列がなくなるまで、伸長処理を継続することとなる。
【０３７３】
このように、葉へのポインタには圧縮符号が含まれているため、いずれの葉へのポインタが抽出された場合であっても、圧縮符号を特定するまでもなく、直接葉の構造体にアクセスすることができる。したがって、伸長処理の高速化を実現することができる。
【０３７４】
＜機能的構成＞
図７２は、本実施の形態にかかるコンピュータの機能的構成例（その２）を示すブロック図である。コンピュータは、入力部７２００と、第１の検索部７２０１と、第２の検索部７２０２と、抽出部７２０３と、作成部７２０４と、判定部７２０５と、伸長部７２０６と、を備える。入力部７２００〜伸長部７２０６は、具体的には、たとえば、図３４に示したＲＯＭ３４０２、ＲＡＭ３４０３、磁気ディスク３４０５、光ディスク３４０７などの記憶装置に記憶されたプログラムをＣＰＵ３４０１に実行させることにより、その機能を実現する。なお、図７２で機能的構成として示したコンピュータは、図３５において機能的構成として示したコンピュータと同一コンピュータでもよく、異なるコンピュータでもよい。
【０３７５】
入力部７２００は、２個以上の文字からなる検索文字列の入力を受け付ける。具体的には、出現頻度にかかわらず、たとえば、２連続文字の入力を受け付ける。たとえば、ユーザが入力装置（キーボードやマウス、タッチパッド）を操作することで、入力部７２００は、２個の文字からなる検索文字列の入力を受け付ける。なお、２連続文字のほか、３連続以上の文字列でもよい。
【０３７６】
第１の検索部７２０１は、入力部７２００によって入力された検索文字列をデータベース７２１０から検索する。データベース７２１０とは、上述した特殊単語の構造体１００、高位文字コードの構造体５００、分割文字コードの構造体６００からなるデータ構造体である。第１の検索部７２０１は、具体的には、たとえば、特殊単語の構造体１００から検索文字列を検索する。
【０３７７】
第２の検索部７２０２は、第１の検索部７２０１によって検索されなかった場合、検索文字列の先頭文字を末尾文字とする先行単語と、検索文字列の末尾文字を先頭文字とする後続単語と、をデータベース７２１０の単語の集合から検索する。データベース７２１０の単語の集合とは、特殊単語の構造体１００である。
【０３７８】
第２の検索部７２０２は、検索文字列がたとえば「婚活」である場合、「婚活」の先頭文字「婚」を末尾文字とする単語、たとえば、「結婚」、「離婚」といった単語を先行単語として検索する。また、第２の検索部７２０２は、検索文字列「婚活」の末尾文字「活」を先頭文字とする単語、たとえば、「活動」、「活用」といった単語を後続単語として検索する。
【０３７９】
抽出部７２０３は、第２の検索部７２０２によって先行単語および後続単語が検索された場合、２N分枝無節点ハフマン木Ｈのうち先行単語の圧縮符号を先行単語に関連付けされた葉から抽出する。上記の例では、抽出部７２０３は、先行単語「結婚」の圧縮符号を、当該圧縮符号を格納する葉Ｌ＃（結婚）の構造体から抽出する。同様に、後続単語「活動」の圧縮符号を、当該圧縮符号を格納する葉Ｌ＃（活動）の構造体から抽出する。
【０３８０】
作成部７２０４は、先行単語の圧縮符号と後続単語の圧縮符号とを連結させた連結圧縮符号と、先行単語および後続単語からなりかつ先行単語の末尾文字と後続単語の先頭文字とを特徴付ける情報を埋め込んだ置換文字列と、を関連付けて記憶するテーブルを作成する。テーブルとは、照合／置換テーブルＴである。上記の例では、作成部７２０４は、先行単語「結婚」の圧縮符号と後続単語「活動」の圧縮符号を連結した連結圧縮符号を生成する（図４の照合／置換テーブルＴ４のポインタｐ２のレコードを参照）。
【０３８１】
また、作成部７２０４は、先行単語および後続単語からなりかつ先行単語の末尾文字と後続単語の先頭文字とを特徴付ける情報を埋め込んだ置換文字列を生成する。上記の例では、先行単語「結婚」と後続単語「活動」からなり、先行単語の末尾文字「婚」と後続単語の先頭文字「活」とを特徴付ける情報を埋め込んだ置換文字列を生成する。特徴付ける情報とは、たとえば、先行単語の末尾文字と後続単語の先頭文字の色を変更したり、その背景を変更したり、フォントを変更したりするタグである。そして、作成部７２０４は、連結圧縮符号と置換文字列とを関連付けて照合／置換テーブルＴに格納する図４の照合／置換テーブルＴ４のポインタｐ２のレコードを参照）。
【０３８２】
判定部７２０５は、圧縮ファイルｆｉ内の圧縮符号列が作成部７２０４によって作成されたテーブル内の連結圧縮符号と一致するか否かを判定する。具体的には、たとえば、判定部７２０５は、圧縮ファイルｆｉ内の圧縮符号列が作成部７２０４によって作成された照合／置換テーブルＴ内の連結圧縮符号と一致するか否かを判定する。
【０３８３】
伸長部７２０６は、判定部７２０５によって一致すると判定された場合、連結圧縮符号に関連付けられた置換文字列を伸長先に書き出す。具体的には、伸長部７２０６は、判定部７２０５によって一致すると判定された場合、先行単語「結婚」と後続単語「活動」との連結圧縮符号に関連付けられた置換文字列「結＜ｃｏｌｏｒ＞婚活＜／ｃｏｌｏｒ＞動」を伸長先となる伸長バッファに書き出すこととなる。
【０３８４】
＜検索処理手順＞
図７３は、本実施の形態にかかる検索処理手順を示すフローチャートである。まず、コンピュータは、検索文字列の入力を待ち受け（ステップＳ７３０１：Ｎｏ）、検索文字列が入力された場合（ステップＳ７３０１：Ｙｅｓ）、ファイル絞込み処理（ステップＳ７３０２）、照合／置換テーブルＴ作成処理（ステップＳ７３０３）、伸長処理（ステップＳ７３０４）を実行する。ファイル絞込み処理（ステップＳ７３０２）は、圧縮ファイル群Ｆｓの中から検索文字列を構成する文字情報が存在する対象ファイルの圧縮ファイルを絞り込む。ファイル絞込み処理（ステップＳ７３０２）の詳細については、図７４および図７５で後述する。
【０３８５】
照合／置換テーブルＴ作成処理（ステップＳ７３０３）は、図１〜図１１に示したように、照合／置換テーブルＴを作成する。照合／置換テーブルＴ作成処理（ステップＳ７３０３）の詳細については、図７６で後述する。伸長処理（ステップＳ７３０４）は、ファイル絞込み処理（ステップＳ７３０２）で絞り込まれた圧縮ファイルを伸長する過程で、照合／置換テーブルＴ作成処理（ステップＳ７３０３）で作成された照合／置換テーブルＴを用いて、伸長対象となる圧縮符号列と検索文字列の圧縮文字列とを照合する。伸長処理（ステップＳ７３０４）については、図８２で後述する。
【０３８６】
図７４は、図７３に示したファイル絞込み処理（ステップＳ７３０２）の詳細な処理手順を示すフローチャート（その１）である。まず、コンピュータは、検索文字列を対象文字列に設定し（ステップＳ７４０１）、最長一致検索処理を実行する（ステップＳ７４０２）。最長一致検索処理（ステップＳ７４０２）は、図４３に示した最長一致検索処理（ステップＳ４３０１）と同一処理であるため説明を省略する。
【０３８７】
そして、コンピュータは、特殊単語の構造体１００において、最長一致検索処理（ステップＳ７４０２）で得られた最長一致検索結果を２分探索する（ステップＳ７４０３）。最長一致検索結果が、特殊単語の構造体１００で探索された場合（ステップＳ７４０３：Ｙｅｓ）、対象文字列である特殊単語について、その特殊単語の出現マップを特殊単語の出現マップ群から取得する（ステップＳ７４０４）。
【０３８８】
そして、コンピュータは、対象文字列に後続があるか否かを判断する（ステップＳ７４０５）。後続がある場合（ステップＳ７４０５：Ｙｅｓ）、コンピュータは、後続文字列を対象文字列に設定して（ステップＳ７４０６）、最長一致検索処理（ステップＳ７４０２）に戻る。一方、後続がない場合（ステップＳ７４０５：Ｎｏ）、これまでに取得された出現マップ群のＡＮＤ演算で対象ファイルを絞り込む（ステップＳ７４０７）。これにより、ファイル絞込み処理（ステップＳ７３０２）は終了し、照合／置換テーブルＴ作成処理（ステップＳ７３０３）に移行する。
【０３８９】
また、ステップＳ７４０３において、最長一致検索結果が、特殊単語の構造体１００で探索されなかった場合（ステップＳ７４０３：Ｎｏ）、図７５のステップＳ７５０１に移行する。具体的には、最長一致検索結果が特殊単語の構造体１００に登録されていない場合、または、最長一致検索で最長一致候補がなかった場合（ステップＳ４４１０：Ｎｏ）に、図７５のステップＳ７５０１に移行する。
【０３９０】
図７５は、図７３に示したファイル絞込み処理（ステップＳ７３０２）の詳細な処理手順を示すフローチャート（その２）である。図７５では、対象文字列を構成する文字ごとに、出現マップを取得する処理である。
【０３９１】
まず、コンピュータは、対象文字列の先頭文字を対象文字に設定する（ステップＳ７５０１）。つぎに、コンピュータは、高位文字コードの構造体５００において対象文字を２分探索する（ステップＳ７５０２）。対象文字が探索された場合（ステップＳ７５０３：Ｙｅｓ）、コンピュータは、高位文字の出現マップ群から対象文字の出現マップを取得する（ステップＳ７５０４）。そして、図７４のステップＳ７４０５に戻る。
【０３９２】
一方、ステップＳ７５０３において、探索されなかった場合（ステップＳ７５０３：Ｎｏ）、コンピュータは、対象文字を上位８ビットと下位８ビットに分割する（ステップＳ７５０５）。そして、コンピュータは、分割文字コードの出現マップ群の中から上位分割文字コードの出現マップを取得する（ステップＳ７５０６）。
【０３９３】
また、コンピュータは、分割文字コードの出現マップ群の中から下位分割文字コードの出現マップを取得する（ステップＳ７５０７）。そして、図７４のステップＳ７４０５に戻る。このように、図７５に示した処理手順により、対象文字についての出現マップを取得することができる。したがって、図７４のステップＳ７４０７でのＡＮＤ演算により圧縮ファイルの絞込みができることとなる。
【０３９４】
図７６は、図７３に示した照合／置換テーブルＴ作成処理（ステップＳ７３０３）の詳細な処理手順を示すフローチャートである。まず、コンピュータは、検索文字列を対象文字列に設定し（ステップＳ７６０１）、対象文字列が１文字であるか否かを判断する（ステップＳ７６０２）。１文字である場合（ステップＳ７６０２：Ｙｅｓ）、文字コード設定処理（ステップＳ７６０８）に移行する。一方、１文字でない場合（ステップＳ７６０２：Ｎｏ）、コンピュータは、特殊単語設定処理を実行する（ステップＳ７６０３）。特殊単語設定処理（ステップＳ７６０３）では、たとえば、図９に示したような照合／置換テーブルＴ１を作成する処理である。特殊単語設定処理（ステップＳ７６０３）の詳細については図７７で後述する。
【０３９５】
特殊単語設定処理（ステップＳ７６０３）では最長一致検索を実行するため、対象文字列の中に特殊単語が含まれているか否かが判別される。そして、コンピュータは、特殊単語設定処理（ステップＳ７６０３）において、特殊単語があったか否かを判断する（ステップＳ７６０４）。特殊単語があった場合（ステップＳ７６０４：Ｙｅｓ）、コンピュータは、対象文字列に後続があるか否かを判断する（ステップＳ７６０５）。
【０３９６】
後続がある場合（ステップＳ７６０５：Ｙｅｓ）、コンピュータは、後続文字列を対象文字列に設定し（ステップＳ７６０６）、ステップＳ７６０２に戻る。一方、後続がない場合（ステップＳ７６０５：Ｎｏ）、照合／置換テーブルＴ作成処理（ステップＳ７３０３）を終了し、伸長処理（ステップＳ７３０４）に移行する。
【０３９７】
また、ステップＳ７６０４において、特殊単語設定処理（ステップＳ７６０３）で特殊単語がなかった場合（ステップＳ７６０４：Ｎｏ）、コンピュータは、非特殊単語設定処理を実行する（ステップＳ７６０７）。非特殊単語設定処理（ステップＳ７６０７）は、たとえば、図２に示したように照合／置換テーブルＴ０から照合／置換テーブルＴ１を作成し、図３および図４に示したように、さらに照合／置換テーブルＴ１から照合／置換テーブルＴ４を作成する処理手順である。非特殊単語設定処理（ステップＳ７６０７）の詳細については図７８および図７９で後述する。
【０３９８】
そして、コンピュータは、文字コード設定処理を実行する（ステップＳ７６０８）。文字コード設定処理（ステップＳ７６０８）は、たとえば、検索文字列に含まれている高位文字について、図８に示した照合／置換テーブルＴ６のポインタｐ４のレコードや、図１０に示した照合／置換テーブルＴ２のポインタｐ２のレコードを作成する処理である。文字コード設定処理（ステップＳ７６０８）については図８０で後述する。
【０３９９】
図７７は、図７６に示した特殊単語設定処理（ステップＳ７６０３）の詳細な処理手順を示すフローチャートである。まず、コンピュータは、対象文字列に対し最長一致検索処理を実行する（ステップＳ７７０１）。最長一致検索処理（ステップＳ７７０１）は、最長一致検索処理（ステップＳ４３０１、Ｓ７４０２）と同一処理であるため、説明を省略する。
【０４００】
つぎに、コンピュータは、特殊単語の構造体１００において、最長一致検索された特殊単語を２分探索する（ステップＳ７７０２）。探索されなかった場合（ステップＳ７７０２：Ｎｏ）、図７６のステップＳ７６０４に移行する。最長一致検索処理（ステップＳ７７０１）で特殊単語が得られなかった場合も、図７６のステップＳ７６０４に移行する。
【０４０１】
一方、探索された場合（ステップＳ７７０２：Ｙｅｓ）、コンピュータは、特殊単語の構造体１００の葉へのポインタにより、探索特殊単語の葉の構造体を指定する（ステップＳ７７０３）。そして、コンピュータは、指定先である探索特殊単語の葉の構造体内の照合フラグをＯＮにする（ステップＳ７７０４）。つぎに、コンピュータは、照合／置換テーブルＴの空きポインタを検出して、検出された空きポインタを照合／置換テーブルＴへのポインタとして探索特殊単語の葉の構造体内に設定する（ステップＳ７７０５）。
【０４０２】
そして、コンピュータは、照合／置換テーブルＴにおいて、照合／置換テーブルＴへのポインタとして探索特殊単語の葉の構造体内に設定された空きポインタのレコードに、探索特殊単語の圧縮符号長、圧縮符号、置換文字列を設定する（ステップＳ７７０６）。このあと、図７６のステップＳ７６０４に移行する。図７７に示した特殊単語設定処理（ステップＳ７６０３）では、図９に示したような照合／置換テーブルＴ１を作成することができる。
【０４０３】
図７８は、図７６に示した非特殊単語設定処理（ステップＳ７６０７）の詳細な処理手順を示すフローチャート（その１）である。図７８の処理手順は、図２に示したように、たとえば、照合／置換テーブルＴ１を作成する処理手順である。
【０４０４】
コンピュータは、特殊単語の構造体１００において、対象文字列と末尾文字が一致する特殊単語を２分探索する（ステップＳ７８０１）。探索された場合（ステップＳ７８０２：Ｙｅｓ）、コンピュータは、特殊単語の構造体１００の葉へのポインタにより、探索特殊単語の葉の構造体を指定する（ステップＳ７８０３）。そして、コンピュータは、指定先である探索特殊単語の葉の構造体内の照合フラグをＯＮにする（ステップＳ７８０４）。つぎに、コンピュータは、照合／置換テーブルＴの空きポインタを検出して、検出された空きポインタを照合／置換テーブルＴへのポインタとして探索特殊単語の葉の構造体内に設定する（ステップＳ７８０５）。
【０４０５】
そして、コンピュータは、照合／置換テーブルＴにおいて、照合／置換テーブルＴへのポインタとして探索特殊単語の葉の構造体内に設定された空きポインタのレコードに、探索特殊単語の圧縮符号長、圧縮符号、置換文字列を設定する（ステップＳ７８０６）。このあと、ステップＳ７８０２に戻り、次に探索されたか否かを判断する。
【０４０６】
ステップＳ７８０２において、探索されなかった場合（ステップＳ７８０２：Ｎｏ）、コンピュータは、特殊単語の構造体１００での探索が終了したか否かを判断する（ステップＳ７８０７）。探索が終了していない場合（ステップＳ７８０７：Ｎｏ）、ステップＳ７８０２に戻る。一方、探索が終了した場合（ステップＳ７８０７：Ｙｅｓ）、コンピュータは、対象文字列と末尾文字が一致する特殊単語があったか否かを判断する（ステップＳ７８０８）。すなわち、ステップＳ７８０３〜Ｓ７８０６を実行したか否かを判断する。
【０４０７】
対象文字列と末尾文字が一致する特殊単語があった場合（ステップＳ７８０８：Ｙｅｓ）、図７９のステップＳ７９０１に移行する。一方、対象文字列と末尾文字が一致する特殊単語がなかった場合（ステップＳ７８０８：Ｎｏ）、非特殊単語設定処理（ステップＳ７６０７）を終了し、図７６のステップＳ７６０８に移行する。このように、図７８の処理手順では、図２に示したように、照合／置換テーブルＴ１を作成することができる。
【０４０８】
図７９は、図７６に示した非特殊単語設定処理（ステップＳ７６０７）の詳細な処理手順を示すフローチャート（その２）である。図７９の処理手順は、図３や図４に示したように、たとえば、照合／置換テーブルＴ３，Ｔ４を作成する処理手順である。
【０４０９】
コンピュータは、特殊単語の構造体１００において、対象文字列と先頭文字が一致する特殊単語を２分探索する（ステップＳ７９０１）。探索された場合（ステップＳ７９０２：Ｙｅｓ）、コンピュータは、照合／置換テーブルＴの未完成レコードを空きポインタにコピーする（ステップＳ７９０３）。
【０４１０】
未完成レコードとは、図７８で設定されたレコード（たとえば、図２に示したポインタｐ１のレコード）のように、図７９での設定が完了していないレコードである。たとえば、図３の（９）に示したように、コンピュータは、照合／置換テーブルＴ１を照合／置換テーブルＴ２に更新して、ポインタｐ２のレコードを生成する。未完成レコードをコピーするのは、さらなる探索（ステップＳ７９０２）で、対象文字列と先頭文字が一致する特殊単語が探索された場合に備えるためである。
【０４１１】
つぎに、コンピュータは、特殊単語の構造体１００の葉へのポインタにより、探索特殊単語の葉の構造体を指定する（ステップＳ７９０４）。そして、コンピュータは、末尾文字が一致する特殊単語の未完成レコードごとに、先頭文字が一致する特殊単語の圧縮符号長を加算し、圧縮符号を連結し、置換文字列を更新する（ステップＳ７９０５）。たとえば、コンピュータは、図３の照合／置換テーブルＴ２のポインタｐ１のレコードを、照合／置換テーブルＴ３のポインタｐ１のレコードのように更新する。また、コンピュータは、図４の照合／置換テーブルＴ３のポインタｐ２のレコードを、照合／置換テーブルＴ４のポインタｐ２のレコードのように更新する。
【０４１２】
また、ステップＳ７９０２において、探索されなかった場合（ステップＳ７９０２：Ｎｏ）、コンピュータは、特殊単語の構造体１００の２分探索が終了したか否かを判断する（ステップＳ７９０６）。探索が終了していない場合（ステップＳ７９０６：Ｎｏ）、ステップＳ７９０２に戻る。一方、探索が終了した場合（ステップＳ７９０６：Ｙｅｓ）、コンピュータは、照合／置換テーブルＴにおいて残されている未完成レコードを消去する（ステップＳ７９０７）。そして、図７６の文字コード設定処理（ステップＳ７６０８）に移行する。このように、図７９の処理手順では、図３や図４に示したように、照合／置換テーブルＴ３、Ｔ４を作成することができる。
【０４１３】
図８０は、図７６に示した文字コード設定処理（ステップＳ７６０８）の詳細な処理手順を示すフローチャートである。まず、コンピュータは、対象文字列の先頭文字を対象文字に設定し（ステップＳ８００１）、高位文字コードの構造体５００において、対象文字を２分探索する（ステップＳ８００２）。探索された場合（ステップＳ８００３：Ｙｅｓ）、コンピュータは、高位文字コードの構造体５００の葉へのポインタにより、探索文字の葉の構造体を指定する（ステップＳ８００４）。
【０４１４】
そして、コンピュータは、指定先である探索文字の葉の構造体内の照合フラグをＯＮにする（ステップＳ８００５）。つぎに、コンピュータは、照合／置換テーブルＴの空きポインタを検出して、検出された空きポインタを照合／置換テーブルＴへのポインタとして探索文字の葉の構造体内に設定する（ステップＳ８００６）。
【０４１５】
そして、コンピュータは、照合／置換テーブルＴにおいて、照合／置換テーブルＴへのポインタとして探索文字の葉の構造体内に設定された空きポインタのレコードに、探索文字の圧縮符号長、圧縮符号、置換文字列を設定する（ステップＳ８００７）。このあと、図７６のステップＳ７６０５に移行する。
【０４１６】
一方、ステップＳ８００３において、探索されなかった場合（ステップＳ８００３：Ｎｏ）、分割文字コード設定処理を実行して（ステップＳ８００８）、図７６のステップＳ７６０５に移行する。このように、図８０に示した文字コード設定処理（ステップＳ７６０８）では、検索文字列に含まれている高位文字について、図８に示した照合／置換テーブルＴ６のポインタｐ４のレコードや、図１０に示した照合／置換テーブルＴ２のポインタｐ２のレコードを作成することができる。
【０４１７】
図８１は、図８０に示した分割文字コード設定処理（ステップＳ８００８）の詳細を示すフローチャートである。分割文字コード設定処理（ステップＳ８００８）は、検索対象文字列に含まれている分割文字コードについて、図６に示した照合／置換テーブルＴ４のポインタｐ３のレコードや、図７に示した照合／置換テーブルＴ５のポインタｐ３のレコード、図１０〜図１１に示した照合／置換テーブルＴ２〜Ｔ４のポインタｐ３のレコードを作成する処理である。
【０４１８】
まず、コンピュータは、対象文字を上位８ビットと下位８ビットに分割し（ステップＳ８１０１）、分割文字コードの構造体６００において、上位分割文字コードを２分探索する（ステップＳ８１０２）。そして、コンピュータは、分割文字コードの構造体６００において、探索された上位分割文字コードの葉の構造体を指定する（ステップＳ８１０３）。そして、コンピュータは、指定先となる葉の構造体内の照合フラグをＯＮにする（ステップＳ８１０４）。
【０４１９】
つぎに、コンピュータは、照合／置換テーブルＴの空きポインタを検出して、探索された上位分割文字コードの葉の構造体での照合／置換テーブルＴへのポインタとして設定する（ステップＳ８１０５）。このあと、コンピュータは、探索された上位分割文字コードの葉の構造体での照合／置換テーブルＴへのポインタとして設定された空きポインタのレコードに、上位分割文字コードの圧縮符号長、圧縮符号、置換文字列を設定する（ステップＳ８１０６）。たとえば、図６の照合／置換テーブルＴ４のポインタｐ３のレコードのように設定する。
【０４２０】
また、コンピュータは、分割文字コードの構造体６００において、下位分割文字コードを２分探索する（ステップＳ８１０７）。そして、コンピュータは、分割文字コードの構造体６００において、探索された下位分割文字コードの葉の構造体を指定する（ステップＳ８１０８）。このあと、コンピュータは、照合／置換テーブルＴにおける上位分割文字コードについて設定されたレコードに、下位分割文字コードの圧縮符号長を加算し、圧縮符号を連結し、置換文字列を更新する（ステップＳ８１０９）。
【０４２１】
たとえば、図７に示したように、照合／置換テーブルＴ４のポインタｐ３のレコードを、照合／置換テーブルＴ５のポインタｐ３のレコードのように更新する。このあと、図７６のステップＳ７６０５に移行する。このように、分割文字コード設定処理（ステップＳ８００８）によれば、分割文字コードで構成される低出現頻度の文字についても、置換文字列を生成することができる。
【０４２２】
図８２は、２N分枝無節点ハフマン木を用いた伸長処理手順を示すフローチャートである。図８２において、まず、コンピュータは、ビットアドレスａｂｉをａｂｉ＝０とし（ステップＳ８２０１）、バイトオフセットｂｙｏｓを算出し（ステップＳ８２０２）、ビットオフセットｂｉｏｓを算出する（ステップＳ８２０３）。そして、コンピュータは、バイトオフセットｂｙｏｓの位置からの圧縮符号列をレジスタｒ１にセットする（ステップＳ８２０４）。
【０４２３】
つぎに、コンピュータは、レジスタｒ２にセットされたマスクパターンをビットオフセットｂｉｏｓ分、末尾方向にシフトして（ステップＳ８２０５）、レジスタｒ１にセットされた圧縮符号列とのＡＮＤ演算をおこなう（ステップＳ８２０６）。このあと、コンピュータは、レジスタシフト数ｒｓを算出して（ステップＳ８２０７）、ＡＮＤ演算後のレジスタｒ２をレジスタシフト数ｒｓ分、末尾にシフトする（ステップＳ８２０８）。
【０４２４】
図８３は、図７３に示した２N分枝無節点ハフマン木を用いた伸長処理（ステップＳ７３０４）の詳細な処理手順を示すフローチャートである。ステップＳ８２０８のあと、図８３において、コンピュータは、シフト後のレジスタｒ２から末尾Ｎビットを対象ビット列として抽出する（ステップＳ８３０１）。つぎに、コンピュータは、２N分枝無節点ハフマン木の根の構造体から葉Ｌ♯へのポインタを特定し（ステップＳ８３０２）、ポイント先となる葉Ｌ♯の構造体に１パスでアクセスする（ステップＳ８３０３）。このあと、コンピュータは、照合置換処理を実行する（ステップＳ８３０４）。照合置換処理（ステップＳ８３０４）の詳細は、図８４で後述する。
【０４２５】
照合置換処理（ステップＳ８３０４）のあと、コンピュータは、葉Ｌ♯の構造体から圧縮符号長ｌｅｇを抽出し（ステップＳ８３０５）、ビットアドレスａｂｉを更新する（ステップＳ８３０６）。このあと、コンピュータは、メモリに圧縮符号列があるか否か、具体的には、マスクパターンによるマスク処理が施されていない圧縮符号列があるか否かを判断する（ステップＳ８３０７）。たとえば、バイトオフセットｂｙｏｓに該当するバイト位置があるか否かにより判断する。圧縮符号列がある場合（ステップＳ８３０７：Ｙｅｓ）、図８２のステップＳ８２０２に戻る。一方、圧縮符号列がない場合（ステップＳ８３０７：Ｎｏ）、伸長処理（ステップＳ７３０４）を終了する。
【０４２６】
このような伸長処理により、圧縮符号列からＮビット単位で圧縮符号を抽出することができ、さらに、２N分枝無節点ハフマン木の根の構造体にアクセスすることで、該当する枝番号となる葉Ｌ♯へのポインタを特定することができる。そして、アクセス先となる葉Ｌ♯の構造体から文字コードを抽出することで、圧縮符号を伸長する。このように、２N分枝無節点ハフマン木は、内部節点を有していないため、葉Ｌ♯へのポインタが特定されれば、１パスで葉Ｌ♯の構造体にアクセスすることができ、伸長速度の高速化を図ることができる。
【０４２７】
図８４は、図８３に示した照合置換処理（ステップＳ８３０４）の詳細な処理手順を示すフローチャートである。まず、コンピュータは、指定先となる葉の構造体内の照合フラグがＯＮであるか否かを判断する（ステップＳ８４０１）。照合フラグがＯＮである場合（ステップＳ８４０１：Ｙｅｓ）、コンピュータが、指定先となる葉の構造体内の照合／置換テーブルＴへのポインタにより、照合／置換テーブルＴの該当レコードを指定する（ステップＳ８４０２）。そして、コンピュータは、指定先となる葉の構造体内の圧縮符号長と、照合／置換テーブルＴの指定先レコードでの圧縮符号長とが一致するか否かを判断する（ステップＳ８４０３）。
【０４２８】
一致する場合（ステップＳ８４０３：Ｙｅｓ）、コンピュータは、照合／置換テーブルＴの指定先レコードにある置換文字列を伸長バッファに書き出して（ステップＳ８４０４）、ステップＳ８３０５に移行する。一方、不一致である場合（ステップＳ８４０３：Ｎｏ）、コンピュータは、指定先レコードの指定中フラグをＯＮにして（ステップＳ８４０５）、ステップＳ８３０５に移行する。なお、不一致の場合でも、照合フラグがＯＮであるため、指定先レコードの圧縮符号列と指定先となる葉の構造体内の圧縮符号とは前方一致する。
【０４２９】
また、ステップＳ８４０１において、照合フラグがＯＦＦである場合（ステップＳ８４０１：Ｎｏ）、指定中フラグがＯＮである指定先レコードが照合／置換テーブルＴにあるか否かを判断する（ステップＳ８４０６）。指定中フラグがＯＮである指定先レコードがある場合（ステップＳ８４０６：Ｙｅｓ）、コンピュータは、指定中フラグがＯＮである指定先レコードのうち、圧縮符号が後方一致する指定先レコードを特定する（ステップＳ８４０７）。
【０４３０】
そして、コンピュータは、特定された指定先レコードの置換文字列を伸長バッファに書き出して（ステップＳ８４０８）、特定された指定先レコードの指定中フラグをＯＦＦにする（ステップＳ８４０９）。これにより、図７０および図７１のように置換文字列を伸長バッファに書き出すことができる。このあと、ステップＳ８３０５に移行する。
【０４３１】
また、ステップＳ８４０６において、指定中フラグがＯＮである指定先レコードがない場合（ステップＳ８４０６：Ｎｏ）、コンピュータは、該当する文字情報の構造体から文字情報を取得し（ステップＳ８４１０）、取得した文字情報を伸長バッファに書き出す（ステップＳ８４１１）。すなわち、コンピュータは、指定先となる葉の構造体において照合フラグがＯＦＦであっても、また、葉の構造体で指定される文字情報が、高位文字、分割文字コード、特殊単語にかかわらず、伸長バッファに書き出すことができる。このあと、ステップＳ８３０５に移行する。
【０４３２】
以上説明したように、本実施の形態によれば、基礎単語として登録されていない未登録単語であっても高精度な検索をおこなうことができる。たとえば、上述したように、「婚活」について「結婚」「活動」の連結圧縮符号及び置換文字列「結婚活動」を登録しておき、圧縮符号列と連続圧縮符号が一致したら置換文字列を書出す。これにより、未登録単語「婚活」であるがゆえに「婚」と「活」に分離されてしまうといういわゆる泣き別れを防止することができ、未登録単語の検索精度の向上を図ることができる。また、このような処理により、伸長速度の向上も図ることができる。
【０４３３】
また、検索文字列を構成する高位文字について照合／置換テーブルＴを作成することにより、圧縮状態のまま圧縮符号列と検索文字列に含まれている高位文字の圧縮符号とを照合することができる。これにより、伸長しながら高位文字の置換文字列を書き出すことができる。置換文字列は検索文字列を構成する高位文字として強調表示される。このように、検索精度の向上や、検索速度および伸長速度の高速化を実現することができる。
【０４３４】
また、検索文字列を構成する低出現頻度の文字についても、分割文字コードについて照合／置換テーブルＴを作成することにより、圧縮状態のまま圧縮符号列と検索文字列に含まれている分割文字コードの圧縮符号とを照合することができる。これにより、伸長しながら低出現頻度の文字の置換文字列を書き出すことができる。置換文字列は検索文字列を構成する低出現頻度の文字として強調表示される。このように、検索精度の向上や、検索速度および伸長速度の高速化を実現することができる。
【０４３５】
また、検索文字列を構成する特殊単語について照合／置換テーブルＴを作成することにより、圧縮状態のまま圧縮符号列と検索文字列に含まれている特殊単語の圧縮符号とを照合することができる。これにより、伸長しながら低出現頻度の文字の置換文字列を書き出すことができる。置換文字列は検索文字列を構成する特殊単語として強調表示される。このように、検索精度の向上や、検索速度および伸長速度の高速化を実現することができる。
【０４３６】
また、検索文字列が基礎単語ではない場合であっても、先行する基礎単語の末尾文字と後続の基礎単語の先頭文字との２連続文字の場合においても、照合／置換テーブルＴを作成することができる。これにより、たとえば、「婚活」といった基礎単語ではない検索文字列であっても、「結＜ｃｏｌｏｒ＞婚活＜／ｃｏｌｏｒ＞用」、「結＜ｃｏｌｏｒ＞婚活＜／ｃｏｌｏｒ＞動」のように、検索文字列「婚活」を含む置換文字列を伸長して書き出すことができる。置換文字列は、タグにより「婚活」として強調表示される。このように、基礎単語にはない略語のような文字列であっても、検索精度の向上や、検索速度および伸長速度の高速化を実現することができる。
【０４３７】
また、文字情報の総種類数に応じて２N分枝無節点ハフマン木での圧縮符号長の上限長Ｎを１ビット刻みで調節することができる。したがって、文字情報の総種類数に適したサイズで２N分枝無節点ハフマン木を生成することができ、省メモリ化を図ることができる。
【０４３８】
具体的には、文字情報の総種類数が２K-1個より大きく２K個以下である場合は、上限長ＮをＫビットに決定することで、上述の補正Ａで示したように、上限長Ｋ以上の圧縮符号長の葉数は上限長Ｋの圧縮符号長の葉数に集約される。したがって、２K分枝無節点ハフマン木が生成されるため、上限符号長を（Ｋ＋１）以上とした場合の無節点ハフマン木よりもサイズを小さくすることができる。
【０４３９】
たとえば、文字情報の総種類数が２10個より大きく２11個以下である場合は、上限長Ｎを１１ビットに決定することで、２11分枝無節点ハフマン木を生成することができる。また、文字情報の総種類数が２11個より大きく２12個以下である場合は、上限長Ｎを１２ビットに決定することで、２12分枝無節点ハフマン木を生成することができる。さらに、文字情報の総種類数が２12個より大きく２13個以下である場合は、上限長Ｎを１３ビットに決定することで、２13分枝無節点ハフマン木を生成することができる。
【０４４０】
また、補正Ａでの生起確率総和がしきい値ｔ以上１以下であれば、十分な圧縮効率を見込める。したがって、補正Ａでの各圧縮符号長の葉数で２N分枝無節点ハフマン木を生成することで、生成速度の高速化を図ることができる。
【０４４１】
また、補正Ａでの生起確率総和がしきい値ｔ以上１以下でなければ、補正Ｂを実行することで、圧縮効率の向上を図ることができる。たとえば、しきい値ｔ未満であれば、補正+処理を実行することで、生起確率総和を１に漸近させることができ、圧縮効率の向上を最大限までおこなうことができる。同様に、１より大きい場合でも、補正-処理を実行することで、生起確率総和を１に漸近させることができ、圧縮効率の向上を最大限までおこなうことができる。
【０４４２】
また、圧縮符号長間で葉数のシフトをおこなうことでも、生起確率総和を１に近似させることが可能となる。いずれにしても、生起確率総和が１に近似するように各圧縮符号長の葉数を最適な葉数とすることで、圧縮効率の向上を図ることができる。
【０４４３】
上述した実施の形態では、２文字の「婚活」を検索文字列としたが、検索文字列は２文字のほか、３文字以上の場合も同じ処理によって検索結果を得ることができる。
【０４４４】
なお、本実施の形態で説明した方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本プログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本プログラムは、インターネット等のネットワークを介して配布してもよい。
【０４４５】
上述した実施の形態に関し、さらに以下の付記を開示する。
【０４４６】
（付記１）対象ファイルに出現する文字情報群内の各文字および２以上の文字からなる単語の生起確率に応じた圧縮符号長の圧縮符号を葉とする最大枝数２Nの２N分枝無節点ハフマン木と、前記文字情報群の文字情報および前記単語の集合内の単語ごとに前記２N分枝無節点ハフマン木の対応する葉を関連付けたデータベースと、前記対象ファイルを前記２N分枝無節点ハフマン木で圧縮した圧縮ファイルと、を記憶する記憶装置にアクセス可能なコンピュータに、
２個以上の文字からなる検索文字列の入力を受け付ける入力工程と、
前記入力工程によって入力された検索文字列を前記データベースから検索する第１の検索工程と、
前記第１の検索工程によって検索されなかった場合、前記検索文字列の先頭文字を末尾文字とする先行単語と、前記検索文字列の末尾文字を先頭文字とする後続単語と、を前記データベースの単語の集合から検索する第２の検索工程と、
前記第２の検索工程によって前記先行単語および前記後続単語が検索された場合、前記２N分枝無節点ハフマン木のうち前記先行単語の圧縮符号を前記先行単語に関連付けされた葉から抽出するとともに、前記２N分枝無節点ハフマン木のうち前記後続単語の圧縮符号を前記後続単語に関連付けされた葉から抽出する抽出工程と、
前記先行単語の圧縮符号と前記後続単語の圧縮符号とを連結させた連結圧縮符号と、前記先行単語および前記後続単語からなりかつ前記先行単語の末尾文字と前記後続単語の先頭文字とを特徴付ける情報を埋め込んだ置換文字列と、を関連付けて記憶するテーブルを作成する作成工程と、
前記圧縮ファイル内の圧縮符号列が前記作成工程によって作成されたテーブル内の連結圧縮符号と一致するか否かを判定する判定工程と、
前記判定工程によって一致すると判定された場合、前記連結圧縮符号に関連付けられた前記置換文字列を伸長先に書き出す伸長工程と、
を実行させることを特徴とする検索プログラム。
【０４４７】
（付記２）前記抽出工程は、
さらに、前記検索文字列を構成する文字に関連付けられた葉から圧縮符号を抽出し、
前記作成工程は、
さらに、前記検索文字列を構成する文字について前記抽出工程によって抽出された圧縮符号と、前記検索文字列を構成する文字を特徴付ける情報を埋め込んだ前記検索文字列を構成する文字情報の置換文字と、を関連付けて、前記テーブルに格納し、
前記判定工程は、
前記圧縮ファイル内の圧縮符号列が前記作成工程によって作成されたテーブル内の前記検索文字列を構成する文字の圧縮符号と一致するか否かを判定し、
前記伸長工程は、
前記判定工程によって前記検索文字列を構成する文字の圧縮符号と一致すると判定された場合、前記検索文字列を構成する文字の圧縮符号に関連付けられた前記置換文字を前記伸長先に書き出すことを特徴とする付記１に記載の検索プログラム。
【０４４８】
（付記３）前記抽出工程は、
前記第１の検索工程によって前記検索文字列が前記データベースから検索された場合、前記検索文字列に一致する単語に関連付けられた葉から圧縮符号を抽出し、
前記作成工程は、
前記検索文字列に一致する単語について前記抽出工程によって抽出された圧縮符号と、前記検索文字列に一致する単語を特徴付ける情報を埋め込んだ前記検索文字列に一致する単語の置換文字列と、を関連付けて、前記テーブルに格納し、
前記判定工程は、
前記圧縮ファイル内の圧縮符号列が前記作成工程によって作成されたテーブル内の前記検索文字列に一致する単語の圧縮符号と一致するか否かを判定し、
前記伸長工程は、
前記判定工程によって前記検索文字列に一致する単語の圧縮符号と一致すると判定された場合、前記検索文字列に一致する単語の圧縮符号に関連付けられた前記置換文字列を前記伸長先に書き出すことを特徴とする付記１に記載の検索プログラム。
【０４４９】
（付記４）前記伸長工程は、
前記圧縮ファイル内の前記判定工程によって前記連結圧縮符号と不一致な圧縮符号については、当該不一致な圧縮符号を有する葉に関連付けされた文字を前記データベースから抽出して、前記伸長先に書き出すことを特徴とする付記１〜３のいずれか一つに記載の検索プログラム。
【０４５０】
（付記５）前記対象ファイルに出現する前記文字および前記単語を含む文字情報群内の各文字情報の出現率に応じた生起確率で規定される圧縮符号長ごとに、前記文字情報の種類数を集計する集計工程と、
前記対象ファイルに出現する前記文字情報の総種類数に基づいて、最小圧縮符号長から最大圧縮符号長までの圧縮符号長群の中から、前記文字情報に割り当てられる圧縮符号長の上限長Ｎを決定する決定工程と、
前記集計工程によって集計された圧縮符号長ごとの前記文字情報の種類数のうち、前記決定工程によって決定された上限長Ｎを圧縮符号長とする前記文字情報の種類数を、前記上限長Ｎ以上の圧縮符号長での前記文字情報の種類数の総和に補正する補正工程と、
前記補正工程によって補正された補正後の前記圧縮符号長ごとの前記文字情報の種類数に基づいて、前記上限長Ｎを最大枝数とし、前記文字情報の各々の生起確率に応じた圧縮符号長の圧縮符号を葉とする２N分枝無節点ハフマン木を構築し、前記文字情報群の文字情報および前記単語の集合内の単語ごとに前記２N分枝無節点ハフマン木の葉を関連付けることで、前記データベースを構築して、前記２N分枝無節点ハフマン木および前記データベースを前記記憶装置に格納する構築工程と、
前記対象ファイルを前記２N分枝無節点ハフマン木で圧縮することにより、前記圧縮ファイルを前記記憶装置に格納する圧縮工程と、
を前記コンピュータに実行させることを特徴とする付記１〜４のいずれか一つに記載の検索プログラム。
【０４５１】
（付記６）前記決定工程は、
前記文字情報の総種類数が２K-1個より大きく２K個以下である場合は、前記上限長ＮをＫビットに決定することを特徴とする付記５に記載の検索プログラム。
【０４５２】
（付記７）前記決定工程は、
前記文字情報の総種類数が２10個より大きく２11個以下である場合は、前記上限長Ｎを１１ビットに決定することを特徴とする付記６に記載の検索プログラム。
【０４５３】
（付記８）前記決定工程は、
前記文字情報の総種類数が２11個より大きく２12個以下である場合は、前記上限長Ｎを１２ビットに決定することを特徴とする付記６に記載の検索プログラム。
【０４５４】
（付記９）前記決定工程は、
前記文字情報の総種類数が２12個より大きく２13個以下である場合は、前記上限長Ｎを１３ビットに決定することを特徴とする付記６に記載の検索プログラム。
【０４５５】
（付記１０）前記補正工程による補正後の前記上限長Ｎまでの各圧縮符号長での前記文字情報の種類数に基づいて、前記上限長Ｎまでの各圧縮符号長を規定する各生起確率の総和を算出する算出工程と、
前記算出工程によって算出された総和がしきい値以上１以下であるか否かを判断する判断工程と、
前記判断工程によって前記しきい値以上１以下であると判断された場合、前記上限長Ｎまでの圧縮符号長と、前記上限長Ｎまでの圧縮符号長ごとの前記文字情報の種類数と、前記文字情報の出現率と、に基づいて、前記文字情報に圧縮符号を割り当てた葉の構造体を生成する生成工程と、
前記上限長Ｎまでの圧縮符号長に基づいて、前記生成工程によって生成された葉の構造体１つ当たりの枝数を、前記上限長Ｎまでの圧縮符号長ごとに特定する特定工程と、を前記コンピュータに実行させ、
前記構築工程は、
前記葉の構造体内の圧縮符号に前記特定工程によって特定された枝数分の枝番号をあらわす各ビット列を連結した葉へのポインタ群を、葉の構造体ごとに生成することにより、前記各葉の構造体についての前記葉へのポインタ群を根とする２N分枝無節点ハフマン木を構築することを特徴とする付記５〜９のいずれか一つに記載の検索プログラム。
【０４５６】
（付記１１）前記判断工程によって前記しきい値以上１以下でないと判断された場合、前記上限長Ｎまでの各圧縮符号長の前記文字情報の種類数を、前記総和で割ることにより、前記上限長Ｎまでの各圧縮符号長の前記文字情報の種類数を更新する更新工程を前記コンピュータに実行させ、
前記算出工程は、
前記更新工程による更新後における前記上限長Ｎまでの各圧縮符号長の前記文字情報の種類数に基づいて、前記総和を再算出し、
前記判断工程は、
前記算出工程によって再算出された総和が１以下の最大値であるか否かを判断し、
前記生成工程は、
前記判断工程によって前記再算出された総和が前記最大値であると判断された場合、前記上限長Ｎまでの圧縮符号長と、前記上限長Ｎまでの圧縮符号長ごとの更新後における前記文字情報の種類数と、前記文字情報の出現率と、に基づいて、前記文字情報に圧縮符号を割り当てた葉の構造体を生成することを特徴とする付記１０に記載の検索プログラム。
【０４５７】
（付記１２）前記判断工程によって前記しきい値以上１以下でないと判断された場合、前記上限長Ｎまでの各圧縮符号長のうち第１の圧縮符号長の前記文字情報の種類数を所定数減少させ、当該第１の圧縮符号長よりも大きい第２の圧縮符号長の前記文字情報の種類数を前記所定数増加させることにより、前記上限長Ｎまでの各圧縮符号長の前記文字情報の種類数を更新する更新工程を前記コンピュータに実行させ、
前記算出工程は、
前記更新工程による更新後における前記上限長Ｎまでの各圧縮符号長の前記文字情報の種類数に基づいて、前記総和を再算出し、
前記判断工程は、
前記算出工程によって再算出された総和が１以下の最大値であるか否かを判断し、
前記生成工程は、
前記判断工程によって前記再算出された総和が１以下の最大値であると判断された場合、前記上限長Ｎまでの圧縮符号長と、前記上限長Ｎまでの圧縮符号長ごとの更新後における前記文字情報の種類数と、前記文字情報の出現率と、に基づいて、前記文字情報に圧縮符号を割り当てた葉の構造体を生成することを特徴とする付記１０に記載の検索プログラム。
【０４５８】
（付記１３）前記再算出された総和が１以下の最大値となるまで、前記更新工程による更新、前記算出工程による更新後における前記上限長Ｎまでの各圧縮符号長の前記文字情報の種類数に基づく前記総和の再算出、および、前記判断工程による再算出された総和が１以下の最大値であるか否かの判断を、前記コンピュータに繰り返し実行させることを特徴とする付記１１または１２に記載の検索プログラム。
【０４５９】
（付記１４）対象ファイルに出現する文字情報群内の各文字および２以上の文字からなる単語の生起確率に応じた圧縮符号長の圧縮符号を葉とする最大枝数２Nの２N分枝無節点ハフマン木と、前記文字情報群の文字情報および前記単語の集合内の単語ごとに前記２N分枝無節点ハフマン木の対応する葉を関連付けたデータベースと、前記対象ファイルを前記２N分枝無節点ハフマン木で圧縮した圧縮ファイルと、を記憶する記憶装置にアクセス可能な検索装置であって、
２個以上の文字からなる検索文字列の入力を受け付ける入力手段と、
前記入力手段によって入力された検索文字列を前記データベースから検索する第１の検索手段と、
前記第１の検索手段によって検索されなかった場合、前記検索文字列の先頭文字を末尾文字とする先行単語と、前記検索文字列の末尾文字を先頭文字とする後続単語と、を前記データベースの単語の集合から検索する第２の検索手段と、
前記第２の検索手段によって前記先行単語および前記後続単語が検索された場合、前記２N分枝無節点ハフマン木のうち前記先行単語の圧縮符号を前記先行単語に関連付けされた葉から抽出するとともに、前記２N分枝無節点ハフマン木のうち前記後続単語の圧縮符号を前記後続単語に関連付けされた葉から抽出する抽出手段と、
前記先行単語の圧縮符号と前記後続単語の圧縮符号とを連結させた連結圧縮符号と、前記先行単語および前記後続単語からなりかつ前記先行単語の末尾文字と前記後続単語の先頭文字とを特徴付ける情報を埋め込んだ置換文字列と、を関連付けて記憶するテーブルを作成する作成手段と、
前記圧縮ファイル内の圧縮符号列が前記作成手段によって作成されたテーブル内の連結圧縮符号と一致するか否かを判定する判定手段と、
前記判定手段によって一致すると判定された場合、前記連結圧縮符号に関連付けられた前記置換文字列を伸長先に書き出す伸長手段と、
を備えることを特徴とする検索装置。
【０４６０】
（付記１５）対象ファイルに出現する文字情報群内の各文字および２以上の文字からなる単語の生起確率に応じた圧縮符号長の圧縮符号を葉とする最大枝数２Nの２N分枝無節点ハフマン木と、前記文字情報群の文字情報および前記単語の集合内の単語ごとに前記２N分枝無節点ハフマン木の対応する葉を関連付けたデータベースと、前記対象ファイルを前記２N分枝無節点ハフマン木で圧縮した圧縮ファイルと、を記憶する記憶装置にアクセス可能なコンピュータが、
２個以上の文字からなる検索文字列の入力を受け付ける入力工程と、
前記入力工程によって入力された検索文字列を前記データベースから検索する第１の検索工程と、
前記第１の検索工程によって検索されなかった場合、前記検索文字列の先頭文字を末尾文字とする先行単語と、前記検索文字列の末尾文字を先頭文字とする後続単語と、を前記データベースの単語の集合から検索する第２の検索工程と、
前記第２の検索工程によって前記先行単語および前記後続単語が検索された場合、前記２N分枝無節点ハフマン木のうち前記先行単語の圧縮符号を前記先行単語に関連付けされた葉から抽出するとともに、前記２N分枝無節点ハフマン木のうち前記後続単語の圧縮符号を前記後続単語に関連付けされた葉から抽出する抽出工程と、
前記先行単語の圧縮符号と前記後続単語の圧縮符号とを連結させた連結圧縮符号と、前記先行単語および前記後続単語からなりかつ前記先行単語の末尾文字と前記後続単語の先頭文字とを特徴付ける情報を埋め込んだ置換文字列と、を関連付けて記憶するテーブルを作成する作成工程と、
前記圧縮ファイル内の圧縮符号列が前記作成工程によって作成されたテーブル内の連結圧縮符号と一致するか否かを判定する判定工程と、
前記判定工程によって一致すると判定された場合、前記連結圧縮符号に関連付けられた前記置換文字列を伸長先に書き出す伸長工程と、
を実行することを特徴とする検索方法。
【符号の説明】
【０４６１】
７２００  入力部
７２０１  第１の検索部
７２０２  第２の検索部
７２０３  抽出部
７２０４  作成部
７２０５  判定部
７２０６  伸長部
Ｔ  照合／置換テーブル
【国際調査報告】
2012117544.tif 000087
2012117544.tif 000088
2012117544.tif 000089
2012117544.tif 000090