(57)【要約】  文字情報群の総種類数Ｘが、どの範囲にあるかで、適用される２N分枝無節点ハフマン木のサイズが決定される。２N分枝無節点ハフマン木のサイズとは、最大枝数２Nである。べき数Ｎは、圧縮符号長の上限となる。したがって、２N分枝無節点ハフマン木のサイズを決定する場合は、べき数Ｎを文字情報群の総種類数Ｘに応じて決定すればよい。具体的には、文字情報群の総種類数Ｘが２x-2＜Ｘ≦２x-1である場合、少なくとも最大枝数２Nが２x-1本あればハフマン木が構築できる。サイズを最小限にするには、Ｎ＝ｘ−１とすればよい。また、文字情報群の総種類数Ｘが２x-1＜Ｘ≦２xである場合、少なくとも最大枝数２Nが２x本あればハフマン木が構築できる。サイズを最小限にするには、Ｎ＝ｘとすればよい。
2012111078.tif 000002
【特許請求の範囲】
【請求項１】
対象ファイルに出現する文字情報群内の各文字情報の出現率に応じた生起確率で規定される圧縮符号長ごとに、前記文字情報の種類数を集計する集計工程と、
前記対象ファイルに出現する前記文字情報の総種類数に基づいて、最小圧縮符号長から最大圧縮符号長までの圧縮符号長群の中から、前記文字情報に割り当てられる圧縮符号長の上限長Ｎを決定する決定工程と、
前記集計工程によって集計された圧縮符号長ごとの前記文字情報の種類数のうち、前記決定工程によって決定された上限長Ｎを圧縮符号長とする前記文字情報の種類数を、前記上限長Ｎ以上の圧縮符号長での前記文字情報の種類数の総和に補正する補正工程と、
前記補正工程によって補正された補正後の前記圧縮符号長ごとの前記文字情報の種類数に基づいて、前記上限長Ｎを最大枝数とし、前記文字情報の各々の生起確率に応じた圧縮符号長の圧縮符号を葉とする２N分枝無節点ハフマン木を構築する構築工程と、
をコンピュータに実行させることを特徴とする生成プログラム。
【請求項２】
前記決定工程は、
前記文字情報の総種類数が２K-1個より大きく２K個以下である場合は、前記上限長ＮをＫビットに決定することを特徴とする請求項１に記載の生成プログラム。
【請求項３】
前記決定工程は、
前記文字情報の総種類数が２10個より大きく２11個以下である場合は、前記上限長Ｎを１１ビットに決定することを特徴とする請求項２に記載の生成プログラム。
【請求項４】
前記決定工程は、
前記文字情報の総種類数が２11個より大きく２12個以下である場合は、前記上限長Ｎを１２ビットに決定することを特徴とする請求項２に記載の生成プログラム。
【請求項５】
前記決定工程は、
前記文字情報の総種類数が２12個より大きく２13個以下である場合は、前記上限長Ｎを１３ビットに決定することを特徴とする請求項２に記載の生成プログラム。
【請求項６】
前記補正工程による補正後の前記上限長Ｎまでの各圧縮符号長での前記文字情報の種類数に基づいて、前記上限長Ｎまでの各圧縮符号長を規定する各生起確率の総和を算出する算出工程と、
前記算出工程によって算出された総和がしきい値以上１以下であるか否かを判断する判断工程と、
前記判断工程によって前記しきい値以上１以下であると判断された場合、前記上限長Ｎまでの圧縮符号長と、前記上限長Ｎまでの圧縮符号長ごとの前記文字情報の種類数と、前記文字情報の出現率と、に基づいて、前記文字情報に圧縮符号を割り当てた葉の構造体を生成する生成工程と、
前記上限長Ｎまでの圧縮符号長に基づいて、前記生成工程によって生成された葉の構造体１つ当たりの枝数を、前記上限長Ｎまでの圧縮符号長ごとに特定する特定工程と、を前記コンピュータに実行させ、
前記構築工程は、
前記葉の構造体内の圧縮符号に前記特定工程によって特定された枝数分の枝番号をあらわす各ビット列を連結した葉へのポインタ群を、葉の構造体ごとに生成することにより、前記各葉の構造体についての前記葉へのポインタ群を根とする２N分枝無節点ハフマン木を構築することを特徴とする請求項１〜５のいずれか一つに記載の生成プログラム。
【請求項７】
前記判断工程によって前記しきい値以上１以下でないと判断された場合、前記上限長Ｎまでの各圧縮符号長の前記文字情報の種類数を、前記総和で割ることにより、前記上限長Ｎまでの各圧縮符号長の前記文字情報の種類数を更新する更新工程を前記コンピュータに実行させ、
前記算出工程は、
前記更新工程による更新後における前記上限長Ｎまでの各圧縮符号長の前記文字情報の種類数に基づいて、前記総和を再算出し、
前記判断工程は、
前記算出工程によって再算出された総和が１以下の最大値であるか否かを判断し、
前記生成工程は、
前記判断工程によって前記再算出された総和が前記最大値であると判断された場合、前記上限長Ｎまでの圧縮符号長と、前記上限長Ｎまでの圧縮符号長ごとの更新後における前記文字情報の種類数と、前記文字情報の出現率と、に基づいて、前記文字情報に圧縮符号を割り当てた葉の構造体を生成することを特徴とする請求項６に記載の生成プログラム。
【請求項８】
前記判断工程によって前記しきい値以上１以下でないと判断された場合、前記上限長Ｎまでの各圧縮符号長のうち第１の圧縮符号長の前記文字情報の種類数を所定数減少させ、当該第１の圧縮符号長よりも大きい第２の圧縮符号長の前記文字情報の種類数を前記所定数増加させることにより、前記上限長Ｎまでの各圧縮符号長の前記文字情報の種類数を更新する更新工程を前記コンピュータに実行させ、
前記算出工程は、
前記更新工程による更新後における前記上限長Ｎまでの各圧縮符号長の前記文字情報の種類数に基づいて、前記総和を再算出し、
前記判断工程は、
前記算出工程によって再算出された総和が１以下の最大値であるか否かを判断し、
前記生成工程は、
前記判断工程によって前記再算出された総和が１以下の最大値であると判断された場合、前記上限長Ｎまでの圧縮符号長と、前記上限長Ｎまでの圧縮符号長ごとの更新後における前記文字情報の種類数と、前記文字情報の出現率と、に基づいて、前記文字情報に圧縮符号を割り当てた葉の構造体を生成することを特徴とする請求項６に記載の生成プログラム。
【請求項９】
前記再算出された総和が１以下の最大値となるまで、前記更新工程による更新、前記算出工程による更新後における前記上限長Ｎまでの各圧縮符号長の前記文字情報の種類数に基づく前記総和の再算出、および、前記判断工程による再算出された総和が１以下の最大値であるか否かの判断を、前記コンピュータに繰り返し実行させることを特徴とする請求項７または８に記載の生成プログラム。
【請求項１０】
対象ファイルに出現する文字情報群内の各文字情報の出現率に応じた生起確率で規定される圧縮符号長ごとに、前記文字情報の種類数を集計する集計手段と、
前記対象ファイルに出現する前記文字情報の総種類数に基づいて、最小圧縮符号長から最大圧縮符号長までの圧縮符号長群の中から、前記文字情報に割り当てられる圧縮符号長の上限長Ｎを決定する決定手段と、
前記集計手段によって集計された圧縮符号長ごとの前記文字情報の種類数のうち、前記決定手段によって決定された上限長Ｎを圧縮符号長とする前記文字情報の種類数を、前記上限長Ｎ以上の圧縮符号長での前記文字情報の種類数の総和に補正する補正手段と、
前記補正手段によって補正された補正後の前記圧縮符号長ごとの前記文字情報の種類数に基づいて、前記上限長Ｎを最大枝数とし、前記文字情報の各々の生起確率に応じた圧縮符号長の圧縮符号を葉とする２N分枝無節点ハフマン木を構築する構築手段と、
を備えることを特徴とする生成装置。
【請求項１１】
対象ファイルを記憶する記憶装置を有するコンピュータが、
集計手段により、前記対象ファイルに出現する文字情報群内の各文字情報の出現率に応じた生起確率で規定される圧縮符号長ごとに、前記文字情報の種類数を集計する集計工程と、
決定手段により、前記対象ファイルに出現する前記文字情報の総種類数に基づいて、最小圧縮符号長から最大圧縮符号長までの圧縮符号長群の中から、前記文字情報に割り当てられる圧縮符号長の上限長Ｎを決定する決定工程と、
補正手段により、前記集計工程によって集計された圧縮符号長ごとの前記文字情報の種類数のうち、前記決定工程によって決定された上限長Ｎを圧縮符号長とする前記文字情報の種類数を、前記上限長Ｎ以上の圧縮符号長での前記文字情報の種類数の総和に補正する補正工程と、
構築手段により、前記補正工程によって補正された補正後の前記圧縮符号長ごとの前記文字情報の種類数に基づいて、前記上限長Ｎを最大枝数とし、前記文字情報の各々の生起確率に応じた圧縮符号長の圧縮符号を葉とする２N分枝無節点ハフマン木を構築する構築工程と、
を実行することを特徴とする生成方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ハフマン木を生成する生成プログラム、生成装置、および生成方法に関する。
【背景技術】
【０００２】
従来、４，８、および１６分枝ハフマン木の生成元となる節点集合体から展開することにより、圧縮符号長が２，３，４の整数倍で規定された２N分枝無節点ハフマン木が生成されている（たとえば、下記特許文献１を参照。）。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０１０−０９３４１４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかしながら、２N分枝無節点ハフマン木では、圧縮符号長が２，３，４の整数倍でしか規定できなかったため、必然的に最大枝数２Nのべき数Ｎが２，３，４の整数倍でしか規定できなかった。このため、最大枝数２Nは４（＝２2）、８（＝２3）、１６（＝２4）、６４（＝２6）、２５６（＝２8）、５１２（＝２9）、１０２４（＝２10）、４０９６（＝２12）、１６３８４（＝２14）となる。このため、最大枝数２Nとして、２０４８（＝２11）や８１９２（＝２13）といった２，３，４の整数倍以外は規定できない。【０００５】
一方、テキストデータを構成する、単一文字、基礎単語、および予約語（以下、文字情報と呼ぶ）の種類数が２m個（ただし、ｍは２，３，４の整数倍）より大きく２m+1個（ただし、ｍ＋１は２，３，４の整数倍ではない）以下である場合、最大枝数２NをＮ≧ｍ＋２としなければならない。たとえば、文字情報の種類数が２10個より大きく２11個以下である場合、最大枝数２Nを２12としなければならない。また、文字情報の種類数が２12個より大きく２13個以下である場合、最大枝数２Nを２14としなければならない。このため、２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）個生成される。具体的には、葉へのポインタの先頭７ビットが圧縮符号で後続４ビットが１６種のビット列となる。したがって、圧縮符号長が７ビットの圧縮符号の各々について、１６種の葉へのポインタが生成されることとなる。
【００５８】
以下同様、図９において、圧縮符号長が８ビットの圧縮符号の各々について、８種の葉へのポインタが生成されることとなる。図１０において、圧縮符号長が９ビットの圧縮符号の各々について、４種の葉へのポインタが生成されることとなる。図１１において、したがって、圧縮符号長が１０ビットの圧縮符号の各々について、２種の葉へのポインタが生成されることとなる。図１２において、圧縮符号長が１１ビットの圧縮符号の各々について、１種の葉へのポインタが生成されることとなる。
【００５９】
＜（７）２N分枝無節点ハフマン木の構築の詳細（Ｎ＝１１）＞
図１３は、図２の（７）２N分枝無節点ハフマン木の構築の詳細（Ｎ＝１１）を示す説明図である。図１３では、Ｎ＝１１とした場合の２０４８（＝２11）分枝無節点ハフマン木を示している。根の構造体には、葉へのポインタが格納されている。葉へのポインタはポイント先の葉の構造体を指定することができる。
【００６０】
具体的には、圧縮符号長が６ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図７に示したように３２個生成される。したがって、葉Ｌ１の構造体については、根の構造体に３２個の葉Ｌ１へのポインタＬ１Ｐ（１）〜Ｌ１Ｐ（３２）が格納される。葉Ｌ２の構造体〜葉Ｌ６の構造体についても同様である。
【００６１】
また、圧縮符号長が７ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図８に示したように１６個生成される。したがって、葉Ｌ７の構造体については、根の構造体に１６個の葉Ｌ７へのポインタＬ７Ｐ（１）〜Ｌ７Ｐ（１６）が格納される。葉Ｌ８の構造体〜葉Ｌ２４の構造体についても同様である。
【００６２】
また、圧縮符号長が８ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図９に示したように８個生成される。したがって、葉Ｌ２５の構造体については、根の構造体に８個の葉Ｌ２５へのポインタＬ２５Ｐ（１）〜Ｌ２５Ｐ（８）が格納される。葉Ｌ２６の構造体〜葉Ｌ４６の構造体についても同様である。
【００６３】
また、圧縮符号長が９ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図１０に示したように４個生成される。したがって、葉Ｌ４７の構造体については、根の構造体に４個の葉Ｌ４７へのポインタＬ４７Ｐ（１）〜Ｌ４７Ｐ（４）が格納される。葉Ｌ４８の構造体〜葉Ｌ６９の構造体についても同様である。
【００６４】
また、圧縮符号長が１０ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図１１に示したように２個生成される。したがって、葉Ｌ７０の構造体については、根の構造体に２個の葉Ｌ７０へのポインタＬ７０Ｐ（１）〜Ｌ７０Ｐ（２）が格納される。葉Ｌ７１の構造体〜葉Ｌ８９の構造体についても同様である。
【００６５】
また、圧縮符号長が１１ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図１２に示したように１個生成される。したがって、葉Ｌ９０の構造体については、根の構造体に１個の葉Ｌ９０へのポインタＬ９０Ｐが格納される。葉Ｌ９１の構造体〜葉Ｌ１３０５の構造体についても同様である。
【００６６】
＜（３）葉数特定〜（５）葉の構造体生成の詳細（Ｎ＝１２）＞
図１４は、図２の（３）葉数特定〜（５）葉の構造体生成の詳細（Ｎ＝１２）を示す説明図である。なお、Ｎ＝１２の場合は、図３の文字情報テーブルには、たとえば１０２４種の基礎単語のレコードも追加されることとなる。基礎単語は、１３０５種の文字コード、分割文字コード、予約語よりも、出現回数が低いこととする。したがって、１３０５種に１０２４種を追加した２３２９種の文字情報についての文字情報テーブルが生成されているものとする。また、基礎単語の追加により、図４の総回数がかわるため、２３２９種の文字情報の生起確率も図４に示した値とは異なることとなる。
【００６７】
そして、生成装置は、図５の場合と同様に、生起確率総和を求める。そして、生成装置は、生起確率総和がしきい値ｔ以上１以下であるか否かを判断する。しきい値ｔ未満であれば、補正Ｂに移行する。しきい値ｔ以上１以下である場合は、補正Ｂに移行せず、この時点での圧縮符号長ごとの葉数で確定する。
【００６８】
図１４の例では、補正Ａでの生起確率総和「０．８２３」はしきい値ｔ未満であるとして、補正Ｂ-をおこなうこととする。
【００６９】
まず、補正Ｂ+の１回目（補正Ｂ+１）では、圧縮符号長ごとの補正Ａの葉数を、前回の補正（この場合は補正Ａ）の生起確率総和（０．８２３）で割ることで、葉数を更新する。なお、小数点以下は切り捨てでも、四捨五入でもよい。なお、補正Ａでの圧縮符号長の上限長Ｎ（Ｎ＝１２ビット）については、前回の補正（この場合は補正Ａ）の生起確率総和（０．８２３）で割ることはせず、葉の総数（２３２９個）から、補正Ｂ+１での圧縮符号長ごとの葉の総数（圧縮符号長の上限長Ｎの葉数除く）を引くことで、圧縮符号長の上限長Ｎの葉数を求める。この場合は、２１９２個である。
【００７０】
このあと、生成装置は、補正Ａの場合と同様の計算処理により、補正Ｂ+１での生起確率総和を求める。そして、生成装置は、補正Ｂ+１での生起確率総和が１以下の最大漸近値に収束したか否かを判断する。補正Ｂ+１での生起確率総和が１以下の最大漸近値に収束していなければ、補正Ｂ+の２回目（補正Ｂ+２）に移行する。１以下の最大漸近値に収束した場合は、補正Ｂ+２に移行せず、この時点での圧縮符号長ごとの葉数で確定する。補正Ｂ+１で更新された生起確率総和「０．８６１」は１以下であるが、最大漸近値に収束しているかが不明であるため、補正Ｂ+２に移行する。
【００７１】
補正Ｂ+２では、圧縮符号長ごとの補正Ｂ+１での葉数を、前回の補正（この場合は補正Ｂ+１）の生起確率総和（０．８６１）で割ることで、葉数を更新する。なお、小数点以下は切り捨てでも、四捨五入でもよい。なお、補正Ｂ+２での圧縮符号長の上限長Ｎ（Ｎ＝１２ビット）については、前回の補正（この場合は補正Ｂ+１）の生起確率総和（０．８６１）で割ることはせず、葉の総数（２３２９個）から、補正Ｂ+２での圧縮符号長ごとの葉の総数（圧縮符号長の上限長Ｎの葉数除く）を引くことで、圧縮符号長の上限長Ｎの葉数を求める。この場合は、２１７３個である。
【００７２】
このあと、生成装置は、補正Ｂ+１の場合と同様の計算処理により、補正Ｂ+２での生起確率総和を求める。そして、生成装置は、補正Ｂ+２での生起確率総和が１以下の最大漸近値に収束したか否かを判断する。補正Ｂ+２での生起確率総和が１以下の最大漸近値に収束していなければ、補正Ｂ+の３回目（補正Ｂ+３）に移行する。１以下の最大漸近値に収束した場合は、補正Ｂ+３に移行せず、この時点での圧縮符号長ごとの葉数で確定する。補正Ｂ+２で更新された生起確率総和「０．８９７」は１以下であるが、補正Ｂ+１で更新された生起確率総和「０．８６１」よりも大きい。すなわち、補正Ｂ-１での生起確率総和は最大漸近値ではなく、補正Ｂ+２での生起確率総和は最大漸近値に収束しているかが不明であるため、補正Ｂ+３に移行する。
【００７３】
このようにして、葉数が確定するまで補正Ｂ+を継続することとなる。図１４の例では、補正Ｂ+１０で更新された生起確率総和「０．９８４」は、補正Ｂ+１１で更新された生起確率総和「０．９８４」と同じ値である。すなわち、補正Ｂ+１０での各圧縮符号長の葉数と補正Ｂ+１１での各圧縮符号長の葉数とは同じである。この場合、生成装置は、補正Ｂ+１０において、生起確率総和が最大漸近値に収束したと判断し、葉数が確定する。
【００７４】
このあと、生成装置は、圧縮符号長ごとに、葉当たりの枝数を算出することとなる。葉当たりの枝数の算出は、上述したように、圧縮符号長の上限長Ｎ（この場合はＮ＝１２ビット）から降順に、２0、２1、２2、２3、２4、２5、２6として葉当たりの枝数を割り当てることとなる。なお、枝数の小計は、圧縮符号長ごとに、葉当たりの枝数に確定した葉数を乗じた乗算結果である。
【００７５】
＜（６）葉へのポインタ生成の詳細（Ｎ＝１２）＞
図１５〜図２１は、葉へのポインタ生成の詳細（Ｎ＝１２）を示す説明図である。図１５〜図２１は、圧縮符号長の上限Ｎが１２ビットの場合の葉へのポインタを示している。図１５において、圧縮符号長が６ビットの葉数は２個であるため、圧縮符号「００００００」，「０００００１」が割り当てられる。また、圧縮符号長が６ビットの葉当たりの枝数は、６４本である。したがって、圧縮符号長が６ビットの圧縮符号についての葉へのポインタは、６４（＝２6）個生成される。具体的には、葉へのポインタの先頭６ビットが圧縮符号で後続６ビットが６４種のビット列となる。したがって、圧縮符号長が６ビットの圧縮符号の各々について、６４種の葉へのポインタが生成されることとなる。
【００７６】
図１６において、圧縮符号長が７ビットの葉数は１２個であるため、圧縮符号「００００１００」〜「０００１１１１」が割り当てられる。また、圧縮符号長が７ビットの葉当たりの枝数は、３２本である。したがって、圧縮符号長が７ビットの圧縮符号についての葉へのポインタは、３２（＝２5）個生成される。具体的には、葉へのポインタの先頭７ビットが圧縮符号で後続５ビットが３２種のビット列となる。したがって、圧縮符号長が６ビットの圧縮符号の各々について、３２種の葉へのポインタが生成されることとなる。
【００７７】
以下同様、図１７において、圧縮符号長が８ビットの圧縮符号の各々について、１６種の葉へのポインタが生成されることとなる。図１８において、圧縮符号長が９ビットの圧縮符号の各々について、８種の葉へのポインタが生成されることとなる。図１９において、圧縮符号長が１０ビットの圧縮符号の各々について、４種の葉へのポインタが生成されることとなる。図２０において、圧縮符号長が１１ビットの圧縮符号の各々について、２種の葉へのポインタが生成されることとなる。図２１において、圧縮符号長が１２ビットの圧縮符号の各々について、１種の葉へのポインタが生成されることとなる。
【００７８】
＜（７）２N分枝無節点ハフマン木の構築の詳細（Ｎ＝１２）＞
図２２は、（７）２N分枝無節点ハフマン木の構築の詳細（Ｎ＝１２）を示す説明図である。図２２では、Ｎ＝１２とした場合の４０９６（＝２12）分枝無節点ハフマン木を示している。根の構造体には、葉へのポインタが格納されている。葉へのポインタはポイント先の葉の構造体を指定することができる。
【００７９】
具体的には、圧縮符号長が６ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図１５に示したように６４個生成される。したがって、葉Ｌ１の構造体については、根の構造体に６４個の葉Ｌ１へのポインタＬ１Ｐ（１）〜Ｌ１Ｐ（６４）が格納される。葉Ｌ２の構造体についても同様である。
【００８０】
また、圧縮符号長が７ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図１６に示したように３２個生成される。したがって、葉Ｌ３の構造体については、根の構造体に３２個の葉Ｌ３へのポインタＬ３Ｐ（１）〜Ｌ３Ｐ（３２）が格納される。葉Ｌ４の構造体〜葉Ｌ１４の構造体についても同様である。
【００８１】
また、圧縮符号長が８ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図１７に示したように１６個生成される。したがって、葉Ｌ１５の構造体については、根の構造体に１６個の葉Ｌ１５へのポインタＬ１５Ｐ（１）〜Ｌ１５Ｐ（１６）が格納される。葉Ｌ１６の構造体〜葉Ｌ５５の構造体についても同様である。
【００８２】
また、圧縮符号長が９ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図１８に示したように８個生成される。したがって、葉Ｌ５６の構造体については、根の構造体に８個の葉Ｌ５６へのポインタＬ５６Ｐ（１）〜Ｌ５６Ｐ（８）が格納される。葉Ｌ５７の構造体〜葉Ｌ１０７の構造体についても同様である。
【００８３】
また、圧縮符号長が１０ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図１９に示したように４個生成される。したがって、葉Ｌ１０８の構造体については、根の構造体に４個の葉Ｌ１０８へのポインタＬ１０８Ｐ（１）〜Ｌ１０８Ｐ（４）が格納される。葉Ｌ１０９の構造体〜葉Ｌ１６５の構造体についても同様である。
【００８４】
また、圧縮符号長が１１ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図２０に示したように２個生成される。したがって、葉Ｌ１６６の構造体については、根の構造体に２個の葉Ｌ１６６へのポインタＬ１６６Ｐ（１）〜Ｌ１６６Ｐ（２）が格納される。葉Ｌ１６７の構造体〜葉Ｌ２１３の構造体についても同様である。
【００８５】
また、圧縮符号長が１２ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図２１に示したように１個生成される。したがって、葉Ｌ２１４の構造体については、根の構造体に１個の葉Ｌ２１４へのポインタＬ２１４Ｐが格納される。葉Ｌ２１５の構造体〜葉Ｌ２３２９の構造体についても同様である。
【００８６】
＜（３）葉数特定〜（５）葉の構造体生成の詳細（Ｎ＝１３）＞
図２３は、図１の（３）葉数特定〜（５）葉の構造体生成の詳細（Ｎ＝１３）を示す説明図である。なお、Ｎ＝１３の場合は、図３の文字情報テーブルには、たとえば４０９６種の基礎単語のレコードも追加されることとなる。基礎単語は、１３０５種の文字コード、分割文字コード、予約語よりも、出現回数が低いこととする。したがって、１３０５種に４０９６種を追加した５４０１種の文字情報についての文字情報テーブルが生成されているものとする。また、基礎単語の追加により、図４の総回数がかわるため、５４０１種の文字情報の生起確率も図４に示した値とは異なることとなる。図２３に示した例では、補正Ａでの生起確率総和が「０．８７７」であるため、補正Ｂ+が行われることとなる。
【００８７】
＜（６）葉へのポインタ生成の詳細（Ｎ＝１３）＞
図２４〜図３１は、葉へのポインタ生成の詳細（Ｎ＝１３）を示す説明図である。図２４〜図３１は、圧縮符号長の上限ＮがＮ＝１３ビットの場合の葉へのポインタを示している。図２４において、圧縮符号長が６ビットの葉数は２個であるため、圧縮符号「００００００」，「０００００１」が割り当てられる。また、圧縮符号長が６ビットの葉当たりの枝数は、１２８本である。したがって、圧縮符号長が６ビットの圧縮符号についての葉へのポインタは、１２８（＝２7）個生成される。具体的には、葉へのポインタの先頭６ビットが圧縮符号で後続７ビットが１２８種のビット列となる。したがって、圧縮符号長が６ビットの圧縮符号の各々について、１２８種の葉へのポインタが生成されることとなる。
【００８８】
図２５において、圧縮符号長が７ビットの葉数は１１個であるため、圧縮符号「００００１００」〜「０００１１１０」が割り当てられる。また、圧縮符号長が７ビットの葉当たりの枝数は、６４本である。したがって、圧縮符号長が７ビットの圧縮符号についての葉へのポインタは、６４（＝２6）個生成される。具体的には、葉へのポインタの先頭７ビットが圧縮符号で後続６ビットが６４種のビット列となる。したがって、圧縮符号長が７ビットの圧縮符号の各々について、６４種の葉へのポインタが生成されることとなる。
【００８９】
以下同様、図２６において、圧縮符号長が８ビットの圧縮符号の各々について、３２種の葉へのポインタが生成されることとなる。図２７において、圧縮符号長が９ビットの圧縮符号の各々について、１６種の葉へのポインタが生成されることとなる。図２８において、圧縮符号長が１０ビットの圧縮符号の各々について、８種の葉へのポインタが生成されることとなる。図２９において、圧縮符号長が１１ビットの圧縮符号の各々について、４種の葉へのポインタが生成されることとなる。図３０において、圧縮符号長が１２ビットの圧縮符号の各々について、２種の葉へのポインタが生成されることとなる。図３１において、圧縮符号長が１３ビットの圧縮符号の各々について、１種の葉へのポインタが生成されることとなる。
【００９０】
＜（７）２N分枝無節点ハフマン木の構築の詳細（Ｎ＝１３）＞
図３２は、図２の（７）２N分枝無節点ハフマン木の構築の詳細（Ｎ＝１３）を示す説明図である。図３２では、Ｎ＝１３とした場合の８１９２（＝２13）分枝無節点ハフマン木を示している。根の構造体には、葉へのポインタが格納されている。葉へのポインタはポイント先の葉の構造体を指定することができる。
【００９１】
具体的には、圧縮符号長が６ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図２４に示したように１２８個生成される。したがって、葉Ｌ１の構造体については、根の構造体に１２８個の葉Ｌ１へのポインタＬ１Ｐ（１）〜Ｌ１Ｐ（１２８）が格納される。葉Ｌ２の構造体についても同様である。
【００９２】
また、圧縮符号長が７ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図２５に示したように６４個生成される。したがって、葉Ｌ３の構造体については、根の構造体に６４個の葉Ｌ３へのポインタＬ３Ｐ（１）〜Ｌ３Ｐ（６４）が格納される。葉Ｌ４の構造体〜葉Ｌ１３の構造体についても同様である。
【００９３】
また、圧縮符号長が８ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図２６に示したように３２個生成される。したがって、葉Ｌ１４の構造体については、根の構造体に３２個の葉Ｌ１４へのポインタＬ１４Ｐ（１）〜Ｌ１４Ｐ（３２）が格納される。葉Ｌ１５の構造体〜葉Ｌ４０の構造体についても同様である。
【００９４】
また、圧縮符号長が９ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図２７に示したように１６個生成される。したがって、葉Ｌ４１の構造体については、根の構造体に１６個の葉Ｌ４１へのポインタＬ４１Ｐ（１）〜Ｌ４１Ｐ（１６）が格納される。葉Ｌ４２の構造体〜葉Ｌ７５の構造体についても同様である。
【００９５】
また、圧縮符号長が１０ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図２８に示したように８個生成される。したがって、葉Ｌ７６の構造体については、根の構造体に８個の葉Ｌ７６へのポインタＬ７６Ｐ（１）〜Ｌ７６Ｐ（８）が格納される。葉Ｌ７７の構造体〜葉Ｌ１１１の構造体についても同様である。
【００９６】
また、圧縮符号長が１１ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図２９に示したように４個生成される。したがって、葉Ｌ１１２の構造体については、根の構造体に４個の葉Ｌ１１２へのポインタＬ１１２Ｐ（１）〜Ｌ１１２Ｐ（４）が格納される。葉Ｌ１１３の構造体〜葉Ｌ１４２の構造体についても同様である。
【００９７】
また、圧縮符号長が１２ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図３０に示したように２個生成される。したがって、葉Ｌ１４３の構造体については、根の構造体に２個の葉Ｌ１４３へのポインタＬ１４３Ｐ（１）〜Ｌ１４３Ｐ（２）が格納される。葉Ｌ１４４の構造体〜葉Ｌ２４８の構造体についても同様である。
【００９８】
また、圧縮符号長が１３ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図３１に示したように１個生成される。したがって、葉Ｌ２４９の構造体については、根の構造体に１個の葉Ｌ２４９へのポインタＬ２４９Ｐが格納される。葉Ｌ２５０の構造体〜葉Ｌ５４０１の構造体についても同様である。
【００９９】
＜葉の構造体＞
図３３は、葉の構造体を示す説明図である。葉の構造体は、第１領域〜第４領域を有するデータ構造体である。葉の構造体は、第１領域には、圧縮符号およびその圧縮符号長が格納される。第２領域には、葉の標識と伸長種別（図３参照）が格納される。第３領域には、伸長種別に応じて高位１６ビット文字コード、低位の分割８ビット文字コード、または特殊単語へのポインタが格納される。
【０１００】
第４領域には、符号種別と符号区分が格納される。符号種別とは、文字コードが数字、英字、特殊記号、カタカナ、ひらがな、漢字のいずれに該当するか、または特殊単語へのポインタであるかを識別する情報である。符号区分とは、文字コードが１６ビットであるか８ビットであるかを識別する情報である。１６ビットの文字コードである場合または予約語である場合、符号区分として“１”を割り当て、８ビットの分割文字コードの場合、符号区分として“０”を割り当てる。
【０１０１】
＜文字コードの構造体＞
図３４は、高位文字コードの構造体を示す説明図である。高位文字コードの構造体３４００は、高位文字コードｅ♯とその葉Ｌ♯へのポインタを格納するデータ構造体である。具体的には、たとえば、生成装置は、葉の構造体から伸長種別や符号区分を参照して文字コードｅ♯を抽出し、抽出した文字コードｅ♯をポイントする葉Ｌ♯のポインタを根の構造体から抽出する。葉Ｌ♯へのポインタが複数ある場合は、いずれのポインタでもよい。これにより、高位文字コードの構造体３４００が生成される。
【０１０２】
図３５は、分割文字コードの構造体を示す説明図である。分割文字コードの構造体３５００は、分割文字コードとその葉Ｌ♯へのポインタを格納する。具体的には、たとえば、生成装置は、葉の構造体から伸長種別や符号区分を参照して分割文字コードを抽出し、抽出した分割文字コードをポイントする葉Ｌ＃のポインタを根の構造体から抽出する。葉Ｌ＃へのポインタが複数ある場合は、いずれのポインタでもよい。これにより、分割文字コードの構造体３５００が生成される。
【０１０３】
図３６および図３７は、特殊単語の構造体を示す説明図である。図３６では、特殊単語が予約語のみであり、図３７では、特殊単語は予約語および基礎単語である。特殊単語の構造体３６００は、特殊単語とその葉Ｌ♯へのポインタを格納するデータ構造体である。具体的には、たとえば、生成装置は、葉の構造体から伸長種別や符号区分を参照して特殊単語を抽出し、抽出した特殊単語をポイントする葉Ｌ♯のポインタを根の構造体から抽出する。葉Ｌ♯へのポインタが複数ある場合は、いずれのポインタでもよい。これにより、特殊単語の構造体３６００が生成される。
【０１０４】
＜生成装置のハードウェア構成＞
図３８は、実施の形態にかかる生成装置のハードウェア構成例を示すブロック図である。図３８において、生成装置は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）３８０１と、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）３８０２と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）３８０３と、磁気ディスクドライブ３８０４と、磁気ディスク３８０５と、光ディスクドライブ３８０６と、光ディスク３８０７と、ディスプレイ３８０８と、Ｉ／Ｆ（Ｉｎｔｅｒｆａｃｅ）３８０９と、キーボード３８１０と、マウス３８１１と、スキャナ３８１２と、プリンタ３８１３と、を備えている。また、各構成部はバス３８００によってそれぞれ接続されている。
【０１０５】
ここで、ＣＰＵ３８０１は、生成装置の全体の制御を司る。ＲＯＭ３８０２は、ブートプログラムなどのプログラムを記憶している。ＲＡＭ３８０３は、ＣＰＵ３８０１のワークエリアとして使用される。磁気ディスクドライブ３８０４は、ＣＰＵ３８０１の制御にしたがって磁気ディスク３８０５に対するデータのリード／ライトを制御する。磁気ディスク３８０５は、磁気ディスクドライブ３８０４の制御で書き込まれたデータを記憶する。
【０１０６】
光ディスクドライブ３８０６は、ＣＰＵ３８０１の制御にしたがって光ディスク３８０７に対するデータのリード／ライトを制御する。光ディスク３８０７は、光ディスクドライブ３８０６の制御で書き込まれたデータを記憶したり、光ディスク３８０７に記憶されたデータをコンピュータに読み取らせたりする。
【０１０７】
ディスプレイ３８０８は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。このディスプレイ３８０８は、たとえば、ＣＲＴ、ＴＦＴ液晶ディスプレイ、プラズマディスプレイなどを採用することができる。
【０１０８】
インターフェース（以下、「Ｉ／Ｆ」と略する。）３８０９は、通信回線を通じてＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどのネットワーク３８１４に接続され、このネットワーク３８１４を介して他の装置に接続される。そして、Ｉ／Ｆ３８０９は、ネットワーク３８１４と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。Ｉ／Ｆ３８０９には、たとえばモデムやＬＡＮアダプタなどを採用することができる。
【０１０９】
キーボード３８１０は、文字、数字、各種指示などの入力のためのキーを備え、データの入力をおこなう。また、タッチパネル式の入力パッドやテンキーなどであってもよい。マウス３８１１は、カーソルの移動や範囲選択、あるいはウィンドウの移動やサイズの変更などをおこなう。ポインティングデバイスとして同様に機能を備えるものであれば、トラックボールやジョイスティックなどであってもよい。
【０１１０】
スキャナ３８１２は、画像を光学的に読み取り、生成装置内に画像データを取り込む。なお、スキャナ３８１２は、ＯＣＲ（Ｏｐｔｉｃａｌ  Ｃｈａｒａｃｔｅｒ  Ｒｅａｄｅｒ）機能を持たせてもよい。また、プリンタ３８１３は、画像データや文書データを印刷する。プリンタ３８１３には、たとえば、レーザプリンタやインクジェットプリンタを採用することができる。
【０１１１】
なお、本実施の形態にかかる生成プログラムや、上述した２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分枝無節点ハフマン木を構築する。具体的には、たとえば、Ｎ＝１１の場合は、図１３に示したように、２12分枝無節点ハフマン木を構築する。Ｎ＝１２の場合は、図２２に示したように、２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分枝無節点ハフマン木を用いた伸長処理手順を示すフローチャート（その２）である。ステップＳ７９０８のあと、図８０において、コンピュータは、シフト後のレジスタから末尾Ｎビットを対象ビット列として抽出する（ステップＳ８００１）。つぎに、コンピュータは、２N分枝無節点ハフマン木の根の構造体から葉Ｌ♯へのポインタを特定し（ステップＳ８００２）、ポイント先となる葉Ｌ♯の構造体に１パスでアクセスする（ステップＳ８００３）。そして、コンピュータは、アクセス先の葉Ｌ♯の構造体から文字情報を抽出し（ステップＳ８００４）、抽出された文字情報を伸長バッファ６９００に書き込む（ステップＳ８００５）。
【０３１３】
また、コンピュータは、葉Ｌ♯の構造体から圧縮符号長ｌｅｇを抽出し（ステップＳ８００６）、ビットアドレスａｂｉを更新する（ステップＳ８００７）。このあと、コンピュータは、メモリに圧縮符号列があるか否か、具体的には、マスクパターンによるマスク処理が施されていない圧縮符号列があるか否かを判断する（ステップＳ８００８）。たとえば、バイトオフセットｂｙｏｓに該当するバイト位置があるか否かにより判断する。圧縮符号列がある場合（ステップＳ８００８：Ｙｅｓ）、図７９のステップＳ７９０２に戻る。一方、圧縮符号列がない場合（ステップＳ８００８：Ｎｏ）、一連の伸長処理を終了する。
【０３１４】
このような伸長処理により、圧縮符号列からＮビット単位で圧縮符号を抽出することができ、さらに、２N分枝無節点ハフマン木の根の構造体にアクセスすることで、該当する枝番号となる葉Ｌ♯へのポインタを特定することができる。そして、アクセス先となる葉Ｌ♯の構造体から文字コードを抽出することで、圧縮符号を伸長する。このように、２N分枝無節点ハフマン木は、内部節点を有していないため、葉Ｌ♯へのポインタが特定されれば、１パスで葉Ｌ♯の構造体にアクセスすることができ、伸長速度の高速化を図ることができる。
【０３１５】
以上説明したように、本実施の形態によれば、文字情報の総種類数に応じて２N分枝無節点ハフマン木での圧縮符号長の上限長Ｎを１ビット刻みで調節することができる。したがって、文字情報の総種類数に適したサイズで２N分枝無節点ハフマン木を生成することができ、省メモリ化を図ることができる。
【０３１６】
具体的には、文字情報の総種類数が２K-1個より大きく２K個以下である場合は、上限長ＮをＫビットに決定することで、上述の補正Ａで示したように、上限長Ｋ以上の圧縮符号長の葉数は上限長Ｋの圧縮符号長の葉数に集約される。したがって、２K分枝無節点ハフマン木が生成されるため、上限符号長が（Ｋ＋１）以上とした場合の無節点ハフマン木よりもサイズを小さくすることができる。
【０３１７】
たとえば、文字情報の総種類数が２10個より大きく２11個以下である場合は、上限長Ｎを１１ビットに決定することで、２11分枝無節点ハフマン木を生成することができる。また、文字情報の総種類数が２11個より大きく２12個以下である場合は、上限長Ｎを１２ビットに決定することで、２12分枝無節点ハフマン木を生成することができる。さらに、文字情報の総種類数が２12個より大きく２13個以下である場合は、上限長Ｎを１３ビットに決定することで、２13分枝無節点ハフマン木を生成することができる。
【０３１８】
また、補正Ａでの生起確率総和がしきい値ｔ以上１以下であれば、十分な圧縮効率を見込める。したがって、補正Ａでの各圧縮符号長の葉数で２N分枝無節点ハフマン木を生成することで、生成速度の高速化を図ることができる。
【０３１９】
また、補正Ａでの生起確率総和がしきい値ｔ以上１以下でなければ、補正Ｂを実行することで、圧縮効率の向上を図ることができる。たとえば、しきい値ｔ未満であれば、補正+処理を実行することで、生起確率総和を１に漸近させることができ、圧縮効率の向上を最大限までおこなうことができる。同様に、１より大きい場合でも、補正-処理を実行することで、生起確率総和を１に漸近させることができ、圧縮効率の向上を最大限までおこなうことができる。
【０３２０】
また、圧縮符号長間で葉数のシフトをおこなうことでも、生起確率総和を１に近似させることが可能となる。いずれにしても、生起確率総和が１に近似するように各圧縮符号長の葉数を最適な葉数とすることで、圧縮効率の向上を図ることができる。
【０３２１】
なお、本実施の形態で説明した方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本生成プログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本生成プログラムは、インターネット等のネットワークを介して配布してもよい。
【符号の説明】
【０３２２】
３９００  生成装置
３９０１  集計部
３９０２  決定部
３９０３  補正部
３９０４  算出部
３９０５  判断部
３９０６  更新部
３９０７  生成部
３９０８  特定部
３９０９  構築部
【図１】
2012111078.tif 000003
【図２】
2012111078.tif 000004
【図３】
2012111078.tif 000005
【図４】
2012111078.tif 000006
【図５】
2012111078.tif 000007
【図６】
2012111078.tif 000008
【図７】
2012111078.tif 000009
【図８】
2012111078.tif 000010
【図９】
2012111078.tif 000011
【図１０】
2012111078.tif 000012
【図１１】
2012111078.tif 000013
【図１２】
2012111078.tif 000014
【図１３】
2012111078.tif 000015
【図１４】
2012111078.tif 000016
【図１５】
2012111078.tif 000017
【図１６】
2012111078.tif 000018
【図１７】
2012111078.tif 000019
【図１８】
2012111078.tif 000020
【図１９】
2012111078.tif 000021
【図２０】
2012111078.tif 000022
【図２１】
2012111078.tif 000023
【図２２】
2012111078.tif 000024
【図２３】
2012111078.tif 000025
【図２４】
2012111078.tif 000026
【図２５】
2012111078.tif 000027
【図２６】
2012111078.tif 000028
【図２７】
2012111078.tif 000029
【図２８】
2012111078.tif 000030
【図２９】
2012111078.tif 000031
【図３０】
2012111078.tif 000032
【図３１】
2012111078.tif 000033
【図３２】
2012111078.tif 000034
【図３３】
2012111078.tif 000035
【図３４】
2012111078.tif 000036
【図３５】
2012111078.tif 000037
【図３６】
2012111078.tif 000038
【図３７】
2012111078.tif 000039
【図３８】
2012111078.tif 000040
【図３９】
2012111078.tif 000041
【図４０】
2012111078.tif 000042
【図４１】
2012111078.tif 000043
【図４２】
2012111078.tif 000044
【図４３】
2012111078.tif 000045
【図４４】
2012111078.tif 000046
【図４５】
2012111078.tif 000047
【図４６】
2012111078.tif 000048
【図４７】
2012111078.tif 000049
【図４８】
2012111078.tif 000050
【図４９】
2012111078.tif 000051
【図５０】
2012111078.tif 000052
【図５１】
2012111078.tif 000053
【図５２】
2012111078.tif 000054
【図５３】
2012111078.tif 000055
【図５４】
2012111078.tif 000056
【図５５】
2012111078.tif 000057
【図５６】
2012111078.tif 000058
【図５７】
2012111078.tif 000059
【図５８】
2012111078.tif 000060
【図５９】
2012111078.tif 000061
【図６０】
2012111078.tif 000062
【図６１】
2012111078.tif 000063
【図６２】
2012111078.tif 000064
【図６３】
2012111078.tif 000065
【図６４】
2012111078.tif 000066
【図６５】
2012111078.tif 000067
【図６６】
2012111078.tif 000068
【図６７】
2012111078.tif 000069
【図６８】
2012111078.tif 000070
【図６９】
2012111078.tif 000071
【図７０】
2012111078.tif 000072
【図７１】
2012111078.tif 000073
【図７２】
2012111078.tif 000074
【図７３】
2012111078.tif 000075
【図７４】
2012111078.tif 000076
【図７５】
2012111078.tif 000077
【図７６】
2012111078.tif 000078
【図７７】
2012111078.tif 000079
【図７８】
2012111078.tif 000080
【図７９】
2012111078.tif 000081
【図８０】
2012111078.tif 000082
【手続補正書】
【提出日】平成25年9月4日(2013.9.4)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
対象ファイルに出現する文字情報群内の各文字情報の出現率に応じた生起確率で規定される圧縮符号長ごとに、前記文字情報の種類数を集計する集計工程と、
前記対象ファイルに出現する前記文字情報の総種類数に基づいて、最小圧縮符号長から最大圧縮符号長までの圧縮符号長群の中から、前記文字情報に割り当てられる圧縮符号長の上限長Ｎを決定する決定工程と、
前記集計工程によって集計された圧縮符号長ごとの前記文字情報の種類数のうち、前記決定工程によって決定された上限長Ｎを圧縮符号長とする前記文字情報の種類数を、前記上限長Ｎ以上の圧縮符号長での前記文字情報の種類数の総和に補正する補正工程と、
前記補正工程によって補正された補正後の前記圧縮符号長ごとの前記文字情報の種類数に基づいて、前記上限長Ｎを最大枝数とし、前記文字情報の各々の生起確率に応じた圧縮符号長の圧縮符号を葉とする２N分枝無節点ハフマン木を構築する構築工程と、
をコンピュータに実行させることを特徴とする生成プログラム。
【請求項２】
前記決定工程は、
前記文字情報の総種類数が２K-1個より大きく２K個以下である場合は、前記上限長ＮをＫビットに決定することを特徴とする請求項１に記載の生成プログラム。
【請求項３】
前記決定工程は、
前記文字情報の総種類数が２10個より大きく２11個以下である場合は、前記上限長Ｎを１１ビットに決定することを特徴とする請求項２に記載の生成プログラム。
【請求項４】
前記決定工程は、
前記文字情報の総種類数が２11個より大きく２12個以下である場合は、前記上限長Ｎを１２ビットに決定することを特徴とする請求項２に記載の生成プログラム。
【請求項５】
前記決定工程は、
前記文字情報の総種類数が２12個より大きく２13個以下である場合は、前記上限長Ｎを１３ビットに決定することを特徴とする請求項２に記載の生成プログラム。
【請求項６】
前記補正工程による補正後の前記上限長Ｎまでの各圧縮符号長での前記文字情報の種類数に基づいて、前記上限長Ｎまでの各圧縮符号長を規定する各生起確率の総和を算出する算出工程と、
前記算出工程によって算出された総和がしきい値以上１以下であるか否かを判断する判断工程と、
前記判断工程によって前記しきい値以上１以下であると判断された場合、前記上限長Ｎまでの圧縮符号長と、前記上限長Ｎまでの圧縮符号長ごとの前記文字情報の種類数と、前記文字情報の出現率と、に基づいて、前記文字情報に圧縮符号を割り当てた葉の構造体を生成する生成工程と、
前記上限長Ｎまでの圧縮符号長に基づいて、前記生成工程によって生成された葉の構造体１つ当たりの枝数を、前記上限長Ｎまでの圧縮符号長ごとに特定する特定工程と、を前記コンピュータに実行させ、
前記構築工程は、
前記葉の構造体内の圧縮符号に前記特定工程によって特定された枝数分の枝番号をあらわす各ビット列を連結した葉へのポインタ群を、葉の構造体ごとに生成することにより、前記各葉の構造体についての前記葉へのポインタ群を根とする２N分枝無節点ハフマン木を構築することを特徴とする請求項１〜５のいずれか一つに記載の生成プログラム。
【請求項７】
前記判断工程によって前記しきい値以上１以下でないと判断された場合、前記上限長Ｎまでの各圧縮符号長の前記文字情報の種類数を、前記総和で割ることにより、前記上限長Ｎまでの各圧縮符号長の前記文字情報の種類数を更新する更新工程を前記コンピュータに実行させ、
前記算出工程は、
前記更新工程による更新後における前記上限長Ｎまでの各圧縮符号長の前記文字情報の種類数に基づいて、前記総和を再算出し、
前記判断工程は、
前記算出工程によって再算出された総和が１以下の最大値であるか否かを判断し、
前記生成工程は、
前記判断工程によって前記再算出された総和が前記最大値であると判断された場合、前記上限長Ｎまでの圧縮符号長と、前記上限長Ｎまでの圧縮符号長ごとの更新後における前記文字情報の種類数と、前記文字情報の出現率と、に基づいて、前記文字情報に圧縮符号を割り当てた葉の構造体を生成することを特徴とする請求項６に記載の生成プログラム。
【請求項８】
前記判断工程によって前記しきい値以上１以下でないと判断された場合、前記上限長Ｎまでの各圧縮符号長のうち第１の圧縮符号長の前記文字情報の種類数を所定数減少させ、当該第１の圧縮符号長よりも大きい第２の圧縮符号長の前記文字情報の種類数を前記所定数増加させることにより、前記上限長Ｎまでの各圧縮符号長の前記文字情報の種類数を更新する更新工程を前記コンピュータに実行させ、
前記算出工程は、
前記更新工程による更新後における前記上限長Ｎまでの各圧縮符号長の前記文字情報の種類数に基づいて、前記総和を再算出し、
前記判断工程は、
前記算出工程によって再算出された総和が１以下の最大値であるか否かを判断し、
前記生成工程は、
前記判断工程によって前記再算出された総和が１以下の最大値であると判断された場合、前記上限長Ｎまでの圧縮符号長と、前記上限長Ｎまでの圧縮符号長ごとの更新後における前記文字情報の種類数と、前記文字情報の出現率と、に基づいて、前記文字情報に圧縮符号を割り当てた葉の構造体を生成することを特徴とする請求項６に記載の生成プログラム。
【請求項９】
対象ファイルに出現する文字情報群内の各文字情報の出現率に応じた生起確率で規定される圧縮符号長ごとに、前記文字情報の種類数を集計する集計手段と、
前記対象ファイルに出現する前記文字情報の総種類数に基づいて、最小圧縮符号長から最大圧縮符号長までの圧縮符号長群の中から、前記文字情報に割り当てられる圧縮符号長の上限長Ｎを決定する決定手段と、
前記集計手段によって集計された圧縮符号長ごとの前記文字情報の種類数のうち、前記決定手段によって決定された上限長Ｎを圧縮符号長とする前記文字情報の種類数を、前記上限長Ｎ以上の圧縮符号長での前記文字情報の種類数の総和に補正する補正手段と、
前記補正手段によって補正された補正後の前記圧縮符号長ごとの前記文字情報の種類数に基づいて、前記上限長Ｎを最大枝数とし、前記文字情報の各々の生起確率に応じた圧縮符号長の圧縮符号を葉とする２N分枝無節点ハフマン木を構築する構築手段と、
を備えることを特徴とする生成装置。
【請求項１０】
対象ファイルを記憶する記憶装置を有するコンピュータが、
集計手段により、前記対象ファイルに出現する文字情報群内の各文字情報の出現率に応じた生起確率で規定される圧縮符号長ごとに、前記文字情報の種類数を集計する集計工程と、
決定手段により、前記対象ファイルに出現する前記文字情報の総種類数に基づいて、最小圧縮符号長から最大圧縮符号長までの圧縮符号長群の中から、前記文字情報に割り当てられる圧縮符号長の上限長Ｎを決定する決定工程と、
補正手段により、前記集計工程によって集計された圧縮符号長ごとの前記文字情報の種類数のうち、前記決定工程によって決定された上限長Ｎを圧縮符号長とする前記文字情報の種類数を、前記上限長Ｎ以上の圧縮符号長での前記文字情報の種類数の総和に補正する補正工程と、
構築手段により、前記補正工程によって補正された補正後の前記圧縮符号長ごとの前記文字情報の種類数に基づいて、前記上限長Ｎを最大枝数とし、前記文字情報の各々の生起確率に応じた圧縮符号長の圧縮符号を葉とする２N分枝無節点ハフマン木を構築する構築工程と、
を実行することを特徴とする生成方法。
【手続補正２】
【補正対象書類名】明細書
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ハフマン木を生成する生成プログラム、生成装置、および生成方法に関する。
【背景技術】
【０００２】
従来、４，８、および１６分枝ハフマン木の生成元となる節点集合体から展開することにより、圧縮符号長が２，３，４の整数倍で規定された２N分枝無節点ハフマン木が生成されている（たとえば、下記特許文献１を参照。）。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０１０−０９３４１４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかしながら、２N分枝無節点ハフマン木では、圧縮符号長が２，３，４の整数倍でしか規定できなかったため、必然的に最大枝数２Nのべき数Ｎが２，３，４の整数倍でしか規定できなかった。このため、最大枝数２Nは４（＝２2）、８（＝２3）、１６（＝２4）、６４（＝２6）、２５６（＝２8）、５１２（＝２9）、１０２４（＝２10）、４０９６（＝２12）、１６３８４（＝２14）となる。このため、最大枝数２Nとして、２０４８（＝２11）や８１９２（＝２13）といった２，３，４の整数倍以外は規定できない。
【０００５】
一方、テキストデータを構成する、単一文字、基礎単語、および予約語（以下、文字情報と呼ぶ）の種類数が２m個（ただし、ｍは２，３，４の整数倍）より大きく２m+1個（ただし、ｍ＋１は２，３，４の整数倍ではない）以下である場合、最大枝数２NをＮ≧ｍ＋２としなければならない。たとえば、文字情報の種類数が２10個より大きく２11個以下である場合、最大枝数２Nを２12としなければならない。また、文字情報の種類数が２12個より大きく２13個以下である場合、最大枝数２Nを２14としなければならない。このため、２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）個生成される。具体的には、葉へのポインタの先頭７ビットが圧縮符号で後続４ビットが１６種のビット列となる。したがって、圧縮符号長が７ビットの圧縮符号の各々について、１６種の葉へのポインタが生成されることとなる。
【００５８】
以下同様、図９において、圧縮符号長が８ビットの圧縮符号の各々について、８種の葉へのポインタが生成されることとなる。図１０において、圧縮符号長が９ビットの圧縮符号の各々について、４種の葉へのポインタが生成されることとなる。図１１において、したがって、圧縮符号長が１０ビットの圧縮符号の各々について、２種の葉へのポインタが生成されることとなる。図１２において、圧縮符号長が１１ビットの圧縮符号の各々について、１種の葉へのポインタが生成されることとなる。
【００５９】
＜（７）２N分枝無節点ハフマン木の構築の詳細（Ｎ＝１１）＞
図１３は、図２の（７）２N分枝無節点ハフマン木の構築の詳細（Ｎ＝１１）を示す説明図である。図１３では、Ｎ＝１１とした場合の２０４８（＝２11）分枝無節点ハフマン木を示している。根の構造体には、葉へのポインタが格納されている。葉へのポインタはポイント先の葉の構造体を指定することができる。
【００６０】
具体的には、圧縮符号長が６ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図７に示したように３２個生成される。したがって、葉Ｌ１の構造体については、根の構造体に３２個の葉Ｌ１へのポインタＬ１Ｐ（１）〜Ｌ１Ｐ（３２）が格納される。葉Ｌ２の構造体〜葉Ｌ６の構造体についても同様である。
【００６１】
また、圧縮符号長が７ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図８に示したように１６個生成される。したがって、葉Ｌ７の構造体については、根の構造体に１６個の葉Ｌ７へのポインタＬ７Ｐ（１）〜Ｌ７Ｐ（１６）が格納される。葉Ｌ８の構造体〜葉Ｌ２４の構造体についても同様である。
【００６２】
また、圧縮符号長が８ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図９に示したように８個生成される。したがって、葉Ｌ２５の構造体については、根の構造体に８個の葉Ｌ２５へのポインタＬ２５Ｐ（１）〜Ｌ２５Ｐ（８）が格納される。葉Ｌ２６の構造体〜葉Ｌ４６の構造体についても同様である。
【００６３】
また、圧縮符号長が９ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図１０に示したように４個生成される。したがって、葉Ｌ４７の構造体については、根の構造体に４個の葉Ｌ４７へのポインタＬ４７Ｐ（１）〜Ｌ４７Ｐ（４）が格納される。葉Ｌ４８の構造体〜葉Ｌ６９の構造体についても同様である。
【００６４】
また、圧縮符号長が１０ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図１１に示したように２個生成される。したがって、葉Ｌ７０の構造体については、根の構造体に２個の葉Ｌ７０へのポインタＬ７０Ｐ（１）〜Ｌ７０Ｐ（２）が格納される。葉Ｌ７１の構造体〜葉Ｌ８９の構造体についても同様である。
【００６５】
また、圧縮符号長が１１ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図１２に示したように１個生成される。したがって、葉Ｌ９０の構造体については、根の構造体に１個の葉Ｌ９０へのポインタＬ９０Ｐが格納される。葉Ｌ９１の構造体〜葉Ｌ１３０５の構造体についても同様である。
【００６６】
＜（３）葉数特定〜（５）葉の構造体生成の詳細（Ｎ＝１２）＞
図１４は、図２の（３）葉数特定〜（５）葉の構造体生成の詳細（Ｎ＝１２）を示す説明図である。なお、Ｎ＝１２の場合は、図３の文字情報テーブルには、たとえば１０２４種の基礎単語のレコードも追加されることとなる。基礎単語は、１３０５種の文字コード、分割文字コード、予約語よりも、出現回数が低いこととする。したがって、１３０５種に１０２４種を追加した２３２９種の文字情報についての文字情報テーブルが生成されているものとする。また、基礎単語の追加により、図４の総回数がかわるため、２３２９種の文字情報の生起確率も図４に示した値とは異なることとなる。
【００６７】
そして、生成装置は、図５の場合と同様に、生起確率総和を求める。そして、生成装置は、生起確率総和がしきい値ｔ以上１以下であるか否かを判断する。しきい値ｔ未満であれば、補正Ｂに移行する。しきい値ｔ以上１以下である場合は、補正Ｂに移行せず、この時点での圧縮符号長ごとの葉数で確定する。
【００６８】
図１４の例では、補正Ａでの生起確率総和「０．８２３」はしきい値ｔ未満であるとして、補正Ｂ-をおこなうこととする。
【００６９】
まず、補正Ｂ+の１回目（補正Ｂ+１）では、圧縮符号長ごとの補正Ａの葉数を、前回の補正（この場合は補正Ａ）の生起確率総和（０．８２３）で割ることで、葉数を更新する。なお、小数点以下は切り捨てでも、四捨五入でもよい。なお、補正Ａでの圧縮符号長の上限長Ｎ（Ｎ＝１２ビット）については、前回の補正（この場合は補正Ａ）の生起確率総和（０．８２３）で割ることはせず、葉の総数（２３２９個）から、補正Ｂ+１での圧縮符号長ごとの葉の総数（圧縮符号長の上限長Ｎの葉数除く）を引くことで、圧縮符号長の上限長Ｎの葉数を求める。この場合は、２１９２個である。
【００７０】
このあと、生成装置は、補正Ａの場合と同様の計算処理により、補正Ｂ+１での生起確率総和を求める。そして、生成装置は、補正Ｂ+１での生起確率総和が１以下の最大漸近値に収束したか否かを判断する。補正Ｂ+１での生起確率総和が１以下の最大漸近値に収束していなければ、補正Ｂ+の２回目（補正Ｂ+２）に移行する。１以下の最大漸近値に収束した場合は、補正Ｂ+２に移行せず、この時点での圧縮符号長ごとの葉数で確定する。補正Ｂ+１で更新された生起確率総和「０．８６１」は１以下であるが、最大漸近値に収束しているかが不明であるため、補正Ｂ+２に移行する。
【００７１】
補正Ｂ+２では、圧縮符号長ごとの補正Ｂ+１での葉数を、前回の補正（この場合は補正Ｂ+１）の生起確率総和（０．８６１）で割ることで、葉数を更新する。なお、小数点以下は切り捨てでも、四捨五入でもよい。なお、補正Ｂ+２での圧縮符号長の上限長Ｎ（Ｎ＝１２ビット）については、前回の補正（この場合は補正Ｂ+１）の生起確率総和（０．８６１）で割ることはせず、葉の総数（２３２９個）から、補正Ｂ+２での圧縮符号長ごとの葉の総数（圧縮符号長の上限長Ｎの葉数除く）を引くことで、圧縮符号長の上限長Ｎの葉数を求める。この場合は、２１７３個である。
【００７２】
このあと、生成装置は、補正Ｂ+１の場合と同様の計算処理により、補正Ｂ+２での生起確率総和を求める。そして、生成装置は、補正Ｂ+２での生起確率総和が１以下の最大漸近値に収束したか否かを判断する。補正Ｂ+２での生起確率総和が１以下の最大漸近値に収束していなければ、補正Ｂ+の３回目（補正Ｂ+３）に移行する。１以下の最大漸近値に収束した場合は、補正Ｂ+３に移行せず、この時点での圧縮符号長ごとの葉数で確定する。補正Ｂ+２で更新された生起確率総和「０．８９７」は１以下であるが、補正Ｂ+１で更新された生起確率総和「０．８６１」よりも大きい。すなわち、補正Ｂ-１での生起確率総和は最大漸近値ではなく、補正Ｂ+２での生起確率総和は最大漸近値に収束しているかが不明であるため、補正Ｂ+３に移行する。
【００７３】
このようにして、葉数が確定するまで補正Ｂ+を継続することとなる。図１４の例では、補正Ｂ+１０で更新された生起確率総和「０．９８４」は、補正Ｂ+１１で更新された生起確率総和「０．９８４」と同じ値である。すなわち、補正Ｂ+１０での各圧縮符号長の葉数と補正Ｂ+１１での各圧縮符号長の葉数とは同じである。この場合、生成装置は、補正Ｂ+１０において、生起確率総和が最大漸近値に収束したと判断し、葉数が確定する。
【００７４】
このあと、生成装置は、圧縮符号長ごとに、葉当たりの枝数を算出することとなる。葉当たりの枝数の算出は、上述したように、圧縮符号長の上限長Ｎ（この場合はＮ＝１２ビット）から降順に、２0、２1、２2、２3、２4、２5、２6として葉当たりの枝数を割り当てることとなる。なお、枝数の小計は、圧縮符号長ごとに、葉当たりの枝数に確定した葉数を乗じた乗算結果である。
【００７５】
＜（６）葉へのポインタ生成の詳細（Ｎ＝１２）＞
図１５〜図２１は、葉へのポインタ生成の詳細（Ｎ＝１２）を示す説明図である。図１５〜図２１は、圧縮符号長の上限Ｎが１２ビットの場合の葉へのポインタを示している。図１５において、圧縮符号長が６ビットの葉数は２個であるため、圧縮符号「００００００」，「０００００１」が割り当てられる。また、圧縮符号長が６ビットの葉当たりの枝数は、６４本である。したがって、圧縮符号長が６ビットの圧縮符号についての葉へのポインタは、６４（＝２6）個生成される。具体的には、葉へのポインタの先頭６ビットが圧縮符号で後続６ビットが６４種のビット列となる。したがって、圧縮符号長が６ビットの圧縮符号の各々について、６４種の葉へのポインタが生成されることとなる。
【００７６】
図１６において、圧縮符号長が７ビットの葉数は１２個であるため、圧縮符号「００００１００」〜「０００１１１１」が割り当てられる。また、圧縮符号長が７ビットの葉当たりの枝数は、３２本である。したがって、圧縮符号長が７ビットの圧縮符号についての葉へのポインタは、３２（＝２5）個生成される。具体的には、葉へのポインタの先頭７ビットが圧縮符号で後続５ビットが３２種のビット列となる。したがって、圧縮符号長が６ビットの圧縮符号の各々について、３２種の葉へのポインタが生成されることとなる。
【００７７】
以下同様、図１７において、圧縮符号長が８ビットの圧縮符号の各々について、１６種の葉へのポインタが生成されることとなる。図１８において、圧縮符号長が９ビットの圧縮符号の各々について、８種の葉へのポインタが生成されることとなる。図１９において、圧縮符号長が１０ビットの圧縮符号の各々について、４種の葉へのポインタが生成されることとなる。図２０において、圧縮符号長が１１ビットの圧縮符号の各々について、２種の葉へのポインタが生成されることとなる。図２１において、圧縮符号長が１２ビットの圧縮符号の各々について、１種の葉へのポインタが生成されることとなる。
【００７８】
＜（７）２N分枝無節点ハフマン木の構築の詳細（Ｎ＝１２）＞
図２２は、（７）２N分枝無節点ハフマン木の構築の詳細（Ｎ＝１２）を示す説明図である。図２２では、Ｎ＝１２とした場合の４０９６（＝２12）分枝無節点ハフマン木を示している。根の構造体には、葉へのポインタが格納されている。葉へのポインタはポイント先の葉の構造体を指定することができる。
【００７９】
具体的には、圧縮符号長が６ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図１５に示したように６４個生成される。したがって、葉Ｌ１の構造体については、根の構造体に６４個の葉Ｌ１へのポインタＬ１Ｐ（１）〜Ｌ１Ｐ（６４）が格納される。葉Ｌ２の構造体についても同様である。
【００８０】
また、圧縮符号長が７ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図１６に示したように３２個生成される。したがって、葉Ｌ３の構造体については、根の構造体に３２個の葉Ｌ３へのポインタＬ３Ｐ（１）〜Ｌ３Ｐ（３２）が格納される。葉Ｌ４の構造体〜葉Ｌ１４の構造体についても同様である。
【００８１】
また、圧縮符号長が８ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図１７に示したように１６個生成される。したがって、葉Ｌ１５の構造体については、根の構造体に１６個の葉Ｌ１５へのポインタＬ１５Ｐ（１）〜Ｌ１５Ｐ（１６）が格納される。葉Ｌ１６の構造体〜葉Ｌ５５の構造体についても同様である。
【００８２】
また、圧縮符号長が９ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図１８に示したように８個生成される。したがって、葉Ｌ５６の構造体については、根の構造体に８個の葉Ｌ５６へのポインタＬ５６Ｐ（１）〜Ｌ５６Ｐ（８）が格納される。葉Ｌ５７の構造体〜葉Ｌ１０７の構造体についても同様である。
【００８３】
また、圧縮符号長が１０ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図１９に示したように４個生成される。したがって、葉Ｌ１０８の構造体については、根の構造体に４個の葉Ｌ１０８へのポインタＬ１０８Ｐ（１）〜Ｌ１０８Ｐ（４）が格納される。葉Ｌ１０９の構造体〜葉Ｌ１６５の構造体についても同様である。
【００８４】
また、圧縮符号長が１１ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図２０に示したように２個生成される。したがって、葉Ｌ１６６の構造体については、根の構造体に２個の葉Ｌ１６６へのポインタＬ１６６Ｐ（１）〜Ｌ１６６Ｐ（２）が格納される。葉Ｌ１６７の構造体〜葉Ｌ２１３の構造体についても同様である。
【００８５】
また、圧縮符号長が１２ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図２１に示したように１個生成される。したがって、葉Ｌ２１４の構造体については、根の構造体に１個の葉Ｌ２１４へのポインタＬ２１４Ｐが格納される。葉Ｌ２１５の構造体〜葉Ｌ２３２９の構造体についても同様である。
【００８６】
＜（３）葉数特定〜（５）葉の構造体生成の詳細（Ｎ＝１３）＞
図２３は、図１の（３）葉数特定〜（５）葉の構造体生成の詳細（Ｎ＝１３）を示す説明図である。なお、Ｎ＝１３の場合は、図３の文字情報テーブルには、たとえば４０９６種の基礎単語のレコードも追加されることとなる。基礎単語は、１３０５種の文字コード、分割文字コード、予約語よりも、出現回数が低いこととする。したがって、１３０５種に４０９６種を追加した５４０１種の文字情報についての文字情報テーブルが生成されているものとする。また、基礎単語の追加により、図４の総回数がかわるため、５４０１種の文字情報の生起確率も図４に示した値とは異なることとなる。図２３に示した例では、補正Ａでの生起確率総和が「０．８７７」であるため、補正Ｂ+が行われることとなる。
【００８７】
＜（６）葉へのポインタ生成の詳細（Ｎ＝１３）＞
図２４〜図３１は、葉へのポインタ生成の詳細（Ｎ＝１３）を示す説明図である。図２４〜図３１は、圧縮符号長の上限ＮがＮ＝１３ビットの場合の葉へのポインタを示している。図２４において、圧縮符号長が６ビットの葉数は２個であるため、圧縮符号「００００００」，「０００００１」が割り当てられる。また、圧縮符号長が６ビットの葉当たりの枝数は、１２８本である。したがって、圧縮符号長が６ビットの圧縮符号についての葉へのポインタは、１２８（＝２7）個生成される。具体的には、葉へのポインタの先頭６ビットが圧縮符号で後続７ビットが１２８種のビット列となる。したがって、圧縮符号長が６ビットの圧縮符号の各々について、１２８種の葉へのポインタが生成されることとなる。
【００８８】
図２５において、圧縮符号長が７ビットの葉数は１１個であるため、圧縮符号「００００１００」〜「０００１１１０」が割り当てられる。また、圧縮符号長が７ビットの葉当たりの枝数は、６４本である。したがって、圧縮符号長が７ビットの圧縮符号についての葉へのポインタは、６４（＝２6）個生成される。具体的には、葉へのポインタの先頭７ビットが圧縮符号で後続６ビットが６４種のビット列となる。したがって、圧縮符号長が７ビットの圧縮符号の各々について、６４種の葉へのポインタが生成されることとなる。
【００８９】
以下同様、図２６において、圧縮符号長が８ビットの圧縮符号の各々について、３２種の葉へのポインタが生成されることとなる。図２７において、圧縮符号長が９ビットの圧縮符号の各々について、１６種の葉へのポインタが生成されることとなる。図２８において、圧縮符号長が１０ビットの圧縮符号の各々について、８種の葉へのポインタが生成されることとなる。図２９において、圧縮符号長が１１ビットの圧縮符号の各々について、４種の葉へのポインタが生成されることとなる。図３０において、圧縮符号長が１２ビットの圧縮符号の各々について、２種の葉へのポインタが生成されることとなる。図３１において、圧縮符号長が１３ビットの圧縮符号の各々について、１種の葉へのポインタが生成されることとなる。
【００９０】
＜（７）２N分枝無節点ハフマン木の構築の詳細（Ｎ＝１３）＞
図３２は、図２の（７）２N分枝無節点ハフマン木の構築の詳細（Ｎ＝１３）を示す説明図である。図３２では、Ｎ＝１３とした場合の８１９２（＝２13）分枝無節点ハフマン木を示している。根の構造体には、葉へのポインタが格納されている。葉へのポインタはポイント先の葉の構造体を指定することができる。
【００９１】
具体的には、圧縮符号長が６ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図２４に示したように１２８個生成される。したがって、葉Ｌ１の構造体については、根の構造体に１２８個の葉Ｌ１へのポインタＬ１Ｐ（１）〜Ｌ１Ｐ（１２８）が格納される。葉Ｌ２の構造体についても同様である。
【００９２】
また、圧縮符号長が７ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図２５に示したように６４個生成される。したがって、葉Ｌ３の構造体については、根の構造体に６４個の葉Ｌ３へのポインタＬ３Ｐ（１）〜Ｌ３Ｐ（６４）が格納される。葉Ｌ４の構造体〜葉Ｌ１３の構造体についても同様である。
【００９３】
また、圧縮符号長が８ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図２６に示したように３２個生成される。したがって、葉Ｌ１４の構造体については、根の構造体に３２個の葉Ｌ１４へのポインタＬ１４Ｐ（１）〜Ｌ１４Ｐ（３２）が格納される。葉Ｌ１５の構造体〜葉Ｌ４０の構造体についても同様である。
【００９４】
また、圧縮符号長が９ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図２７に示したように１６個生成される。したがって、葉Ｌ４１の構造体については、根の構造体に１６個の葉Ｌ４１へのポインタＬ４１Ｐ（１）〜Ｌ４１Ｐ（１６）が格納される。葉Ｌ４２の構造体〜葉Ｌ７５の構造体についても同様である。
【００９５】
また、圧縮符号長が１０ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図２８に示したように８個生成される。したがって、葉Ｌ７６の構造体については、根の構造体に８個の葉Ｌ７６へのポインタＬ７６Ｐ（１）〜Ｌ７６Ｐ（８）が格納される。葉Ｌ７７の構造体〜葉Ｌ１１１の構造体についても同様である。
【００９６】
また、圧縮符号長が１１ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図２９に示したように４個生成される。したがって、葉Ｌ１１２の構造体については、根の構造体に４個の葉Ｌ１１２へのポインタＬ１１２Ｐ（１）〜Ｌ１１２Ｐ（４）が格納される。葉Ｌ１１３の構造体〜葉Ｌ１４２の構造体についても同様である。
【００９７】
また、圧縮符号長が１２ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図３０に示したように２個生成される。したがって、葉Ｌ１４３の構造体については、根の構造体に２個の葉Ｌ１４３へのポインタＬ１４３Ｐ（１）〜Ｌ１４３Ｐ（２）が格納される。葉Ｌ１４４の構造体〜葉Ｌ２４８の構造体についても同様である。
【００９８】
また、圧縮符号長が１３ビットの圧縮符号が格納される葉の構造体についての葉へのポインタは、図３１に示したように１個生成される。したがって、葉Ｌ２４９の構造体については、根の構造体に１個の葉Ｌ２４９へのポインタＬ２４９Ｐが格納される。葉Ｌ２５０の構造体〜葉Ｌ５４０１の構造体についても同様である。
【００９９】
＜葉の構造体＞
図３３は、葉の構造体を示す説明図である。葉の構造体は、第１領域〜第４領域を有するデータ構造体である。葉の構造体は、第１領域には、圧縮符号およびその圧縮符号長が格納される。第２領域には、葉の標識と伸長種別（図３参照）が格納される。第３領域には、伸長種別に応じて高位１６ビット文字コード、低位の分割８ビット文字コード、または特殊単語へのポインタが格納される。
【０１００】
第４領域には、符号種別と符号区分が格納される。符号種別とは、文字コードが数字、英字、特殊記号、カタカナ、ひらがな、漢字のいずれに該当するか、または特殊単語へのポインタであるかを識別する情報である。符号区分とは、文字コードが１６ビットであるか８ビットであるかを識別する情報である。１６ビットの文字コードである場合または予約語である場合、符号区分として“１”を割り当て、８ビットの分割文字コードの場合、符号区分として“０”を割り当てる。
【０１０１】
＜文字コードの構造体＞
図３４は、高位文字コードの構造体を示す説明図である。高位文字コードの構造体３４００は、高位文字コードｅ♯とその葉Ｌ♯へのポインタを格納するデータ構造体である。具体的には、たとえば、生成装置は、葉の構造体から伸長種別や符号区分を参照して文字コードｅ♯を抽出し、抽出した文字コードｅ♯をポイントする葉Ｌ♯のポインタを根の構造体から抽出する。葉Ｌ♯へのポインタが複数ある場合は、いずれのポインタでもよい。これにより、高位文字コードの構造体３４００が生成される。
【０１０２】
図３５は、分割文字コードの構造体を示す説明図である。分割文字コードの構造体３５００は、分割文字コードとその葉Ｌ♯へのポインタを格納する。具体的には、たとえば、生成装置は、葉の構造体から伸長種別や符号区分を参照して分割文字コードを抽出し、抽出した分割文字コードをポイントする葉Ｌ＃のポインタを根の構造体から抽出する。葉Ｌ＃へのポインタが複数ある場合は、いずれのポインタでもよい。これにより、分割文字コードの構造体３５００が生成される。
【０１０３】
図３６および図３７は、特殊単語の構造体を示す説明図である。図３６では、特殊単語が予約語のみであり、図３７では、特殊単語は予約語および基礎単語である。特殊単語の構造体３６００は、特殊単語とその葉Ｌ♯へのポインタを格納するデータ構造体である。具体的には、たとえば、生成装置は、葉の構造体から伸長種別や符号区分を参照して特殊単語を抽出し、抽出した特殊単語をポイントする葉Ｌ♯のポインタを根の構造体から抽出する。葉Ｌ♯へのポインタが複数ある場合は、いずれのポインタでもよい。これにより、特殊単語の構造体３６００が生成される。
【０１０４】
＜生成装置のハードウェア構成＞
図３８は、実施の形態にかかる生成装置のハードウェア構成例を示すブロック図である。図３８において、生成装置は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）３８０１と、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）３８０２と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）３８０３と、磁気ディスクドライブ３８０４と、磁気ディスク３８０５と、光ディスクドライブ３８０６と、光ディスク３８０７と、ディスプレイ３８０８と、Ｉ／Ｆ（Ｉｎｔｅｒｆａｃｅ）３８０９と、キーボード３８１０と、マウス３８１１と、スキャナ３８１２と、プリンタ３８１３と、を備えている。また、各構成部はバス３８００によってそれぞれ接続されている。
【０１０５】
ここで、ＣＰＵ３８０１は、生成装置の全体の制御を司る。ＲＯＭ３８０２は、ブートプログラムなどのプログラムを記憶している。ＲＡＭ３８０３は、ＣＰＵ３８０１のワークエリアとして使用される。磁気ディスクドライブ３８０４は、ＣＰＵ３８０１の制御にしたがって磁気ディスク３８０５に対するデータのリード／ライトを制御する。磁気ディスク３８０５は、磁気ディスクドライブ３８０４の制御で書き込まれたデータを記憶する。
【０１０６】
光ディスクドライブ３８０６は、ＣＰＵ３８０１の制御にしたがって光ディスク３８０７に対するデータのリード／ライトを制御する。光ディスク３８０７は、光ディスクドライブ３８０６の制御で書き込まれたデータを記憶したり、光ディスク３８０７に記憶されたデータをコンピュータに読み取らせたりする。
【０１０７】
ディスプレイ３８０８は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。このディスプレイ３８０８は、たとえば、ＣＲＴ、ＴＦＴ液晶ディスプレイ、プラズマディスプレイなどを採用することができる。
【０１０８】
インターフェース（以下、「Ｉ／Ｆ」と略する。）３８０９は、通信回線を通じてＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどのネットワーク３８１４に接続され、このネットワーク３８１４を介して他の装置に接続される。そして、Ｉ／Ｆ３８０９は、ネットワーク３８１４と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。Ｉ／Ｆ３８０９には、たとえばモデムやＬＡＮアダプタなどを採用することができる。
【０１０９】
キーボード３８１０は、文字、数字、各種指示などの入力のためのキーを備え、データの入力をおこなう。また、タッチパネル式の入力パッドやテンキーなどであってもよい。マウス３８１１は、カーソルの移動や範囲選択、あるいはウィンドウの移動やサイズの変更などをおこなう。ポインティングデバイスとして同様に機能を備えるものであれば、トラックボールやジョイスティックなどであってもよい。
【０１１０】
スキャナ３８１２は、画像を光学的に読み取り、生成装置内に画像データを取り込む。なお、スキャナ３８１２は、ＯＣＲ（Ｏｐｔｉｃａｌ  Ｃｈａｒａｃｔｅｒ  Ｒｅａｄｅｒ）機能を持たせてもよい。また、プリンタ３８１３は、画像データや文書データを印刷する。プリンタ３８１３には、たとえば、レーザプリンタやインクジェットプリンタを採用することができる。
【０１１１】
なお、本実施の形態にかかる生成プログラムや、上述した２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分枝無節点ハフマン木を構築する。具体的には、たとえば、Ｎ＝１１の場合は、図１３に示したように、２12分枝無節点ハフマン木を構築する。Ｎ＝１２の場合は、図２２に示したように、２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分枝無節点ハフマン木を用いた伸長処理手順を示すフローチャート（その２）である。ステップＳ７９０８のあと、図８０において、コンピュータは、シフト後のレジスタから末尾Ｎビットを対象ビット列として抽出する（ステップＳ８００１）。つぎに、コンピュータは、２N分枝無節点ハフマン木の根の構造体から葉Ｌ♯へのポインタを特定し（ステップＳ８００２）、ポイント先となる葉Ｌ♯の構造体に１パスでアクセスする（ステップＳ８００３）。そして、コンピュータは、アクセス先の葉Ｌ♯の構造体から文字情報を抽出し（ステップＳ８００４）、抽出された文字情報を伸長バッファ６９００に書き込む（ステップＳ８００５）。
【０３１３】
また、コンピュータは、葉Ｌ♯の構造体から圧縮符号長ｌｅｇを抽出し（ステップＳ８００６）、ビットアドレスａｂｉを更新する（ステップＳ８００７）。このあと、コンピュータは、メモリに圧縮符号列があるか否か、具体的には、マスクパターンによるマスク処理が施されていない圧縮符号列があるか否かを判断する（ステップＳ８００８）。たとえば、バイトオフセットｂｙｏｓに該当するバイト位置があるか否かにより判断する。圧縮符号列がある場合（ステップＳ８００８：Ｙｅｓ）、図７９のステップＳ７９０２に戻る。一方、圧縮符号列がない場合（ステップＳ８００８：Ｎｏ）、一連の伸長処理を終了する。
【０３１４】
このような伸長処理により、圧縮符号列からＮビット単位で圧縮符号を抽出することができ、さらに、２N分枝無節点ハフマン木の根の構造体にアクセスすることで、該当する枝番号となる葉Ｌ♯へのポインタを特定することができる。そして、アクセス先となる葉Ｌ♯の構造体から文字コードを抽出することで、圧縮符号を伸長する。このように、２N分枝無節点ハフマン木は、内部節点を有していないため、葉Ｌ♯へのポインタが特定されれば、１パスで葉Ｌ♯の構造体にアクセスすることができ、伸長速度の高速化を図ることができる。
【０３１５】
以上説明したように、本実施の形態によれば、文字情報の総種類数に応じて２N分枝無節点ハフマン木での圧縮符号長の上限長Ｎを１ビット刻みで調節することができる。したがって、文字情報の総種類数に適したサイズで２N分枝無節点ハフマン木を生成することができ、省メモリ化を図ることができる。
【０３１６】
具体的には、文字情報の総種類数が２K-1個より大きく２K個以下である場合は、上限長ＮをＫビットに決定することで、上述の補正Ａで示したように、上限長Ｋ以上の圧縮符号長の葉数は上限長Ｋの圧縮符号長の葉数に集約される。したがって、２K分枝無節点ハフマン木が生成されるため、上限符号長が（Ｋ＋１）以上とした場合の無節点ハフマン木よりもサイズを小さくすることができる。
【０３１７】
たとえば、文字情報の総種類数が２10個より大きく２11個以下である場合は、上限長Ｎを１１ビットに決定することで、２11分枝無節点ハフマン木を生成することができる。また、文字情報の総種類数が２11個より大きく２12個以下である場合は、上限長Ｎを１２ビットに決定することで、２12分枝無節点ハフマン木を生成することができる。さらに、文字情報の総種類数が２12個より大きく２13個以下である場合は、上限長Ｎを１３ビットに決定することで、２13分枝無節点ハフマン木を生成することができる。
【０３１８】
また、補正Ａでの生起確率総和がしきい値ｔ以上１以下であれば、十分な圧縮効率を見込める。したがって、補正Ａでの各圧縮符号長の葉数で２N分枝無節点ハフマン木を生成することで、生成速度の高速化を図ることができる。
【０３１９】
また、補正Ａでの生起確率総和がしきい値ｔ以上１以下でなければ、補正Ｂを実行することで、圧縮効率の向上を図ることができる。たとえば、しきい値ｔ未満であれば、補正+処理を実行することで、生起確率総和を１に漸近させることができ、圧縮効率の向上を最大限までおこなうことができる。同様に、１より大きい場合でも、補正-処理を実行することで、生起確率総和を１に漸近させることができ、圧縮効率の向上を最大限までおこなうことができる。
【０３２０】
また、圧縮符号長間で葉数のシフトをおこなうことでも、生起確率総和を１に近似させることが可能となる。いずれにしても、生起確率総和が１に近似するように各圧縮符号長の葉数を最適な葉数とすることで、圧縮効率の向上を図ることができる。
【０３２１】
なお、本実施の形態で説明した方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本生成プログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本生成プログラムは、インターネット等のネットワークを介して配布してもよい。
【０３２２】
上述した実施の形態に関し、さらに以下の付記を開示する。
【０３２３】
（付記１）対象ファイルに出現する文字情報群内の各文字情報の出現率に応じた生起確率で規定される圧縮符号長ごとに、前記文字情報の種類数を集計する集計工程と、
前記対象ファイルに出現する前記文字情報の総種類数に基づいて、最小圧縮符号長から最大圧縮符号長までの圧縮符号長群の中から、前記文字情報に割り当てられる圧縮符号長の上限長Ｎを決定する決定工程と、
前記集計工程によって集計された圧縮符号長ごとの前記文字情報の種類数のうち、前記決定工程によって決定された上限長Ｎを圧縮符号長とする前記文字情報の種類数を、前記上限長Ｎ以上の圧縮符号長での前記文字情報の種類数の総和に補正する補正工程と、
前記補正工程によって補正された補正後の前記圧縮符号長ごとの前記文字情報の種類数に基づいて、前記上限長Ｎを最大枝数とし、前記文字情報の各々の生起確率に応じた圧縮符号長の圧縮符号を葉とする２N分枝無節点ハフマン木を構築する構築工程と、
をコンピュータに実行させることを特徴とする生成プログラム。
【０３２４】
（付記２）前記決定工程は、
前記文字情報の総種類数が２K-1個より大きく２K個以下である場合は、前記上限長ＮをＫビットに決定することを特徴とする付記１に記載の生成プログラム。
【０３２５】
（付記３）前記決定工程は、
前記文字情報の総種類数が２10個より大きく２11個以下である場合は、前記上限長Ｎを１１ビットに決定することを特徴とする付記２に記載の生成プログラム。
【０３２６】
（付記４）前記決定工程は、
前記文字情報の総種類数が２11個より大きく２12個以下である場合は、前記上限長Ｎを１２ビットに決定することを特徴とする付記２に記載の生成プログラム。
【０３２７】
（付記５）前記決定工程は、
前記文字情報の総種類数が２12個より大きく２13個以下である場合は、前記上限長Ｎを１３ビットに決定することを特徴とする付記２に記載の生成プログラム。
【０３２８】
（付記６）前記補正工程による補正後の前記上限長Ｎまでの各圧縮符号長での前記文字情報の種類数に基づいて、前記上限長Ｎまでの各圧縮符号長を規定する各生起確率の総和を算出する算出工程と、
前記算出工程によって算出された総和がしきい値以上１以下であるか否かを判断する判断工程と、
前記判断工程によって前記しきい値以上１以下であると判断された場合、前記上限長Ｎまでの圧縮符号長と、前記上限長Ｎまでの圧縮符号長ごとの前記文字情報の種類数と、前記文字情報の出現率と、に基づいて、前記文字情報に圧縮符号を割り当てた葉の構造体を生成する生成工程と、
前記上限長Ｎまでの圧縮符号長に基づいて、前記生成工程によって生成された葉の構造体１つ当たりの枝数を、前記上限長Ｎまでの圧縮符号長ごとに特定する特定工程と、を前記コンピュータに実行させ、
前記構築工程は、
前記葉の構造体内の圧縮符号に前記特定工程によって特定された枝数分の枝番号をあらわす各ビット列を連結した葉へのポインタ群を、葉の構造体ごとに生成することにより、前記各葉の構造体についての前記葉へのポインタ群を根とする２N分枝無節点ハフマン木を構築することを特徴とする付記１〜５のいずれか一つに記載の生成プログラム。
【０３２９】
（付記７）前記判断工程によって前記しきい値以上１以下でないと判断された場合、前記上限長Ｎまでの各圧縮符号長の前記文字情報の種類数を、前記総和で割ることにより、前記上限長Ｎまでの各圧縮符号長の前記文字情報の種類数を更新する更新工程を前記コンピュータに実行させ、
前記算出工程は、
前記更新工程による更新後における前記上限長Ｎまでの各圧縮符号長の前記文字情報の種類数に基づいて、前記総和を再算出し、
前記判断工程は、
前記算出工程によって再算出された総和が１以下の最大値であるか否かを判断し、
前記生成工程は、
前記判断工程によって前記再算出された総和が前記最大値であると判断された場合、前記上限長Ｎまでの圧縮符号長と、前記上限長Ｎまでの圧縮符号長ごとの更新後における前記文字情報の種類数と、前記文字情報の出現率と、に基づいて、前記文字情報に圧縮符号を割り当てた葉の構造体を生成することを特徴とする付記６に記載の生成プログラム。
【０３３０】
（付記８）前記判断工程によって前記しきい値以上１以下でないと判断された場合、前記上限長Ｎまでの各圧縮符号長のうち第１の圧縮符号長の前記文字情報の種類数を所定数減少させ、当該第１の圧縮符号長よりも大きい第２の圧縮符号長の前記文字情報の種類数を前記所定数増加させることにより、前記上限長Ｎまでの各圧縮符号長の前記文字情報の種類数を更新する更新工程を前記コンピュータに実行させ、
前記算出工程は、
前記更新工程による更新後における前記上限長Ｎまでの各圧縮符号長の前記文字情報の種類数に基づいて、前記総和を再算出し、
前記判断工程は、
前記算出工程によって再算出された総和が１以下の最大値であるか否かを判断し、
前記生成工程は、
前記判断工程によって前記再算出された総和が１以下の最大値であると判断された場合、前記上限長Ｎまでの圧縮符号長と、前記上限長Ｎまでの圧縮符号長ごとの更新後における前記文字情報の種類数と、前記文字情報の出現率と、に基づいて、前記文字情報に圧縮符号を割り当てた葉の構造体を生成することを特徴とする付記６に記載の生成プログラム。
【０３３１】
（付記９）前記再算出された総和が１以下の最大値となるまで、前記更新工程による更新、前記算出工程による更新後における前記上限長Ｎまでの各圧縮符号長の前記文字情報の種類数に基づく前記総和の再算出、および、前記判断工程による再算出された総和が１以下の最大値であるか否かの判断を、前記コンピュータに繰り返し実行させることを特徴とする付記７または８に記載の生成プログラム。
【０３３２】
（付記１０）対象ファイルに出現する文字情報群内の各文字情報の出現率に応じた生起確率で規定される圧縮符号長ごとに、前記文字情報の種類数を集計する集計手段と、
前記対象ファイルに出現する前記文字情報の総種類数に基づいて、最小圧縮符号長から最大圧縮符号長までの圧縮符号長群の中から、前記文字情報に割り当てられる圧縮符号長の上限長Ｎを決定する決定手段と、
前記集計手段によって集計された圧縮符号長ごとの前記文字情報の種類数のうち、前記決定手段によって決定された上限長Ｎを圧縮符号長とする前記文字情報の種類数を、前記上限長Ｎ以上の圧縮符号長での前記文字情報の種類数の総和に補正する補正手段と、
前記補正手段によって補正された補正後の前記圧縮符号長ごとの前記文字情報の種類数に基づいて、前記上限長Ｎを最大枝数とし、前記文字情報の各々の生起確率に応じた圧縮符号長の圧縮符号を葉とする２N分枝無節点ハフマン木を構築する構築手段と、
を備えることを特徴とする生成装置。
【０３３３】
（付記１１）対象ファイルを記憶する記憶装置を有するコンピュータが、
集計手段により、前記対象ファイルに出現する文字情報群内の各文字情報の出現率に応じた生起確率で規定される圧縮符号長ごとに、前記文字情報の種類数を集計する集計工程と、
決定手段により、前記対象ファイルに出現する前記文字情報の総種類数に基づいて、最小圧縮符号長から最大圧縮符号長までの圧縮符号長群の中から、前記文字情報に割り当てられる圧縮符号長の上限長Ｎを決定する決定工程と、
補正手段により、前記集計工程によって集計された圧縮符号長ごとの前記文字情報の種類数のうち、前記決定工程によって決定された上限長Ｎを圧縮符号長とする前記文字情報の種類数を、前記上限長Ｎ以上の圧縮符号長での前記文字情報の種類数の総和に補正する補正工程と、
構築手段により、前記補正工程によって補正された補正後の前記圧縮符号長ごとの前記文字情報の種類数に基づいて、前記上限長Ｎを最大枝数とし、前記文字情報の各々の生起確率に応じた圧縮符号長の圧縮符号を葉とする２N分枝無節点ハフマン木を構築する構築工程と、
を実行することを特徴とする生成方法。
【符号の説明】
【０３３４】
３９００  生成装置
３９０１  集計部
３９０２  決定部
３９０３  補正部
３９０４  算出部
３９０５  判断部
３９０６  更新部
３９０７  生成部
３９０８  特定部
３９０９  構築部
【国際調査報告】
2012111078.tif 000083
2012111078.tif 000084
2012111078.tif 000085
2012111078.tif 000086