(57)【要約】【課題】文字コードの圧縮効率の向上と圧縮処理や伸長処理の高速化を図ること。【解決手段】２n分枝ハフマン木Ｈ１において、根は図１の第１階層の節点の構造体セルＣ（１，１）に相当する。また、（Ａ）〜（Ｃ）は節点または葉を示している。□は葉を示しており、■は節点を示している。下位節点／葉に枝が出ていない■は、使用されない節点である。また、葉の直下の数字は、葉の番号を示している。葉をＬ♯（♯は葉の番号）と表記する。【選択図】図２
2010093414.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータを、
節点の階層数がｋ階層（ｋはｋ≧２の自然数）、節点からその下位節点への枝数が２n本（ｎはｎ≧２の自然数）、第ｉ階層（ｉは１≦ｉ≦ｋの自然数）の節点数が２n(i-1)であり、前記各節点が上位節点へのポインタを格納しており、かつ、葉または下位節点への２n個のポインタを格納可能な節点集合を記憶する記憶手段、
対象ファイルに記述されている文字コードの出現頻度の集計結果を取得する取得手段、
前記取得手段によって取得された集計結果に基づいて、前記文字コードを出現確率Ｐ（Ｐは１／２ni≦Ｐ＜１／２n(i-1)。ただし、ｉ＝１のときは１／２ni≦Ｐ＜１、ｉ＝ｎのときはＰ＜１／２n(i-1)）に応じて階層別に分類する分類手段、
前記分類手段によって分類された前記第ｉ階層の文字コード数に基づいて、前記第ｉ階層の葉へのポインタ数を算出するとともに、当該第ｉ階層の葉へのポインタ数に基づいて、（ｉ＋１）階層の節点をリンク先とする前記第ｉ階層の下位節点へのポインタ数と前記第ｉ階層の節点の使用数とを算出する算出手段、
前記算出手段によって算出された算出結果に基づいて、２n分枝ハフマン木を生成する２n分枝ハフマン木生成手段、
前記２n分枝ハフマン木生成手段によって生成された２n分枝ハフマン木を、２m分枝（ただし、ｍ＝ｎ×ｋ）の無節点ハフマン木に変換して、前記記憶手段に記憶する変換手段、
として機能させることを特徴とする情報処理プログラム。
【請求項２】
前記２n分枝ハフマン木生成手段は、
前記算出手段によって算出された算出結果に基づいて、前記第ｉ階層の葉へのポインタと前記第ｉ階層の下位節点へのポインタを生成するポインタ生成手段、
前記第ｉ階層の使用数分の節点に、前記ポインタ生成手段によって生成された前記第ｉ階層の葉へのポインタと前記第ｉ階層の下位節点へのポインタとを格納するポインタ格納手段、
前記分類手段によって分類された前記第ｉ階層の文字ごとに、前記ポインタ格納手段によって前記第ｉ階層の節点に格納された葉へのポインタにより前記第ｉ階層の節点のリンク先となる葉を、前記文字コードごとに生成する葉生成手段、
前記葉生成手段によって生成された葉に、当該葉の番号に対応付けられた文字コードを格納することにより、２n分枝ハフマン木を生成する文字コード格納手段を備えることを特徴とする請求項１に記載の情報処理プログラム。
【請求項３】
前記コンピュータを、
前記２n分枝ハフマン木において前記第ｉ階層の葉へのポインタ数と第（ｉ−１）階層の空き節点内の空きポインタ数とを検出する検出手段、
前記検出手段によって検出された前記第ｉ階層の葉へのポインタ数と第（ｉ−１）階層の空き節点内の空きポインタ数とに基づいて、前記第ｉ階層から前記第（ｉ−１）階層の空き節点への移動対象となる前記第ｉ階層の葉へのポインタ（以下、「移動対象ポインタ」という）を特定する特定手段、
前記特定手段によって特定された移動対象ポインタを格納する節点へのポインタを前記第（ｉ−１）階層の節点から削除し、前記移動対象ポインタを前記第（ｉ−１）階層の節点に移動させる最適化手段として機能させ、
前記変換手段は、
前記最適化手段によって最適化された２n分枝ハフマン木を、前記２m分枝の無節点ハフマン木に変換して、前記記憶手段に記憶することを特徴とする請求項２に記載の情報処理プログラム。
【請求項４】
前記変換手段は、
前記２n分枝ハフマン木の階層数と前記第ｉ階層の葉の数に基づいて、前記第ｉ階層の葉ごとに葉へのポインタの種類数を決定する決定手段と、
前記２n分枝ハフマン木の葉を複製する複製手段と、
葉へのポインタを格納可能な根を生成して、前記記憶手段に格納する根生成手段と、
前記決定手段によって決定された種類数に基づいて、前記複製手段によって複製された葉ごとに当該葉へのポインタを生成して、前記根生成手段によって生成された根に格納する第１の構築手段と、
前記葉に対する当該葉へのポインタ群に共通のビット列からなる圧縮符号を抽出し、当該圧縮符号およびその圧縮符号長を前記葉に格納して前記葉を再構築することにより、前記根および前記葉からなる無節点ハフマン木を生成する第２の構築手段と、
を備えることを特徴とする請求項１〜３のいずれか一つに記載の情報処理プログラム。
【請求項５】
前記コンピュータを、
前記文字コードを出現頻度の降順にソートするソート手段、
前記ソート手段によってソートされた結果、前記文字コードのうち前記出現頻度の高位の文字コードと低位の文字コードとに分け、前記低位の文字コードを上位ビットコードと下位ビットコードに分割する分割手段、
前記分割手段によって分割された上位ビットコードおよび下位ビットコードの出現頻度を集計する集計手段として機能させ、
前記分類手段は、
前記高位の文字コードの集計結果と前記集計手段によって集計された集計結果とに基づいて、前記文字コードを出現確率Ｐに応じて階層別に分類することを特徴とする請求項１〜４のいずれか一つに記載の情報処理プログラム。
【請求項６】
節点の階層数がｋ階層（ｋはｋ≧２の自然数）、節点からその下位節点への枝数が２n本（ｎはｎ≧２の自然数）、第ｉ階層（ｉは１≦ｉ≦ｋの自然数）の節点数が２n(i-1)であり、前記各節点が上位節点へのポインタを格納しており、かつ、葉または下位節点への２n個のポインタを格納可能な節点集合を記憶する記憶手段と、
対象ファイルに記述されている文字コードの出現頻度の集計結果を取得する取得手段と、
前記取得手段によって取得された集計結果に基づいて、前記文字コードを出現確率Ｐ（Ｐは１／２ni≦Ｐ＜１／２n(i-1)。ただし、ｉ＝１のときは１／２ni≦Ｐ＜１、ｉ＝ｎのときはＰ＜１／２n(i-1)）に応じて階層別に分類する分類手段と、
前記分類手段によって分類された前記第ｉ階層の文字コード数に基づいて、前記第ｉ階層の葉へのポインタ数を算出するとともに、当該第ｉ階層の葉へのポインタ数に基づいて、（ｉ＋１）階層の節点をリンク先とする前記第ｉ階層の下位節点へのポインタ数と前記第ｉ階層の節点の使用数とを算出する算出手段と、
前記算出手段によって算出された算出結果に基づいて、２n分枝ハフマン木を生成する２n分枝ハフマン木生成手段と、
前記２n分枝ハフマン木生成手段によって生成された２n分枝ハフマン木を、２m分枝（ただし、ｍ＝ｎ×ｋ）の無節点ハフマン木に変換して、前記記憶手段に記憶する変換手段と、
を備えることを特徴とする情報処理装置。
【請求項７】
節点の階層数がｋ階層（ｋはｋ≧２の自然数）、節点からその下位節点への枝数が２n本（ｎはｎ≧２の自然数）、第ｉ階層（ｉは１≦ｉ≦ｋの自然数）の節点数が２n(i-1)であり、前記各節点が上位節点へのポインタを格納しており、かつ、葉または下位節点への２n個のポインタを格納可能な節点集合を記憶する記憶手段を備える情報処理装置が、
対象ファイルに記述されている文字コードの出現頻度の集計結果を取得する取得工程と、
前記取得工程によって取得された集計結果に基づいて、前記文字コードを出現確率Ｐ（Ｐは１／２ni≦Ｐ＜１／２n(i-1)。ただし、ｉ＝１のときは１／２ni≦Ｐ＜１、ｉ＝ｎのときはＰ＜１／２n(i-1)）に応じて階層別に分類する分類工程と、
前記分類手段によって分類された前記第ｉ階層の文字コード数に基づいて、前記第ｉ階層の葉へのポインタ数を算出するとともに、当該第ｉ階層の葉へのポインタ数に基づいて、（ｉ＋１）階層の節点をリンク先とする前記第ｉ階層の下位節点へのポインタ数と前記第ｉ階層の節点の使用数とを算出する算出工程と、
前記算出手段によって算出された算出結果に基づいて、２n分枝ハフマン木を生成する２n分枝ハフマン木生成工程と、
前記２n分枝ハフマン木生成手段によって生成された２n分枝ハフマン木を、２m分枝（ただし、ｍ＝ｎ×ｋ）の無節点ハフマン木に変換して、前記記憶手段に記憶する変換工程と、
を実行することを特徴とする情報処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、ハフマン木の生成、生成されたハフマン木の変換、ハフマン木を用いた圧縮、伸長をおこなう情報処理プログラム、情報処理装置、および情報処理方法に関する。
【背景技術】
【０００２】
英文テキストの圧縮データを圧縮形式のままで有限オートマトンにより検索する技術が開示されている（たとえば、下記非特許文献１を参照。）。また、データの符号化や経路制御テーブルに木構造を適用した技術が開示されている（たとえば、下記特許文献１、２を参照。）。
【０００３】
【非特許文献１】深町修一、篠原武、竹田正幸著  「可変長符号圧縮データのための文字列パターン照合−ゲノム情報の高速検索技法−」１９９２  情報学シンポジウム  講演論文集  １９９２年１月８日  ｐ．９５−１０３
【特許文献１】特開平１０−２７１０１２号公報
【特許文献２】特開２０００−１８８６０８号公報
【発明の開示】
【発明が解決しようとする課題】
【０００４】
しかしながら、上述した非特許文献１では、オートマトンで文字認識を行うための遷移テーブルが増加するため、日本語化については実用化されていない。また、８ビットコードの２５６種に比べ１６ビットコードの６４Ｋ種の文字コードでは、遷移テーブルの生成時間とサイズが相乗的に拡大するという問題がある。したがって、日本語化については実用化が困難である。
【０００５】
また、上述した特許文献１、２では、１６ビットコードを対象にハフマン圧縮を行うと出現頻度が低い文字の圧縮符号が２０ビット以上になるため、無節点の線形探索のテーブルが２の２０乗に肥大化するという問題がある。
【０００６】
この発明は、上述した従来技術による問題点を解消するため、文字コードの圧縮効率の向上と圧縮処理や伸長処理の高速化を図ることができる情報処理プログラム、情報処理装置、および情報処理方法を提供することを目的とする。
【課題を解決するための手段】
【０００７】
上述した課題を解決し、目的を達成するため、この情報処理プログラム、情報処理装置、および情報処理方法は、節点の階層数がｋ階層（ｋはｋ≧２の自然数）、節点からその下位節点への枝数が２n本（ｎはｎ≧２の自然数）、第ｉ階層（ｉは１≦ｉ≦ｋの自然数）の節点数が２n(i-1)であり、前記各節点が上位節点へのポインタを格納しており、かつ、葉または下位節点への２n個のポインタを格納可能な節点集合を記憶しておき、対象ファイルに記述されている文字コードの出現頻度の集計結果を取得し、取得された集計結果に基づいて、前記文字コードを出現確率Ｐ（Ｐは１／２ni≦Ｐ＜１／２n(i-1)。ただし、ｉ＝１のときは１／２ni≦Ｐ＜１、ｉ＝ｎのときはＰ＜１／２n(i-1)）に応じて階層別に分類し、分類された前記第ｉ階層の文字コード数に基づいて、前記第ｉ階層の葉へのポインタ数を算出するとともに、当該第ｉ階層の葉へのポインタ数に基づいて、（ｉ＋１）階層の節点をリンク先とする前記第ｉ階層の下位節点へのポインタ数と前記第ｉ階層の節点の使用数とを算出し、算出された算出結果に基づいて、２n分枝ハフマン木を生成し、生成された２n分枝ハフマン木を、２m分枝（ただし、ｍ＝ｎ×ｋ）の無節点ハフマン木に変換して記憶することを要件とする。
【発明の効果】
【０００８】
この情報処理プログラム、情報処理装置、および情報処理方法によれば、文字コードの圧縮効率の向上と圧縮処理や伸長処理の高速化を図ることができるという効果を奏する。
【発明を実施するための最良の形態】
【０００９】
以下に添付図面を参照して、この情報処理プログラム、情報処理装置、および情報処理方法の好適な実施の形態を詳細に説明する。まず、本実施の形態にかかる２n分枝ハフマン木について説明する。２n分枝ハフマン木とは、節点からその下位節点への枝数が２n本のハフマン木である。ｎはｎ≧２の自然数である。節点の階層数はｋ（ｋはｋ≧２の自然数）である。また、第ｉ階層（ｉは１≦ｉ≦ｋの自然数）の節点数は２n(i-1)である。各節点が上位節点へのポインタを格納している。
【００１０】
また、各節点は、２n個の葉または下位節点への２n個のポインタを格納可能である。２n分枝ハフマン木は２nビットの文字コードの圧縮に用いられる。本実施の形態では、１６ビットの文字コードを圧縮／伸長の対象とする場合はｎ＝４とし、８ビットの文字コードを圧縮／伸長の対象とする場合はｎ＝２とする。日本語の漢字等は１６ビットコードで表現されるため、以下、ｎ＝４、ｋ＝４として説明する。
【００１１】
＜２n分枝ハフマン木＞
図１は、２n（ｎ＝４により２n＝１６）分枝ハフマン木の生成元となる節点集合体を示す説明図である。この節点集合体１００において、第１階層では１個の節点の構造体セル、第２階層では１６個の節点の構造体セル、第３階層では２５６個の節点の構造体セル、第４階層では４０９６個の節点の構造体セルを有する。各構造体セルＣ（ｉ，ｊ）は、リンク元となる上位節点のポインタを格納している。最上位となる第１階層の節点の構造体Ｃ（１，１）は、根の構造体であるため、上位節点のポインタはない。
【００１２】
図２は、２n分枝ハフマン木を示す説明図である。図２では、ｎ＝４、すなわち、１６分枝ハフマン木である。２n分枝ハフマン木Ｈ１において、根は図１の第１階層の節点の構造体セルＣ（１，１）に相当する。また、（Ａ）〜（Ｃ）は節点または葉を示している。図２中、□は葉を示しており、■は節点を示している。下位節点／葉に枝が出ていない■は、使用されない節点である。また、葉の直下の数字は、葉の番号を示している。以降、葉をＬ♯（♯は葉の番号）と表記する。
【００１３】
すなわち、（Ａ）の□は第１階層の根からリンクする葉Ｌ１〜Ｌ３である。また、■は根からリンクする第２階層の節点であり、節点の構造体セルＣ（２，４）〜Ｃ（２，１６）に相当する。（Ｂ）の□は第２階層の節点からリンクする葉Ｌ４〜Ｌ１３４である。また、■は根からリンクする第３階層の節点であり、節点の構造体セルＣ（３，１３５）〜Ｃ（３，２５６）に相当する。（Ｃ）の□は第３階層の節点からリンクする葉Ｌ１３５〜Ｌ１２９５である。また、■は根からリンクする第４階層の節点であり、節点の構造体セルＣ（４，１２９６）〜Ｃ（４，４０９６）に相当する。つぎに、圧縮の前処理について説明する。
【００１４】
＜圧縮前処理＞
図３は、圧縮前処理を示す説明図である。対象ファイル３００には数千〜数万種の文字が記述されており、本プログラムでは、対象ファイル３００内の文字コードについて出現頻度を集計して降順にソートする。そして、高位（たとえば、１〜１０２４位まで）の文字コードと低位（１０２５位以下）の文字コードにわける。
【００１５】
高位の文字コードは出現頻度が高いため、１６ビットコードとして圧縮符号を割り当てる。低位の文字コードは、上位８ビットと下位８ビットに分割する。１６ビットコードでは最大で６５５３６（２５６×２５６）種の文字を扱えるが、低位の文字コードを、８ビットで分割することにより、６万種以上ある低位の文字コードを２５６種の分割文字コードに抑えることができる。
【００１６】
たとえば、漢字の「兎」の１６ビットの文字コードは“０ｘ５１４Ｅ”であるため、上位８ビット“０ｘ５１”と下位８ビット“０ｘ４Ｅ”に分割する。同様に、漢字の「兆」の１６ビットの文字コードは“０ｘ５１４６”であるため、上位８ビット“０ｘ５１”と下位８ビット“０ｘ４６”に分割する。そして、分割された８ビットの分割文字コードの出現頻度を集計する。この「兎」および「兆」の例では、分割文字コード“０ｘ５１”の出現頻度は２回、分割文字コード“０ｘ４Ｅ”，“０ｘ４６”は１回となる。
【００１７】
また、＜ｐ＞や＜ｐ／＞といったタグなどを予約語とする。この予約語は数十種決めておく。そして、高位文字コード群、分割文字コード群および予約語群を混在させて出現頻度を再集計し、出現頻度の降順に再ソートする。これにより、出現頻度の降順にソートされた約１３００種の文字コードが得られる。文字コード種をこの程度の数に抑えることで、１６ビットの文字コードを１２ビット以下の圧縮符号に圧縮し、圧縮符号を１６ビットの文字コードに伸長することが可能となる。
【００１８】
＜情報処理装置のハードウェア構成＞
図４は、実施の形態にかかる情報処理装置のハードウェア構成を示すブロック図である。図４において、情報処理装置は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）４０１と、ＲＯＭ（Ｒｅａｄ‐Ｏｎｌｙ  Ｍｅｍｏｒｙ）４０２と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）４０３と、磁気ディスクドライブ４０４と、磁気ディスク４０５と、光ディスクドライブ４０６と、光ディスク４０７と、ディスプレイ４０８と、Ｉ／Ｆ（Ｉｎｔｅｒｆａｃｅ）４０９と、キーボード４１０と、マウス４１１と、スキャナ４１２と、プリンタ４１３と、を備えている。また、各構成部はバス４００によってそれぞれ接続されている。
【００１９】
ここで、ＣＰＵ４０１は、情報処理装置の全体の制御を司る。ＲＯＭ４０２は、ブートプログラムなどのプログラムを記憶している。ＲＡＭ４０３は、ＣＰＵ４０１のワークエリアとして使用される。磁気ディスクドライブ４０４は、ＣＰＵ４０１の制御にしたがって磁気ディスク４０５に対するデータのリード／ライトを制御する。磁気ディスク４０５は、磁気ディスクドライブ４０４の制御で書き込まれたデータを記憶する。
【００２０】
光ディスクドライブ４０６は、ＣＰＵ４０１の制御にしたがって光ディスク４０７に対するデータのリード／ライトを制御する。光ディスク４０７は、光ディスクドライブ４０６の制御で書き込まれたデータを記憶したり、光ディスク４０７に記憶されたデータをコンピュータに読み取らせたりする。
【００２１】
ディスプレイ４０８は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。このディスプレイ４０８は、たとえば、ＣＲＴ、ＴＦＴ液晶ディスプレイ、プラズマディスプレイなどを採用することができる。
【００２２】
インターフェース（以下、「Ｉ／Ｆ」と略する。）４０９は、通信回線を通じてＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどのネットワーク４１４に接続され、このネットワーク４１４を介して他の装置に接続される。そして、Ｉ／Ｆ４０９は、ネットワーク４１４と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。Ｉ／Ｆ４０９には、たとえばモデムやＬＡＮアダプタなどを採用することができる。
【００２３】
キーボード４１０は、文字、数字、各種指示などの入力のためのキーを備え、データの入力をおこなう。また、タッチパネル式の入力パッドやテンキーなどであってもよい。マウス４１１は、カーソルの移動や範囲選択、あるいはウィンドウの移動やサイズの変更などをおこなう。ポインティングデバイスとして同様に機能を備えるものであれば、トラックボールやジョイスティックなどであってもよい。
【００２４】
スキャナ４１２は、画像を光学的に読み取り、情報処理装置内に画像データを取り込む。なお、スキャナ４１２は、ＯＣＲ（Ｏｐｔｉｃａｌ  Ｃｈａｒａｃｔｅｒ  Ｒｅａｄｅｒ）機能を持たせてもよい。また、プリンタ４１３は、画像データや文書データを印刷する。プリンタ４１３には、たとえば、レーザプリンタやインクジェットプリンタを採用することができる。
【００２５】
＜情報処理装置の機能的構成１＞
図５は、実施の形態にかかる情報処理装置の機能的構成１を示すブロック図である。図５において、情報処理装置５００は、入力部５０１と、取得部５０２と、分類部５０６と、算出部５０７と、２n分枝ハフマン木生成部（ポインタ生成部５０８、ポインタ格納部５０９、葉生成部５１０、文字コード格納部５１１）と、検出部５１２と、特定部５１３と、最適化部５１４と、文字構造体生成部５１５と、を備えている。
【００２６】
入力部５０１〜文字構造体生成部５１５は、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶されたプログラムをＣＰＵ４０１に実行させることにより、または、Ｉ／Ｆ４０９により、その機能を実現する。
【００２７】
入力部５０１は、対象ファイル３００から文字コードを入力する機能を有する。具体的には、たとえば、ＣＰＵ４０１が対象ファイル３００を走査して２nビットの文字コードを順次対象ファイル３００から読み出す。読み出された文字コードはＣＰＵ４０１内のレジスタに保持される。
【００２８】
取得部５０２は、対象ファイル３００に記述されている２nビットの文字コードの出現頻度の集計結果を取得する機能を有する。集計結果さえ取得できれば、集計結果自体を直接読み込んでもよく、また、入力部５０１によりレジスタにセットされる文字コードを順次集計してもよい。後者の場合、取得部５０２は、具体的には、たとえば、集計部５０３とソート部５０４とを有する。集計部５０３は、レジスタにセットされる文字コードの数を集計する。たとえば、ＣＰＵ４０１がレジスタにセットされる文字コードと一致する文字コードについて文字出現頻度集計テーブルの計数値をインクリメントする。
【００２９】
図６は、文字出現頻度集計テーブルを示す説明図である。文字出現頻度集計テーブル６００は、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶されており、ＣＰＵ４０１がアクセス可能である。文字出現頻度集計テーブル６００は、文字ごとに計数値を記憶する。文字項目は実際には説明の便宜上、各種文字が割り当てられているが、実際には入力文字コードと比較するため文字コードが割り当てられている。すなわち、ＣＰＵ４０１は、入力文字コードを文字項目で走査することで一致する文字コードを検出する。そして、検出された場合に計数値を１ポイントインクリメントする。
【００３０】
図７は、予約語出現頻度集計テーブルを示す説明図である。予約語出現頻度集計テーブル７００も、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶されており、ＣＰＵ４０１がアクセス可能である。予約語出現頻度集計テーブル７００は、予約語ごとに計数値を記憶する。予約語項目は説明の便宜上、各種文字が割り当てられているが、実際には入力文字コードと比較するため文字コード列が割り当てられている。すなわち、図６に示した文字出現頻度集計テーブル６００との照合に先立って、ＣＰＵ４０１は、入力文字コードを予約語項目で走査することで一致する文字コードを検出する。
【００３１】
一致する場合は、次の入力文字コードを予約語項目で走査する。これを繰り返し、一致する文字コード列が検出された場合、その予約語の文字コード列の計数値を１ポイントインクリメントする。不一致の文字コードが出現した場合は、文字出現頻度集計テーブル６００にアクセスして、これまで一致した文字コード列の各文字コードの計数値を１ポイントインクリメントする。そして、不一致となった文字コードについては、上述したように、文字出現頻度集計テーブル６００を用いて集計する。
【００３２】
図５に戻って、ソート部５０４は、集計結果をソートする機能を有する。具体的には、たとえば、ＣＰＵ４０１は、文字出現頻度集計テーブル６００の文字（文字コード）や予約語出現頻度集計テーブル７００の予約語を計数値の降順にソートする。
【００３３】
図８は、文字コードおよび予約語の出現頻度を統合した集計結果テーブルを示す説明図である。集計結果テーブル８００では、出現頻度（計数値）の降順に文字コードまたは予約語がソートされている。集計結果テーブル８００も、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶されており、ＣＰＵ４０１がアクセス可能である。
【００３４】
分割部５０５は、ソート部５０４によってソートされた結果、文字コードのうち出現頻度の高位の文字コードと低位の文字コードとに分け、低位の文字コードを上位ビットコードと下位ビットコードに分割する機能を有する。具体的には、たとえば、文字出現頻度集計テーブル６００の文字（コード）を計数値の降順にソートした結果、たとえば、１位〜１０２４位までの文字コードを高位文字コードとし、１０２５位以降の文字コードを低位文字コードとする。ＣＰＵ４０１は、この低位文字コードを、図３の例１）や例２）に示したように、上位８ビットコードと下位８ビットコードに分割する。
【００３５】
上位８ビットコードや下位８ビットコードといった分割文字コードは、最大２５６種となる。１６ビットコードでは最大６万種以上の文字が割り当てられ、同数の葉が必要となるが、出現順位の低い低位文字コードを分割することで、１０２５位以降の最大約６万種の文字コードを、たかだか２５６種の分割文字コードで表現できる。したがって、文字コードに割り当てる葉の数を大幅に削減（１０２４＋２５６＋予約語数十種）することができる。この場合、集計部５０３は、分割文字コードの出現頻度を再集計する。
【００３６】
図９は、分割文字コード出現頻度集計テーブルを示す説明図である。分割文字コード出現頻度集計テーブル９００も、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶されており、ＣＰＵ４０１がアクセス可能である。そして、ソート部５０４では、１６ビットである高位文字コード、予約語、分割文字コード（以下、「文字コード等」という）を統合して、図８に示した集計結果テーブル８００を更新する。
【００３７】
分類部５０６は、取得部５０２によって取得された集計結果に基づいて、文字コード等を出現確率Ｐに応じて階層別に分類する機能を有する。具体的には、たとえば、集計結果テーブル８００を参照して、文字コード等を出現確率Ｐに応じて階層別に分類する。
【００３８】
ここで、出現確率Ｐとは、文字コード等の総数を、対象となる文字コード等の出現数（文字出現頻度集計テーブル６００の計数値）で除算した値である。ＣＰＵ４０１は、各文字コード等の出現確率Ｐを算出する。そして、算出された出現確率Ｐを階層別に分類する。たとえば、第ｉ階層の場合、１／２ni≦Ｐ＜１／２n(i-1)となる文字コードでグループ化する。ただし、第１階層（ｉ＝１）のときは１／２ni≦Ｐ＜１、第ｎ階層（ｉ＝ｎ）のときはＰ＜１／２n(i-1)でグループ化する。
【００３９】
たとえば、ｎ＝４の場合、第１階層の文字コード等は、出現確率Ｐが１／１６≦Ｐ＜１となる文字コードである。また、第２階層の文字コード等は、１／３２≦Ｐ＜１／１６となる文字コードである。また、第３階層の文字コード等は、１／４０９６≦Ｐ＜１／３２となる文字コードである。また、第４階層の文字コード等は、Ｐ＜１／４０９６となる文字コードである。分類結果である階層番号ｉや集計結果テーブル８００における順位は、文字コード等ごとに付与される。集計結果テーブル８００における順位は、その文字コード等の葉の番号となる。
【００４０】
算出部５０７は、分類部５０６によって分類された第ｉ階層の文字コード数に基づいて、第ｉ階層の葉へのポインタ数を算出する機能を有する。また、当該第ｉ階層の葉へのポインタ数に基づいて、（ｉ＋１）階層の節点をリンク先とする第ｉ階層の下位節点へのポインタ数と第ｉ階層の節点の使用数とを算出する機能を有する。
【００４１】
具体的には、たとえば、ＣＰＵ４０１は、節点集合体１００と分類結果から、第ｉ階層について、構造体セル数Ｎ（ｉ）、葉の数Ｎｌ（ｉ）、葉へのポインタ数Ｎｌｐ（ｉ）、下位節点へのポインタ数Ｎｎｐ（ｉ）、構造体セル使用数Ｎｃｕ（ｉ）、葉へのポインタ数の累計値ΣＮｌｐ（ｉ）、先頭からの空きセル数Ｎｃｓｔ（ｉ）、末尾までの空きポイ
ンタ数Ｎｐｓｅ（ｉ）、末尾までの空きセル数Ｎｃｓｅ（ｉ）を算出する。
【００４２】
図１０は、算出部５０７による算出結果テーブルを示す説明図である。算出結果テーブル５２０も、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶されており、ＣＰＵ４０１がアクセス可能である。算出結果テーブル５２０には、階層ごとに算出された各項目の値がＣＰＵ４０１により書き込まれる。図１０では、ｎ＝４の場合の算出結果を示している。
【００４３】
構造体セル数Ｎ（ｉ）とは、第ｉ階層の節点の構造体セルＣ（ｉ，ｊ）の個数である。構造体セル数Ｎ（ｉ）は、ＣＰＵ４０１が節点集合体１００の各階層の節点の構造体セルＣ（ｉ，ｊ）の個数を計数することで得られる。ｎ＝４の場合、第１階層は１個（根）、第２階層は１６個、第３階層は２５６個、第４階層は４０９６個である。
【００４４】
葉の数Ｎｌ（ｉ）とは、第ｉ階層の葉の構造体の個数である。葉の数Ｎｌ（ｉ）は、分類結果である階層ごとの文字コード数となる。図１０の例では、第１階層は３個、第２階層は５４個、第３階層は３５３個、第４階層は８８５個である。
【００４５】
葉へのポインタ数Ｎｌｐ（ｉ）とは、第ｉ階層の節点の構造体セルＣ（ｉ，ｊ）に格納する葉へのポインタの総数である。葉へのポインタ数Ｎｌｐ（ｉ）は葉の数Ｎｌ（ｉ）と同数である。
【００４６】
下位節点へのポインタ数Ｎｎｐ（ｉ）とは、第ｉ階層の節点の構造体セルＣ（ｉ，ｊ）に格納する下位節点へのポインタの総数である。下位節点をポイントするため、第（ｉ＋１）階層の葉へのポインタ数Ｎｌｐ（ｉ＋１）と下位節点へのポインタ数Ｎｎｐ（ｉ＋１）に依存する。たとえば、ＣＰＵ４０１は、下記式（１）により、下位節点へのポインタ数Ｎｎｐ（ｉ）を算出する。
【００４７】
Ｎｎｐ（ｉ）＝｛Ｎｌｐ（ｉ＋１）＋Ｎｎｐ（ｉ＋１）｝／２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(i-1)に対して、ｊ＞２n(i-1)であるか否かを判断する（ステップＳ２２０５）。ｊ＞２n(i-1)でない場合（ステップＳ２２０５：Ｎｏ）、ｊを１ポイントインクリメントし（ステップＳ２２０６）、ステップＳ２２０４に戻る。一方、ｊ＞２n(i-1)である場合（ステップＳ２２０５：Ｙｅｓ）、ｉ＞ｋであるか否かを判断する（ステップＳ２２０７）。ｉ＞ｋでない場合（ステップＳ２２０７：Ｎｏ）、ｉを１ポイントインクリメントし（ステップＳ２２０８）、ステップＳ２２０３に戻る。一方、ｉ＞ｋである場合（ステップＳ２２０７：Ｙｅｓ）、ステップＳ１９０７に移行する。
【００９５】
図２３は、図２２に示した第ｉ階層の構造体セルＣ（ｉ，ｊ）の構築処理（ステップＳ２２０４）の詳細な処理手順を示すフローチャート（前半）である。まず、Ｎｌｐ（ｉ）個の葉Ｌ♯へのポインタを生成し（ステップＳ２３０１）、第ｉ階層に関する葉Ｌ♯の構造体を生成する（ステップＳ２３０２）。そして、Ｎｎｐ（ｉ）個の下位節点へのポインタを生成する（ステップＳ２３０３）。このあと、セル番号ｊが先頭からの空きセル数Ｎｃｓｔ（ｉ）に対して、ｊ＞Ｎｃｓｔ（ｉ）であるか否かを判断する（ステップＳ２３０４）。
【００９６】
ｊ＞Ｎｃｓｔ（ｉ）でない場合（ステップＳ２３０４：Ｎｏ）、構造体セルＣ（ｉ，ｊ）を空きセルに決定する（ステップＳ２３０５）。そして、ｊを１ポイントインクリメントし（ステップＳ２３０６）、ステップＳ２３０４に戻る。一方、ｊ＞Ｎｃｓｔ（ｉ）である場合（ステップＳ２３０４：Ｙｅｓ）、ｊ＞Ｎｃｓｔ（ｉ）＋Ｎｃｕ（ｉ）であるか否かを判断する（ステップＳ２３０７）。Ｎｃｕ（ｉ）は第ｉ階層における構造体セル使用数である。
【００９７】
ｊ＞Ｎｃｓｔ（ｉ）＋Ｎｃｕ（ｉ）である場合（ステップＳ２３０７：Ｙｅｓ）、ステップＳ２２０５に移行する。一方、ｊ＞Ｎｃｓｔ（ｉ）＋Ｎｃｕ（ｉ）でない場合（ステップＳ２３０７：Ｎｏ）、ステップＳ２４０１に移行する。
【００９８】
図２４は、図２２に示した第ｉ階層の構造体セルＣ（ｉ，ｊ）の構築処理（ステップＳ２２０４）の詳細な処理手順を示すフローチャート（後半）である。ステップＳ２４０１において、構造体セルＣ（ｉ，ｊ）に空きがあるか否かを判断する（ステップＳ２４０１）。空きがない場合（ステップＳ２４０１：Ｎｏ）、ｊを１ポイントインクリメントして（ステップＳ２４０２）、ステップＳ２４０１に戻る。
【００９９】
一方、空きがある場合（ステップＳ２４０１：Ｙｅｓ）、葉Ｌ♯へのポインタを葉の番号♯の若い順に構造体セルＣ（ｉ，ｊ）に格納する（ステップＳ２４０３）。そして、格納した葉Ｌ♯のポインタによりリンク先となる葉Ｌ♯の構造体に上位節点Ｃ（ｉ−１，ｊ）へのポインタを生成・格納する（ステップＳ２４０４）。
【０１００】
そして、未保存の葉Ｌ♯へのポインタがあるか否かを判断する（ステップＳ２４０５）。未保存の葉Ｌ♯へのポインタがある場合（ステップＳ２４０５：Ｙｅｓ）、ステップＳ２４０１に戻る。一方、未保存の葉Ｌ♯へのポインタがない場合（ステップＳ２４０５：Ｎｏ）、構造体セルＣ（ｉ，ｊ）に空きがあるか否かを判断する（ステップＳ２４０６）。空きがない場合（ステップＳ２４０６：Ｎｏ）、ｊを１ポイントインクリメントして（ステップＳ２４０７）、ステップＳ２４０６に戻る。
【０１０１】
一方、構造体セルＣ（ｉ，ｊ）に空きがある場合（ステップＳ２４０６：Ｙｅｓ）、下位節点へのポインタを節点番号の若い順に構造体セルＣ（ｉ，ｊ）に格納する（ステップＳ２４０８）。そして、未格納の下位節点へのポインタがあるか否かを判断する（ステップＳ２４０９）。未格納の下位節点へのポインタがある場合（ステップＳ２４０９：Ｙｅｓ）、ステップＳ２４０６に戻る。一方、未格納の下位節点へのポインタがない場合（ステップＳ２４０９：Ｎｏ）、図２３のステップＳ２３０４に戻る。
【０１０２】
図２５は、図１９に示した最適化処理（ステップＳ１９０７）の詳細な処理手順を示すフローチャートである。まず、階層番号ｉをｉ＝ｋとし（ステップＳ２５０１）、ｉ＝１であるか否かを判断する（ステップＳ２５０２）。ｉ＝１でない場合（ステップＳ２５０２：Ｎｏ）、検出部５１２により、第ｉ階層の葉Ｌ♯へのポインタ数Ｎｌｐ（ｉ）、第（ｉ−１）階層の下位節点へのポインタ数Ｎｎｐ（ｉ−１）、および第（ｉ−１）階層の末尾までの空きポインタ数Ｎｐｓｅ（ｉ−１）を算出結果テーブル５２０から検出する（ステップＳ２５０３）。
【０１０３】
そして、Ｎｌｐ（ｉ）＝０であるか否かを判断する（ステップＳ２５０４）。Ｎｌｐ（ｉ）＝０である場合（ステップＳ２５０４：Ｙｅｓ）、移動させる葉Ｌ♯へのポインタがないため、ステップＳ２５０９に移行する。一方、Ｎｌｐ（ｉ）＝０でない場合（ステップＳ２５０４：Ｎｏ）、Ｎｐｓｅ（ｉ−１）＝０であるか否かを判断する（ステップＳ２５０５）。Ｎｐｓｅ（ｉ−１）＝０である場合（ステップＳ２５０５：Ｙｅｓ）、空きがないこととなり、ステップＳ２５０９に移行する。
【０１０４】
一方、Ｎｐｓｅ（ｉ−１）＝０でない場合（ステップＳ２５０５：Ｎｏ）、特定部５１３により、上記（６）式を用いて、第ｉ階層から第（ｉ−１）階層へ移動させる葉Ｌ♯へのポインタ（移動対象ポインタ）およびその数を特定する（ステップＳ２５０６）。
【０１０５】
つぎに、移動対象ポインタを格納している構造体セルＣ（ｉ，ｊ）をポイントする第（ｉ−１）階層の下位節点Ｃ（ｉ，ｊ）へのポインタを第（ｉ−１）階層から削除する（ステップＳ２５０７）。そして、移動対象ポインタを第（ｉ−１）階層に移動させ、葉Ｌ♯の番号♯が連続するように格納する（ステップＳ２５０８）。この後、ステップＳ２５０９において、階層番号ｉを１ポイントデクリメントし（ステップＳ２５０９）、ステップＳ２５０２に戻る。ステップＳ２５０２において、階層番号ｉ＝１の場合（ステップＳ２５０２：Ｙｅｓ）、一連の処理を終了する。これにより、情報処理装置５００が自動実行する２n分枝ハフマン木生成処理手順の一連の説明を終了する。
【０１０６】
つぎに、２n分枝ハフマン木Ｈ１を用いた圧縮処理と伸長処理について説明する。ここでは、上述した生成処理により自動生成された２n分枝ハフマン木Ｈ１を用いてもよく、あらかじめ与えられた２n分枝ハフマン木Ｈ１であってもよい。
【０１０７】
＜無節点ハフマン木＞
つぎに、無節点ハフマン木について説明する。無節点ハフマン木とは、根と葉のみからなる内部節点のないハフマン木である。無節点ハフマン木は、枝の本数が多くなるが、根から１パスで葉にアクセスすることができる。
【０１０８】
図２６は、２m分枝の無節点ハフマン木を示す説明図である。２m（ｍ＝１２）分枝の無節点ハフマン木Ｈ２では、根から葉へのポインタとなる枝番号はｍビットコードのアドレスとなる。すなわち、葉の番号１〜４０９６の葉へのポインタは、“００００００００００００”〜“１１１１１１１１１１１１”となる。１６ビットの文字コードの場合、１２ビットコード以下に圧縮されることとなる。なお、ｍは、ｍ＜２nとなる値であり、たとえば、この不等式を満たす値のうち４の倍数で最大のものを用いる。ｍはｎに応じてあらかじめ設定される。たとえば、ｎ＝４の場合、ｍ＝１２とする。
【０１０９】
図２７は、２m分枝の無節点ハフマン木Ｈ２の節点（根）の構造体を示す説明図である。上述の２n分枝ハフマン木Ｈ１の場合と同様、葉の総数が１２９５個であるとすると、葉の数が余ることとなる。したがって、出現頻度の高い文字コード等を格納する葉に対して複数（たとえば、２５６個）のポインタを用意する。
【０１１０】
図２７では、出現頻度が高い２n分枝ハフマン木Ｈ１の第１階層の葉Ｌ１〜Ｌ３に対して、それぞれ２５６個の葉へのポインタを割り当てて根の構造体セルＣ（１，１）に格納する。また、出現頻度の高い第２階層の葉Ｌ４〜葉Ｌ１３４についても、それぞれ１６個の葉へのポインタを割り当てて根の構造体セルＣ（１，１）に格納する。第３階層の葉Ｌ１３５〜葉Ｌ１２９５については、それぞれ１個の葉へのポインタを割り当てて根の構造体セルＣ（１，１）に格納する。
【０１１１】
図２８は、無節点ハフマン木Ｈ２の葉の構造体を示す説明図である。葉の全体は、第１領域２８０１〜第３領域２８０３を有する。第１領域２８０１には、圧縮符号およびその圧縮符号長が格納される。第２領域２８０２には、葉の標識と伸長種別が格納される。第３領域２８０３には、伸長種別に応じて高位１６ビット文字コード、低位の分割８ビット文字コード、または予約語へのポインタが格納される。
【０１１２】
図２９は、葉Ｌ♯の構造体に格納される情報を示す説明図である。各レコードが葉ｌ♯の構造体に相当する。各葉Ｌ♯の構造体は、圧縮符号およびその圧縮符号長、葉の標識、伸長種別、文字コード（１６／８ビット）または予約語へのポインタの情報を含む。
【０１１３】
＜２n分枝ハフマン木Ｈ１→無節点ハフマン木Ｈ２への変換＞
無節点ハフマン木Ｈ２は、２n分枝ハフマン木Ｈ１からの変換により生成することができる。具体的には、たとえば、２n分枝ハフマン木Ｈ１から２m分枝（ｍ＝ｎ×ｋ）の無節点ハフマン木Ｈ２を生成することができる。以下、２m分枝の無節点ハフマン木Ｈ２へ変換するための機能的構成について説明する。
【０１１４】
＜情報処理装置５００の機能的構成２＞
図３０は、実施の形態にかかる情報処理装置５００の機能的構成２を示すブロック図である。なお、図５に示した構成と同一構成には同一符号を付し、その説明を省略する。図３０において、情報処理装置５００は、決定部３００１と、複製部３００２と、根生成部３００３と、第１の構築部３００４と、第２の構築部３００５と、文字構造体生成部５１５と、を備えている。決定部３００１〜第２の構築部３００５は、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶されたプログラムをＣＰＵ４０１に実行させることにより、または、Ｉ／Ｆ４０９により、その機能を実現する。
【０１１５】
決定部３００１は、２n分枝ハフマン木Ｈ１の階層数と第ｉ階層の葉の数に基づいて、第ｉ階層の葉ごとに葉へのポインタの種類数を決定する機能を有する。具体的には、たとえば、ＣＰＵ４０１は、第１階層の種類数は２５６種、第２階層の種類数は１６種、第３階層以降の種類数は１種というように、あらかじめ設定しておく。たとえば、上述した２n分枝ハフマン木Ｈ１では、第１階層の葉の数は３個、第２階層の葉の数は１３１個、第３階層の葉の数は１１６１個である。
【０１１６】
したがって、葉のポインタ数は４０２５個（＝３個×２５６種＋１３１個×１６種＋１１６１個×１種）となり、４０９６個（２m個）以下となる。これにより、第１階層の種類数は２５６種、第２階層の種類数は１６種、第３階層以降の種類数は１種に確定する。もし、４０９６個よりも多くなった場合は、第１階層の種類数を１６種にしたり、第２階層の種類数を１種にするなどして、４０９６個以下となるように最適化する。
【０１１７】
複製部３００２は、２n分枝ハフマン木Ｈ１の葉を複製する機能を有する。具体的には、たとえば、ＣＰＵ４０１は、葉Ｌ♯の構造体をコピーして、内部の上位節点へのポインタや圧縮符号長をクリアする。
【０１１８】
根生成部３００３は、２m個の葉へのポインタを格納可能な根を生成して、記憶部２６１０に格納する機能を有する。具体的には、たとえば、ｎ＝４の場合、ｍ＝１２、すなわち、４０９６個の空きポインタを有する根の構造体を生成する。
【０１１９】
第１の構築部３００４は、決定部３００１によって決定された種類数に基づいて、複製部３００２によって複製された葉ごとに当該葉へのポインタを生成し、根生成部３００３によって生成された根に格納する機能を有する。具体的には、たとえば、第１階層について２５６種と決定された場合、第１階層に関する葉Ｌ１に対しては、葉Ｌ１へのポインタＬ１Ｐ（１）〜Ｌ１Ｐ（２５６）を生成する。そして、この葉Ｌ１へのポインタＬ１Ｐ（１）〜Ｌ１Ｐ（２５６）を根の構造体に格納する。
【０１２０】
また、第２階層について１６種と決定された場合、第２階層に関する葉Ｌ４に対しては、葉Ｌ４へのポインタＬ４Ｐ（１）〜Ｌ４Ｐ（１６）を生成する。そして、この葉Ｌ４へのポインタＬ４Ｐ（１）〜Ｌ４Ｐ（１６）を根の構造体に格納する。また、第３階層について１種と決定された場合、第３階層に関する葉Ｌ１３５に対しては、葉Ｌ１３５へのポインタＬ１３５Ｐ（１）を生成する。そして、この葉Ｌ１３５へのポインタＬ１３５Ｐ（１）を根の構造体に格納する。
【０１２１】
第２の構築部３００５は、葉に対する当該葉へのポインタ群に共通のビット列からなる圧縮符号を抽出し、当該圧縮符号およびその圧縮符号長を葉に格納して葉を再構築することにより、根および葉からなる無節点ハフマン木Ｈ２を生成する機能を有する。具体的には、たとえば、任意の葉Ｌ♯について葉Ｌ♯へのポインタが複数種生成されている場合、これらのポインタに共通のビット列を圧縮符号と特定する。また、その圧縮符号長も取得する。そして、圧縮符号および圧縮符号長をその葉Ｌ♯の構造体に格納する。
【０１２２】
たとえば、葉Ｌ１については、２５６種の葉Ｌ１へのポインタＬ１Ｐ（１）〜Ｌ１Ｐ（２５６）が生成されているとした場合、以下のようなビット列となる。
【０１２３】
ポインタＬ１Ｐ（    １）：００００００００００００
ポインタＬ１Ｐ（    ２）：０００００００００００１
ポインタＬ１Ｐ（    ３）：００００００００００１０
ポインタＬ１Ｐ（    ４）：００００００００００１１
・                  ・
・                  ・
・                  ・
ポインタＬ１Ｐ（２５６）：００００１１１１１１１１
【０１２４】
ポインタＬ１Ｐ（１）〜Ｌ１Ｐ（２５６）では、上位４ビットの“００００”が共通のビット列となるため、この上位４ビット“００００”が葉Ｌ１の構造体の圧縮符号として特定される。また、この圧縮符号長は４ビットであるため、圧縮符号“００００”ともに葉Ｌ１の構造体に格納される。
【０１２５】
また、葉Ｌ４については、１６種の葉Ｌ４へのポインタＬ４Ｐ（１）〜Ｌ４Ｐ（１６）が生成されているとした場合、以下のようなビット列となる。
【０１２６】
ポインタＬ４Ｐ（  １）：００１１００００００００
ポインタＬ４Ｐ（  ２）：００１１０００００００１
ポインタＬ４Ｐ（  ３）：００１１００００００１０
ポインタＬ４Ｐ（  ４）：００１１００００００１１
・                  ・
・                  ・
・                  ・
ポインタＬ４Ｐ（１６）：００１１００００１１１１
【０１２７】
ポインタＬ４Ｐ（１）〜Ｌ４Ｐ（１６）では、上位８ビットの“００１１００００”が共通のビット列となるため、この上位８ビット“００１１００００”が葉Ｌ４の構造体の圧縮符号として特定される。また、この圧縮符号長は８ビットであるため、圧縮符号“００１１００００”とともに葉Ｌ４の構造体に格納される。
【０１２８】
また、葉Ｌ１３５については、１種の葉Ｌ１３５へのポインタＬ１３５Ｐ（１）が生成されているとした場合、以下のようなビット列となる。
【０１２９】
ポインタＬ１３５Ｐ（１）：１０１０００１０００００
【０１３０】
ポインタＬ１３５Ｐ（１）は１種だけであるため、この１２ビット“１０１０００１０００００”が葉Ｌ１３５の構造体の圧縮符号として特定される。また、この圧縮符号長は１２ビットであるため、圧縮符号“１０１０００１０００００”とともに葉Ｌ１３５の構造体に格納される。このように構築することで、無節点ハフマン木Ｈ２が生成されることとなる。
【０１３１】
また、文字構造体生成部５１５は、あらたに構築された無節点ハフマン木Ｈ２を参照して文字構造体５３０を再度生成（更新）することとなる。すなわち、予約語の構造体１６００や上位文字コードの構造体１７００、分割文字コードの構造体１８００中、葉へのポインタは、あらたに生成された葉へのポインタが格納されることとなる。
【０１３２】
＜２n分枝ハフマン木Ｈ１→２m分枝無節点ハフマン木変換処理＞
図３１は、情報処理装置５００が自動実行する２n分枝ハフマン木Ｈ１→２m分枝無節点ハフマン木変換処理手順を示すフローチャートである。図３１において、まず、２n分枝ハフマン木Ｈ１の構造体を読み込み（ステップＳ３１０１）、決定部３００１により、階層ごとの葉へのポインタの種類数を決定する（ステップＳ３１０２）。
【０１３３】
つぎに、複製部３００２により２n分枝ハフマン木Ｈ１の葉Ｌ♯の構造体を複製して（ステップＳ３１０３）、根生成部３００３により、根の構造体を生成する（ステップＳ３１０４）。そして、階層番号ｉをｉ＝１とし（ステップＳ３１０５）、第ｉ階層の未選択の葉Ｌ♯の構造体があるか否かを判断する（ステップＳ３１０６）。
【０１３４】
未選択の葉Ｌ♯の構造体がある場合（ステップＳ３１０６：Ｙｅｓ）、未選択の葉Ｌ♯の構造体を１つ選択し（ステップＳ３１０７）、決定された種類数分の葉へのポインタを生成して根の構造体に格納する（ステップＳ３１０８）。そして、種類数分の葉へのポインタから圧縮符号および圧縮符号長を特定して、葉の構造体に格納する（ステップＳ３１０９）。このあと、ステップＳ３１０５に戻る。
【０１３５】
一方、ステップＳ３１０６において、未選択の葉Ｌ♯の構造体がない場合（ステップＳ３１０６：Ｎｏ）、階層番号ｉを１ポイントインクリメントして（ステップＳ３１１０）、２n分枝ハフマン木Ｈ１の階層数ｋに対してｉ＞ｋであるか否かを判断する（ステップＳ３１１１）。ｉ＞ｋでない場合（ステップＳ３１１１：Ｎｏ）、ステップＳ３１０５に戻る。一方、ｉ＞ｋである場合（ステップＳ３１１１：Ｙｅｓ）、一連の変換処理を終了する。
【０１３６】
このように、２n分枝ハフマン木Ｈ１から２m分枝の無節点ハフマン木Ｈ２に変換することにより、無節点ハフマン木Ｈ２が圧縮や伸長に用いられることとなる。無節点ハフマン木Ｈ２を圧縮や伸長に用いることにより、２n分枝ハフマン木Ｈ１にくらべて圧縮率および検索速度の向上を図ることができる。
【０１３７】
＜無節点ハフマン木を用いた圧縮伸長＞
つぎに、２m分枝の無節点ハフマン木Ｈ２を用いた圧縮伸長について説明する。２m分枝の無節点ハフマン木Ｈ２では１パスで葉にアクセスできるため、検索速度の高速化を図ることができる。以下、そのための機能的構成について説明する。
【０１３８】
＜情報処理装置５００の機能的構成３＞
図３２は、実施の形態にかかる情報処理装置５００の機能的構成３を示すブロック図である。なお、図５に示した構成と同一構成には同一符号を付し、その説明を省略する。図３２において、情報処理装置５００は、分割部５０５と、設定部３２０１と、圧縮対象文字コード探索部３２０２と、ハフマン木探索部３２０４と、圧縮符号格納部３２０５と、抽出部３２０６と、伸長コード格納部３２０７と、記憶部３２１０と、を備えている。
【０１３９】
設定部３２０１〜伸長コード格納部３２０７は、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体に記憶されたプログラムをＣＰＵ４０１に実行させることにより、または、Ｉ／Ｆ４０９により、その機能を実現する。また、記憶部３２１０は、図４に示したＲＡＭ４０３、磁気ディスク４０５、光ディスク４０７などの記憶媒体によりその機能を実現する。
【０１４０】
設定部３２０１は、圧縮処理をおこなう場合、圧縮対象文字コードを設定する機能を有する。また、伸長処理をおこなう場合、圧縮符号列を設定する機能を有する。具体的には、たとえば、入力されてくる圧縮対象文字コードや圧縮符号列を、ＣＰＵ４０１が内部のレジスタや外部のバッファに書き込む。
【０１４１】
図３３は、圧縮対象文字コード列の一例を示す説明図である。ここでは、「次の兎は」という文字列を圧縮対象文字列とし、その文字コード列を示している。なお、「兎」は低位文字コードであるため、上位８ビットと下位８ビットに分割される。
【０１４２】
図３４は、圧縮符号列の一例を示す説明図である。ここでも、「次の兎は」という文字列の圧縮符号列を示している。「兎」は上位８ビットと下位８ビットに分割されているため、圧縮符号も分割文字コードごとに割り当てられる。
【０１４３】
圧縮対象文字コード探索部３２０２は、高位の文字コード群の中から設定部３２０１によって設定された圧縮対象文字コードを探索する機能を有する。具体的には、たとえば、ＣＰＵ４０１が、レジスタにセットされた圧縮対象文字コードを、文字構造体５３０、すなわち、予約語の構造体１６００、高位文字コードの構造体１７００を走査することで探索する。
【０１４４】
予約語の構造体１６００、高位文字コードの構造体１７００により一致する文字コードが探索されなかった場合は、ＣＰＵ４０１は、分割部５０５により、圧縮対象文字コードを上位ビットと下位ビットに分割し、分割文字コードごとに、分割文字コードの構造体１８００を走査して探索する。
【０１４５】
ハフマン木探索部３２０４は、探索された文字コード等に対応付けられた葉Ｌ♯へのポインタを用いて、探索された文字コード等の圧縮符号を探索する機能を有する。具体的には、たとえば、ＣＰＵ４０１は、文字構造体５３０から、一致した文字コード等に対応付けられている葉Ｌ♯へのポインタを読み出して、当該葉Ｌ♯の構造体を特定する。そして、ポイントされた葉Ｌ♯の構造体に格納されている文字コードの圧縮符号を抽出する。
【０１４６】
たとえば、図２６を用いて説明すると、葉Ｌ２５６に対応する文字コードが上位文字コードとして探索された場合、葉Ｌ２５６へのポインタを上位文字コードの構造体１７００から読み出して、葉Ｌ２５６にアクセスする。この葉Ｌ２５６の構造体に格納されている文字コードの圧縮符号を葉Ｌ２５６の構造体から抽出する。
【０１４７】
圧縮符号格納部３２０５は、ハフマン木探索部３２０４によって探索された圧縮符号を所定の記憶領域に格納する機能を有する。具体的には、たとえば、ＣＰＵ４０１が、探索された圧縮符号を圧縮バッファ３２１１に書き込む。
【０１４８】
抽出部３２０６は、設定部３２０１によって設定された圧縮符号列のうち圧縮符号間の境界を検出して、当該境界からの伸長対象コードを圧縮符号列から抽出する機能を有する。具体的な抽出手法については後述するが、この抽出部３２０６では、圧縮符号長が異なる圧縮符号列でも圧縮符号ごとに抽出することができる。
【０１４９】
伸長コード格納部３２０７は、ハフマン木探索部３２０４によって探索された伸長コードを所定の記憶領域に格納する機能を有する。具体的には、たとえば、ＣＰＵ４０１が、伸長コードを伸長バッファ３２１２に書き込む。伸長バッファ３２１２に書き込まれた伸長コードは、既存技術により文字として描画される。
【０１５０】
＜２m分枝の無節点ハフマン木Ｈ２を用いた圧縮処理＞
つぎに、２m分枝の無節点ハフマン木Ｈ２を用いた圧縮処理について説明する。２m分枝の無節点ハフマン木Ｈ２を用いた圧縮処理では、ハフマン木探索において、内部節点がないため根に向かって探索する必要はなく、ポイントされた葉Ｌ♯の構造体に格納されている文字コードを抽出して、圧縮バッファ３２１１に書き込む。これにより、圧縮処理の高速化を図ることができる。
【０１５１】
＜圧縮処理の具体例＞
図３５は、２m分枝の無節点ハフマン木Ｈ２を用いた圧縮処理の具体例を示す説明図である。まず、対象ファイル３００から１文字目の圧縮対象文字コードを取得し、対象ファイル３００上の位置を保持しておく。そして、予約語の構造体１６００に対して２分木探索をおこなう。予約語は２文字以上の文字コード列であるため、１文字目の圧縮対象文字コードがヒットした場合、２文字目の文字コードを圧縮対象文字コードとして取得する。
【０１５２】
そして、２文字目の文字コードは、１文字目の圧縮対象文字コードがヒットした位置から探索する。３文字目以降も、不一致の圧縮対象文字コードが出現するまで繰り返し２分木探索をおこなう。一致する予約語ｒａ（ａは葉の番号）が探索された場合、その葉Ｌａへのポインタにより葉Ｌａの構造体にアクセスする。そして、上述したハフマン木探索により、予約語ｒａの圧縮符号を探索して、圧縮バッファ３２１１に格納する。
【０１５３】
一方、不一致の圧縮文字コードが出現した場合、予約語の構造体１６００に対する２分木探索を終了し（ＥＯＴ（Ｅｎｄ  Ｏｆ  Ｔｒａｎｓｍｉｓｓｉｏｎ）まで進み）、１文字目の圧縮対象文字コードを再度レジスタにセットして、高位文字コードの構造体１７００に対する２分木探索をおこなう。
【０１５４】
一致する文字コードｅｂ（ｂは葉の番号）が探索された場合、その葉Ｌｂへのポインタにより葉Ｌｂの構造体にアクセスする。そして、上述したハフマン木探索により、文字コードｅｂの圧縮符号を探索して、圧縮バッファ３２１１に格納する。
【０１５５】
一方、一致する文字コードが出現せず２分木探索を終了した場合、圧縮対象文字コードは高位文字コードではないため、上位８ビットと下位８ビットに分割する。そして、上位８ビットの分割文字コードについて、分割文字コードの構造体１８００に対する２分木探索をおこなう。一致する分割文字コードＤｃ１（ｃ１は葉の番号）が探索された場合、その葉Ｌｃ１へのポインタにより葉Ｌｃ１の構造体にアクセスする。そして、上述したハフマン木探索により、分割文字コードＤｃ１の圧縮符号を探索して、圧縮バッファ３２１１に格納する。
【０１５６】
引き続き、下位８ビットの分割文字コードについて、分割文字コードの構造体１８００に対する２分木探索をおこなう。一致する分割文字コードＤｃ２（ｃ２は葉の番号）が探索された場合、その葉Ｌｃ２へのポインタにより葉Ｌｃ２の構造体にアクセスする。そして、上述したハフマン木探索により、分割文字コードＤｃ２の圧縮符号を探索して、分割文字コードＤｃ１の圧縮符号に続けて圧縮バッファ３２１１に格納する。
【０１５７】
＜圧縮処理手順＞
図３６は、情報処理装置５００が自動実行する２m分枝の無節点ハフマン木Ｈ２を用いた圧縮処理手順を示すフローチャート（その１）である。図３６において、まず、対象ファイル３００に圧縮対象文字コードがあるか否かを判断する（ステップＳ３６０１）。ある場合（ステップＳ３６０１：Ｙｅｓ）、圧縮対象文字コードを取得してレジスタにセットする（ステップＳ３６０２）。そして、先頭の圧縮対象文字コードか否かを判断する（ステップＳ３６０３）。
【０１５８】
ここで、先頭の圧縮対象文字コードとは、未圧縮の１文字目の文字コードをいう。先頭である場合（ステップＳ３６０３：Ｙｅｓ）、その圧縮対象文字コードの対象ファイル３００上の位置（先頭位置）となるポインタを取得し（ステップＳ３６０４）、ステップＳ３６０５に移行する。一方、先頭でない場合（ステップＳ３６０３：Ｎｏ）、先頭位置を取得せずにステップＳ３６０５に移行する。
【０１５９】
そして、予約語の構造体１６００に対して２分木探索をおこなう（ステップＳ３６０５）。圧縮対象文字コードが一致した場合（ステップＳ３６０６：Ｙｅｓ）、連続して一致した文字コード列が予約語（の文字コード列）に該当するか否かを判断する（ステップＳ３６０７）。該当しない場合（ステップＳ３６０７：Ｎｏ）、ステップＳ３６０２に戻って後続の文字コードを圧縮対象文字コードとして取得する。この場合、後続の文字コードは先頭ではないため、先頭位置は取得しないこととなる。
【０１６０】
一方、ステップＳ３６０７において、予約語に該当する場合（ステップＳ３６０７：Ｙｅｓ）、該当する予約語の葉Ｌ♯へのポインタにより葉Ｌ♯の構造体にアクセスする（ステップＳ３６０８）。そして、ポイントされた葉Ｌ♯の構造体に格納されている予約語の圧縮符号を抽出する（ステップＳ３６０９）。
【０１６１】
この後、抽出された圧縮符号を圧縮バッファ３２１１に格納して（ステップＳ３６１０）、ステップＳ３６０１に戻る。ステップＳ３６０１において、圧縮対象文字コードがない場合（ステップＳ３６０１：Ｎｏ）、一連の処理を終了する。このループが予約語の圧縮処理の流れとなる。一方、ステップＳ３６０６において不一致となった場合（ステップＳ３６０６：Ｎｏ）、１６ビットの文字コードの圧縮処理のループに入る。
【０１６２】
図３７は、情報処理装置５００が自動実行する２m分枝の無節点ハフマン木Ｈ２を用いた圧縮処理手順を示すフローチャート（その２）である。図３７において、ステップＳ３６０４で取得された先頭位置のポインタを参照して、対象ファイル３００から圧縮対象文字コードを取得してレジスタにセットする（ステップＳ３７０１）。
【０１６３】
つぎに、圧縮対象文字コードについて、高位文字コードの構造体１７００に対して２分木探索をおこなう（ステップＳ３７０２）。一致した場合（ステップＳ３７０３：Ｙｅｓ）、該当する文字の葉Ｌ♯へのポインタにより葉Ｌ♯の構造体にアクセスする（ステップＳ３７０４）。そして、ポイントされた葉Ｌ♯の構造体に格納されている圧縮対象文字コードの圧縮符号を抽出する（ステップＳ３７０５）。
【０１６４】
この後、探索された圧縮符号を圧縮バッファ３２１１に格納して（ステップＳ３７０６）、ステップＳ３６０１に戻る。このループが１６ビットの文字コードの圧縮処理の流れとなる。一方、ステップＳ３７０３において一致する文字コードが存在しなかった場合（ステップＳ３７０３：Ｎｏ）、分割文字コードの圧縮処理のループに入る。
【０１６５】
図３８は、情報処理装置５００が自動実行する２m分枝の無節点ハフマン木Ｈ２を用いた圧縮処理手順を示すフローチャート（その３）である。図３８において、まず、圧縮対象文字コードを上位８ビットと下位８ビットとに分割し（ステップＳ３８０１）、上位８ビットの分割文字コードを抽出する（ステップＳ３８０２）。そして、分割文字コードの構造体１８００に対して２分木探索をおこなう（ステップＳ３８０３）。
【０１６６】
そして、探索された分割文字コードの葉Ｌ♯へのポインタにより葉Ｌ♯の構造体にアクセスする（ステップＳ３８０４）。そして、ポイントされた葉Ｌ♯の構造体に格納されている分割文字コードの圧縮符号を抽出する（ステップＳ３８０５）。この後、探索された圧縮符号を圧縮バッファ３２１１に格納する（ステップＳ３８０６）。
【０１６７】
つぎに、下位８ビットが探索済みか否かを判断し（ステップＳ３８０７）、探索済みでない場合（ステップＳ３８０７：Ｎｏ）、下位８ビットの分割文字コードを抽出して（ステップＳ３８０８）、ステップＳ３８０３〜Ｓ３８０６を実行する。一方、下位８ビットが探索済みである場合（ステップＳ３８０７：Ｙｅｓ）、ステップＳ３６０１に戻り、予約語の圧縮処理のループに入る。
【０１６８】
このように、２m分枝の無節点ハフマン木Ｈ２を用いた圧縮処理では、内部節点がないため根に向かって探索する必要はなく、ポイントされた葉Ｌ♯の構造体に格納されている文字コードを抽出して、圧縮バッファ３２１１に書き込むだけでよい。したがって、圧縮処理の高速化を図ることができる。
【０１６９】
また、圧縮対象文字コードが格納されている葉Ｌ♯の構造体を、予約語の構造体１６００、高位文字コードの構造体１７００および分割文字コードの構造体１８００により即座に特定することができる。したがって、２m分枝の無節点ハフマン木Ｈ２の葉を探索する必要がなく、圧縮処理の高速化を図ることができる。また、低位文字コードを上位ビットコードと下位ビットコードに分割することで、６万種以上ある低位の文字コードをたかだか２５６種の分割文字コードの圧縮符号に圧縮することができる。したがって、圧縮率の向上を図ることができる。
【０１７０】
＜伸長処理の具体例＞
図３９−１〜図３９−５は、２m分枝の無節点ハフマン木Ｈ２を用いた伸長処理の具体例を示す説明図である。図３９−１〜図３９−５では、図３４に示した圧縮符号列を伸長する例を示している。伸長処理では、レジスタに圧縮符号列をセットし、マスクパターンにより圧縮符号を抽出する。抽出した圧縮符号を、１パス（１枝分のアクセス）で２m分枝の無節点ハフマン木Ｈ２の根から探索する。そして、アクセスした葉Ｌ♯の構造体に格納されている文字コードを読み出して伸長バッファ３２１２に格納する。
【０１７１】
圧縮符号を抽出するため、マスクパターンのマスク位置をオフセットする。また、マスクパターンの初期値を“０ｘＦＦＦ０００００”とする。このマスクパターンは先頭１２ビットが“１”であり、後続の２０ビットが“０”のビット列である。
【０１７２】
ＣＰＵ４０１はビットアドレスａｂｉとバイトオフセットｂｙｏｓとビットオフセットｂｉｏｓとを算出する。ビットアドレスａｂｉは、抽出された圧縮符号のビット位置を示す値であり、今回のビットアドレスａｂｉは、前回のビットアドレスａｂｉに前回抽出された圧縮符号の圧縮符号長ｌｅｇを加算した値となる。なお、初期状態では、ビットアドレスａｂｉはａｂｉ＝０とする。
【０１７３】
バイトオフセットｂｙｏｓは、メモリに保持されている圧縮符号列のバイト境界を示す値であり、ビットアドレスａｂｉ／８の商で求められる。たとえば、バイトオフセットｂｙｏｓ＝０のときは、メモリに記憶されている先頭からの圧縮符号列をレジスタにセットし、バイトオフセットｂｙｏｓ＝１のときは、メモリに記憶されている先頭１バイト目からの圧縮符号列をレジスタにセットする。
【０１７４】
また、ビットオフセットｂｉｏｓは、マスクパターンのマスク位置（“ＦＦＦ”）をオフセットする値であり、ビットアドレスａｂｉ／８の余りである。たとえば、ビットオフセットｂｉｏｓ＝０のときは、マスク位置はシフトされないこととなり、マスクパターンは、“０ｘＦＦＦ０００００”となる。一方、ビットオフセットｂｉｏｓ＝４のときは、マスク位置は末尾方向に４ビットシフトすることとなり、マスクパターンは、“０ｘ０ＦＦＦ００００”となる。
【０１７５】
レジスタシフト数ｒｓは、マスクパターンとのＡＮＤ演算後のレジスタ内の圧縮符号列を末尾方向にシフトするビット数であり、ｒｓ＝３２−１２−ｂｉｏｓで求められる。このシフトにより、シフト後のレジスタの末尾ｍビットのビット列を対象ビット列として抽出する。対象ビット列の抽出後はレジスタをクリアする。
【０１７６】
なお、図３９−１〜図３９−５において、メモリには図３４に示した圧縮符号列が保持されているものとする。また、図３９−１〜図３９−５のメモリ内のブロックは１バイトのビット列を示しており、内部の数字は、バイト境界となるバイト位置を示している。
【０１７７】
図３９−１は、初期状態（（Ａ）の状態）を示している。（Ａ）では、ビットアドレスａｂｉ＝０により、バイトオフセットｂｙｏｓ＝０、ビットオフセットｂｉｏｓ＝０となる。バイトオフセットｂｙｏｓ＝０により、メモリに保持されている圧縮符号列のうち先頭から４バイト分（図中、網掛け）の圧縮符号列をレジスタにセットする。
【０１７８】
また、ビットオフセットｂｉｏｓ＝０により、マスクパターンは、“０ｘＦＦＦ０００００”である。したがって、レジスタにセットされた圧縮符号列とマスクパターン “０ｘＦＦＦ０００００”を論理積（ＡＮＤ）演算することにより、ＡＮＤ結果が得られる。
【０１７９】
また、ビットオフセットｂｉｏｓ＝０により、レジスタシフト数ｒｓは、ｒｓ＝３２−ｍ―ｂｉｏｓ＝３２−１２−０＝２０となる。したがって、レジスタ内のＡＮＤ結果を末尾方向に２０ビット分シフトする。このシフトによりレジスタには、“１１０００１００１１００”が残されるため、末尾１２ビットを対象ビット列として抽出する。この場合は、“１１０００１００１１００”が対象ビット列として抽出される。抽出後、レジスタはクリアされる。
【０１８０】
図２７に示したように、無節点ハフマン木Ｈ２の根の構造体セルＣ（１，１）には、葉Ｌ１〜Ｌ１２９５へのポインタが格納されている。したがって、無節点ハフマン木Ｈ２の根の構造体セルＣ（１，１）の中から、抽出された対象ビット列“１１０００１００１１００”と一致する葉Ｌ♯へのポインタ（枝番号）を探索する。この場合、葉Ｌ３４２１へのポインタ群の中の１つと一致するため、該当する葉Ｌ３４２１へのポインタを読み出して、葉Ｌ３４２１の構造体にアクセスする。
【０１８１】
葉Ｌ３４２１の構造体には、文字コード“０ｘ２１６Ｂ”（文字：「次」に相当）が格納されているため、当該文字コード“０ｘ２１６Ｂ”を抽出して伸長バッファ３２１２に格納する。また、葉Ｌ３４２１の構造体には、文字コード“０ｘ２１６Ｂ”の圧縮符号長ｌｅｇ（＝１２ビット）も格納されているため、文字コード“０ｘ２１６Ｂ”の圧縮符号長ｌｅｇも抽出する。この抽出された圧縮符号長ｌｅｇによりビットアドレスａｂｉを更新する。この場合、更新後のビットアドレスａｂｉはａｂｉ＝０＋１２＝１２となる。
【０１８２】
図３９−２は、図３９−１に示した（Ａ）の状態からレジスタをバイトオフセットｂｉｏｓ分シフトした場合の伸長処理（（Ｂ）の状態）を示している。前回である（Ａ）のビットアドレスａｂｉはａｂｉ＝０、圧縮符号長ｌｅｇは１２ビットであるため、（Ｂ）のビットアドレスａｂｉはａｂｉ＝１２ビットとなる。
【０１８３】
また、このビットアドレスａｂｉ＝１２により、バイトオフセットｂｙｏｓ＝１、ビットオフセットｂｉｏｓ＝４となる。バイトオフセットｂｙｏｓ＝１により、メモリに保持されている圧縮符号列のうち先頭１バイト目から４バイト分（図中、網掛け）の圧縮符号列をレジスタにセットする。
【０１８４】
また、ビットオフセットｂｉｏｓ＝４により、マスクパターンは、“０ｘ０ＦＦＦ００００”である。したがって、レジスタにセットされた圧縮符号列とマスクパターン“０ｘ０ＦＦＦ００００”を論理積（ＡＮＤ）演算することにより、ＡＮＤ結果が得られる。
【０１８５】
また、ビットオフセットｂｉｏｓ＝４により、レジスタシフト数ｒｓは、ｒｓ＝３２−ｍ―ｂｉｏｓ＝３２−１２−４＝１６となる。したがって、レジスタ内のＡＮＤ結果を末尾方向に１６ビット分シフトする。このシフトによりレジスタには、“０００００１０００１００１０１０”が残されるため、末尾１２ビットを対象ビット列として抽出する。この場合は、“０１０００１００１０１０”が対象ビット列として抽出される。抽出後、レジスタはクリアされる。
【０１８６】
図２７に示したように、無節点ハフマン木Ｈ２の根の構造体セルＣ（１，１）には、葉Ｌ１〜Ｌ１２９５へのポインタが格納されている。したがって、無節点ハフマン木Ｈ２の根の構造体セルＣ（１，１）の中から、抽出された対象ビット列“０１０００１００１０１０”と一致する葉Ｌ♯へのポインタ（枝番号）を探索する。この場合、対象ビット列“０１０００１００１０１０”が葉Ｌ２４へのポインタ群の中の１つと一致するため、該当する葉Ｌ２４へのポインタを読み出して、葉Ｌ２４の構造体にアクセスする。
【０１８７】
葉Ｌ２４の構造体には、文字コード“０ｘ６Ｅ３０”（文字：「の」に相当）が格納されているため、当該文字コード“０ｘ６Ｅ３０”を抽出して伸長バッファ３２１２に格納する。また、葉Ｌ２４の構造体には、文字コード“０ｘ６Ｅ３０”の圧縮符号長ｌｅｇ（＝８ビット）も格納されているため、文字コード“０ｘ６Ｅ３０”の圧縮符号長ｌｅｇも抽出する。この抽出された圧縮符号長ｌｅｇによりビットアドレスａｂｉを更新する。この場合、更新後のビットアドレスａｂｉはａｂｉ＝１２＋８＝２０となる。
【０１８８】
図３９−３は、図３９−２に示した（Ｂ）の状態からレジスタをバイトオフセットｂｉｏｓ分シフトした場合の伸長処理（（Ｃ）の状態）を示している。前回である（Ｂ）のビットアドレスａｂｉはａｂｉ＝１２、圧縮符号長ｌｅｇは８ビットであるため、（Ｃ）のビットアドレスａｂｉはａｂｉ＝２０ビットとなる。
【０１８９】
また、このビットアドレスａｂｉ＝２０により、バイトオフセットｂｙｏｓ＝２、ビットオフセットｂｉｏｓ＝４となる。バイトオフセットｂｙｏｓ＝２により、メモリに保持されている圧縮符号列のうち先頭２バイト目から４バイト分（図中、網掛け）の圧縮符号列をレジスタにセットする。
【０１９０】
また、ビットオフセットｂｉｏｓ＝４により、マスクパターンは、“０ｘ０ＦＦＦ００００”である。したがって、レジスタにセットされた圧縮符号列とマスクパターン“０ｘ０ＦＦＦ００００”を論理積（ＡＮＤ）演算することにより、ＡＮＤ結果が得られる。
【０１９１】
また、ビットオフセットｂｉｏｓ＝４により、レジスタシフト数ｒｓは、ｒｓ＝３２−ｍ―ｂｉｏｓ＝３２−１２−４＝１６となる。したがって、レジスタ内のＡＮＤ結果を末尾方向に１６ビット分シフトする。このシフトによりレジスタには、“００００１０１００１００００００”が残されるため、末尾１２ビットを対象ビット列として抽出する。この場合は、“１０１００１００００００”が対象ビット列として抽出される。抽出後、レジスタはクリアされる。
【０１９２】
図２７に示したように、無節点ハフマン木Ｈ２の根の構造体セルＣ（１，１）には、葉Ｌ１〜Ｌ１２９５へのポインタが格納されている。したがって、無節点ハフマン木Ｈ２の根の構造体セルＣ（１，１）の中から、抽出された対象ビット列“１０１００１００００００”と一致する葉Ｌ♯へのポインタ（枝番号）を探索する。この場合、対象ビット列“１０１００１００００００”が葉Ｌ１６７へのポインタ群の中の１つと一致するため、該当する葉Ｌ１６７へのポインタを読み出して、葉Ｌ２４の構造体にアクセスする。
【０１９３】
葉Ｌ１６７の構造体には、分割文字コード“０ｘ５１”が格納されているため、当該文字コード“０ｘ５１”を抽出して伸長バッファ３２１２に格納する。また、葉Ｌ１６７の構造体には、文字コード“０ｘ５１”の圧縮符号長ｌｅｇ（＝１２ビット）も格納されているため、文字コード“０ｘ５１”の圧縮符号長ｌｅｇも抽出する。この抽出された圧縮符号長ｌｅｇによりビットアドレスａｂｉを更新する。この場合、更新後のビットアドレスａｂｉはａｂｉ＝２０＋１２＝３２となる。
【０１９４】
図３９−４は、図３９−３に示した（Ｃ）の状態からレジスタをバイトオフセットｂｉｏｓ分シフトした場合の伸長処理（（Ｄ）の状態）を示している。前回である（Ｃ）のビットアドレスａｂｉはａｂｉ＝２０、圧縮符号長ｌｅｇは１２ビットであるため、（Ｃ）のビットアドレスａｂｉはａｂｉ＝３２ビットとなる。
【０１９５】
また、このビットアドレスａｂｉ＝３２により、バイトオフセットｂｙｏｓ＝４、ビットオフセットｂｉｏｓ＝０となる。バイトオフセットｂｙｏｓ＝４により、メモリに保持されている圧縮符号列のうち先頭４バイト目から４バイト分（図中、網掛け）の圧縮符号列をレジスタにセットする。
【０１９６】
また、ビットオフセットｂｉｏｓ＝０により、マスクパターンは、“０ｘＦＦＦ０００００”である。したがって、レジスタにセットされた圧縮符号列とマスクパターン“０ｘＦＦＦ０００００”を論理積（ＡＮＤ）演算することにより、ＡＮＤ結果が得られる。
【０１９７】
また、ビットオフセットｂｉｏｓ＝０により、レジスタシフト数ｒｓは、ｒｓ＝３２−ｍ―ｂｉｏｓ＝３２−１２−０＝２０となる。したがって、レジスタ内のＡＮＤ結果を末尾方向に２０ビット分シフトする。このシフトによりレジスタには、“１０１０００１１０１０１”が残されるため、末尾１２ビットを対象ビット列として抽出する。この場合は、“１０１０００１１０１０１”が対象ビット列として抽出される。抽出後、レジスタはクリアされる。
【０１９８】
図２７に示したように、無節点ハフマン木Ｈ２の根の構造体セルＣ（１，１）には、葉Ｌ１〜Ｌ１２９５へのポインタが格納されている。したがって、無節点ハフマン木Ｈ２の根の構造体セルＣ（１，１）の中から、抽出された対象ビット列“１０１００１００００００”と一致する葉Ｌ♯へのポインタ（枝番号）を探索する。この場合、対象ビット列“１０１００１００００００”が葉Ｌ１５６へのポインタと一致するため、葉Ｌ１５６へのポインタを読み出して、葉Ｌ１５６の構造体にアクセスする。
【０１９９】
葉Ｌ１５６の構造体には、分割文字コード“０ｘ４Ｅ”が格納されているため、当該文字コード“０ｘ４Ｅ”を抽出して伸長バッファ３２１２に格納する。また、葉Ｌ１５６の構造体には、文字コード“０ｘ４Ｅ”の圧縮符号長ｌｅｇ（＝１２ビット）も格納されているため、文字コード“０ｘ４Ｅ”の圧縮符号長ｌｅｇも抽出する。この抽出された圧縮符号長ｌｅｇによりビットアドレスａｂｉを更新する。この場合、更新後のビットアドレスａｂｉはａｂｉ＝３２＋１２＝４４となる。
【０２００】
図３９−５は、図３９−４に示した（Ｄ）の状態からレジスタをバイトオフセットｂｉｏｓ分シフトした場合の伸長処理（（Ｅ）の状態）を示している。前回である（Ｄ）のビットアドレスａｂｉはａｂｉ＝３２、圧縮符号長ｌｅｇは１２ビットであるため、（Ｅ）のビットアドレスａｂｉはａｂｉ＝４４ビットとなる。
【０２０１】
また、このビットアドレスａｂｉ＝４４により、バイトオフセットｂｙｏｓ＝５、ビットオフセットｂｉｏｓ＝４となる。バイトオフセットｂｙｏｓ＝５により、メモリに保持されている圧縮符号列のうち先頭５バイト目から４バイト分（図中、網掛け）の圧縮符号列をレジスタにセットする。
【０２０２】
また、ビットオフセットｂｉｏｓ＝４により、マスクパターンは、“０ｘ０ＦＦＦ００００”である。したがって、レジスタにセットされた圧縮符号列とマスクパターン“０ｘ０ＦＦＦ００００”を論理積（ＡＮＤ）演算することにより、ＡＮＤ結果が得られる。
【０２０３】
また、ビットオフセットｂｉｏｓ＝４により、レジスタシフト数ｒｓは、ｒｓ＝３２−ｍ―ｂｉｏｓ＝３２−１２−４＝１６となる。したがって、レジスタ内のＡＮＤ結果を末尾方向に１６ビット分シフトする。このシフトによりレジスタには、“０００００１１１１０１１１１１１”が残されるため、末尾１２ビットを対象ビット列として抽出する。この場合は、“０１１１１０１１１１１１”が対象ビット列として抽出される。抽出後、レジスタはクリアされる。
【０２０４】
図２７に示したように、無節点ハフマン木Ｈ２の根の構造体セルＣ（１，１）には、葉Ｌ１〜Ｌ１２９５へのポインタが格納されている。したがって、無節点ハフマン木Ｈ２の根の構造体セルＣ（１，１）の中から、抽出された対象ビット列“０１１１１０１１１１１１”と一致する葉Ｌ♯へのポインタ（枝番号）を探索する。この場合、対象ビット列“０１１１１０１１１１１１”が葉Ｌ２０００へのポインタと一致するため、葉Ｌ２０００へのポインタを読み出して、葉Ｌ２０００の構造体にアクセスする。
【０２０５】
葉Ｌ２０００の構造体には、文字コード“０ｘ６Ｆ３０”が格納されているため、当該文字コード“０ｘ６Ｆ３０”を抽出して伸長バッファ３２１２に格納する。また、葉Ｌ２０００の構造体には、文字コード“０ｘ６Ｆ３０”の圧縮符号長ｌｅｇ（＝８ビット）も格納されているため、文字コード“０ｘ６Ｆ３０”の圧縮符号長ｌｅｇも抽出する。この抽出された圧縮符号長ｌｅｇによりビットアドレスａｂｉを更新する。この場合、更新後のビットアドレスａｂｉはａｂｉ＝４４＋８＝５２となる。
【０２０６】
＜伸長処理手順＞
図４０および図４１は、情報処理装置５００が自動実行する無節点ハフマン木を用いた伸長処理手順を示すフローチャートである。図４０において、まず、ビットアドレスａｂｉをａｂｉ＝０とし（ステップＳ４００１）、バイトオフセットｂｙｏｓを算出し（ステップＳ４００２）、ビットオフセットｂｉｏｓを算出する（ステップＳ４００３）。そして、バイトオフセットｂｙｏｓの位置からの圧縮符号列をレジスタにセットする（ステップＳ４００４）。
【０２０７】
つぎに、マスクパターン“０ｘＦＦＦ０００００”をビットオフセットｂｉｏｓ分、末尾方向にシフトして（ステップＳ４００５）、レジスタにセットされた圧縮符号列とのＡＮＤ演算をおこなう（ステップＳ４００６）。このあと、レジスタシフト数ｒｓを算出して（ステップＳ４００７）、ＡＮＤ演算後のレジスタをレジスタシフト数ｒｓ分、末尾にシフトする（ステップＳ４００８）。
【０２０８】
ステップＳ４００８のあと、図４１において、シフト後のレジスタから末尾ｍ（ｍ＝１２）ビットを対象ビット列として抽出する（ステップＳ４１０１）。つぎに、無節点ハフマン木Ｈ２の根の構造体セルＣ（１，１）から枝番号となる葉Ｌ♯へのポインタを特定し（ステップＳ４１０２）、ポイント先となる葉Ｌ♯の構造体に１パスでアクセスする（ステップＳ４１０３）。そして、アクセス先の葉Ｌ♯の構造体から文字コードを抽出し（ステップＳ４１０４）、抽出された文字コードを伸長バッファ３２１２に書き込む（ステップＳ４１０５）。
【０２０９】
また、葉Ｌ♯の構造体から圧縮符号長ｌｅｇを抽出し（ステップＳ４１０６）、ビットアドレスａｂｉを更新する（ステップＳ４１０７）。このあと、メモリに圧縮符号列があるか否か、具体的には、マスクパターンによるマスク処理が施されていない圧縮符号列があるか否かを判断する（ステップＳ４１０８）。たとえば、バイトオフセットｂｙｏｓに該当するバイト位置があるか否かにより判断する。圧縮符号列がある場合（ステップＳ４１０８：Ｙｅｓ）、図４０のステップＳ４００２に戻る。一方、圧縮符号列がない場合（ステップＳ４１０８：Ｎｏ）、一連の伸長処理を終了する。
【０２１０】
このような伸長処理により、圧縮符号列からｍビット単位で圧縮符号を抽出することができ、さらに、無節点ハフマン木Ｈ２の根の構造体セルＣ（１，１）にアクセスすることで、該当する枝番号となる葉Ｌ♯へのポインタを特定することができる。そして、アクセス先となる葉Ｌ♯の構造体から文字コードを抽出することで、圧縮符号を伸長する。このように、無節点ハフマン木Ｈ２は、内部節点を有していないため、葉Ｌ♯へのポインタが特定されれば、１パスで葉Ｌ♯の構造体にアクセスすることができ、伸長速度の高速化を図ることができる。
【０２１１】
以上説明したように、本実施の形態によれば、文字種を約１３００に削減することで省メモリ化を図ることができる。また、文字種の削減により、無節点ハフマン木Ｈ２を生成することができる。この無節点ハフマン木Ｈ２を用いて圧縮伸長をおこなうことにより、１２ビット（つまり、１文字）をまとめて１回で判定することができ、伸長の高速化を実現することができる。
【０２１２】
なお、本実施の形態で説明した情報処理方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。このプログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。またこのプログラムは、インターネット等のネットワークを介して配布することが可能な媒体であってもよい。
【０２１３】
上述した実施の形態に関し、さらに以下の付記を開示する。
【０２１４】
（付記１）コンピュータを、
節点の階層数がｋ階層（ｋはｋ≧２の自然数）、節点からその下位節点への枝数が２n本（ｎはｎ≧２の自然数）、第ｉ階層（ｉは１≦ｉ≦ｋの自然数）の節点数が２n(i-1)であり、前記各節点が上位節点へのポインタを格納しており、かつ、葉または下位節点への２n個のポインタを格納可能な節点集合を記憶する記憶手段、
対象ファイルに記述されている文字コードの出現頻度の集計結果を取得する取得手段、
前記取得手段によって取得された集計結果に基づいて、前記文字コードを出現確率Ｐ（Ｐは１／２ni≦Ｐ＜１／２n(i-1)。ただし、ｉ＝１のときは１／２ni≦Ｐ＜１、ｉ＝ｎのときはＰ＜１／２n(i-1)）に応じて階層別に分類する分類手段、
前記分類手段によって分類された前記第ｉ階層の文字コード数に基づいて、前記第ｉ階層の葉へのポインタ数を算出するとともに、当該第ｉ階層の葉へのポインタ数に基づいて、（ｉ＋１）階層の節点をリンク先とする前記第ｉ階層の下位節点へのポインタ数と前記第ｉ階層の節点の使用数とを算出する算出手段、
前記算出手段によって算出された算出結果に基づいて、２n分枝ハフマン木を生成する２n分枝ハフマン木生成手段、
前記２n分枝ハフマン木生成手段によって生成された２n分枝ハフマン木を、２m分枝（ただし、ｍ＝ｎ×ｋ）の無節点ハフマン木に変換して、前記記憶手段に記憶する変換手段、
として機能させることを特徴とする情報処理プログラム。
【０２１５】
（付記２）前記２n分枝ハフマン木生成手段は、
前記算出手段によって算出された算出結果に基づいて、前記第ｉ階層の葉へのポインタと前記第ｉ階層の下位節点へのポインタを生成するポインタ生成手段、
前記第ｉ階層の使用数分の節点に、前記ポインタ生成手段によって生成された前記第ｉ階層の葉へのポインタと前記第ｉ階層の下位節点へのポインタとを格納するポインタ格納手段、
前記分類手段によって分類された前記第ｉ階層の文字ごとに、前記ポインタ格納手段によって前記第ｉ階層の節点に格納された葉へのポインタにより前記第ｉ階層の節点のリンク先となる葉を、前記文字コードごとに生成する葉生成手段、
前記葉生成手段によって生成された葉に、当該葉の番号に対応付けられた文字コードを格納することにより、２n分枝ハフマン木を生成する文字コード格納手段を備えることを特徴とする付記１に記載の情報処理プログラム。
【０２１６】
（付記３）前記コンピュータを、
前記２n分枝ハフマン木において前記第ｉ階層の葉へのポインタ数と第（ｉ−１）階層の空き節点内の空きポインタ数とを検出する検出手段、
前記検出手段によって検出された前記第ｉ階層の葉へのポインタ数と第（ｉ−１）階層の空き節点内の空きポインタ数とに基づいて、前記第ｉ階層から前記第（ｉ−１）階層の空き節点への移動対象となる前記第ｉ階層の葉へのポインタ（以下、「移動対象ポインタ」という）を特定する特定手段、
前記特定手段によって特定された移動対象ポインタを格納する節点へのポインタを前記第（ｉ−１）階層の節点から削除し、前記移動対象ポインタを前記第（ｉ−１）階層の節点に移動させる最適化手段として機能させ、
前記変換手段は、
前記最適化手段によって最適化された２n分枝ハフマン木を、前記２m分枝の無節点ハフマン木に変換して、前記記憶手段に記憶することを特徴とする付記２に記載の情報処理プログラム。
【０２１７】
（付記４）前記変換手段は、
前記２n分枝ハフマン木の階層数と前記第ｉ階層の葉の数に基づいて、前記第ｉ階層の葉ごとに葉へのポインタの種類数を決定する決定手段と、
前記２n分枝ハフマン木の葉を複製する複製手段と、
２m個の葉へのポインタを格納可能な根を生成して、前記記憶手段に格納する根生成手段と、
前記決定手段によって決定された種類数に基づいて、前記複製手段によって複製された葉ごとに当該葉へのポインタを生成して、前記根生成手段によって生成された根に格納する第１の構築手段と、
前記葉に対する当該葉へのポインタ群に共通のビット列からなる圧縮符号を抽出し、当該圧縮符号およびその圧縮符号長を前記葉に格納して前記葉を再構築することにより、前記根および前記葉からなる無節点ハフマン木を生成する第２の構築手段と、
を備えることを特徴とする付記１〜３のいずれか一つに記載の情報処理プログラム。
【０２１８】
（付記５）前記コンピュータを、
前記文字コードを出現頻度の降順にソートするソート手段、
前記ソート手段によってソートされた結果、前記文字コードのうち前記出現頻度の高位の文字コードと低位の文字コードとに分け、前記低位の文字コードを上位ビットコードと下位ビットコードに分割する分割手段、
前記分割手段によって分割された上位ビットコードおよび下位ビットコードの出現頻度を集計する集計手段として機能させ、
前記分類手段は、
前記高位の文字コードの集計結果と前記集計手段によって集計された集計結果とに基づいて、前記文字コードを出現確率Ｐに応じて階層別に分類することを特徴とする付記１〜４のいずれか一つに記載の情報処理プログラム。
【０２１９】
（付記６）前記コンピュータを、
圧縮対象文字コード列を設定する文字コード設定手段、
前記文字コード設定手段によって設定された圧縮対象文字コード列の中から圧縮対象文字コードを取り出して、前記無節点ハフマン木の葉の中から前記圧縮対象文字コードを含む葉を特定し、特定された葉の中から圧縮符号を抽出するハフマン木探索手段、
前記ハフマン木探索手段によって抽出された圧縮符号を所定の記憶領域に格納する圧縮符号格納手段、
として機能させることを特徴とする付記１〜４のいずれか一つに記載の情報処理プログラム。
【０２２０】
（付記７）前記コンピュータを、
前記文字コードごとに、前記文字コードと当該文字コードを格納する葉へのポインタとからなる文字構造体を生成して、前記記憶手段に記憶する文字構造体生成手段、
前記文字構造体生成手段によって生成された文字構造体を探索することにより、前記圧縮対象文字コードを格納する葉へのポインタを抽出する圧縮対象文字コード探索手段として機能させ、
前記ハフマン木探索手段は、
前記圧縮対象文字コード探索手段によって抽出された葉へのポインタにより前記無節点ハフマン木の該当する葉にアクセスし、アクセス先の葉の中から圧縮符号を抽出することを特徴とする付記６に記載の情報処理プログラム。
【０２２１】
（付記８）前記コンピュータを、
前記高位の文字コードごとに、前記文字コードと当該文字コードを格納する葉へのポインタとからなる第１の文字構造体を生成するとともに、前記上位ビットコードおよび前記下位ビットコードごとに、前記ビットコードと当該ビットコードを格納する葉へのポインタとからなる第２の文字構造体を生成して、前記記憶手段に記憶する文字構造体生成手段、
圧縮対象文字コード列を設定する文字コード設定手段、
前記文字構造体生成手段によって生成された第１の文字構造体を探索することにより、前記圧縮対象文字コードを格納する葉へのポインタを抽出する圧縮対象文字コード探索手段、
前記圧縮対象文字コード探索手段によって抽出された葉へのポインタにより前記無節点ハフマン木の該当する葉にアクセスし、アクセス先の葉の中から圧縮符号を抽出するハフマン木探索手段、
前記ハフマン木探索手段によって抽出された圧縮符号を所定の記憶領域に格納する圧縮符号格納手段、
として機能させることを特徴とする付記５に記載の情報処理プログラム。
【０２２２】
（付記９）前記分割手段は、
前記ハフマン木探索手段によって前記第１の文字構造体の中から前記圧縮対象文字コードに該当する文字コードが探索されなかった場合、前記圧縮対象文字コードを圧縮対象上位ビットコードと圧縮対象下位ビットコードに分割し、
前記圧縮対象文字コード探索手段は、
前記分割手段によって前記圧縮対象文字コードが前記圧縮対象上位ビットコードと前記圧縮対象下位ビットコードに分割された場合、前記文字構造体生成手段によって生成された第２の文字構造体を探索することにより、前記圧縮対象上位ビットコードを格納する葉へのポインタを抽出するとともに、前記圧縮対象下位ビットコードを格納する葉へのポインタを抽出し、
前記ハフマン木探索手段は、
前記圧縮対象文字コード探索手段によって抽出された前記圧縮対象上位ビットコードを格納する葉へのポインタを読み出して前記無節点ハフマン木の該当する葉にアクセスし、アクセス先の葉の中から前記圧縮対象上位ビットコードの圧縮符号を抽出するとともに、前記圧縮対象下位ビットコードを格納する葉へのポインタを読み出して前記無節点ハフマン木の該当する葉にアクセスし、アクセス先の葉の中から前記圧縮対象下位ビットコードの圧縮符号を抽出し、
前記圧縮符号格納手段は、
前記ハフマン木探索手段によって抽出された前記圧縮対象上位ビットコードの圧縮符号を前記所定の記憶領域に格納するとともに、前記ハフマン木探索手段によって抽出された前記圧縮対象下位ビットコードの圧縮符号を前記所定の記憶領域に格納することを特徴とする付記８に記載の情報処理プログラム。
【０２２３】
（付記１０）前記コンピュータを、
圧縮符号列を設定する圧縮符号列設定手段、
前記圧縮符号列設定手段によって設定された圧縮符号列の中からｍビットの圧縮符号を順次抽出する抽出手段、
前記抽出手段によって抽出された圧縮符号を用いて、前記無節点ハフマン木の根から探索するハフマン木探索手段、
前記ハフマン木探索手段によって探索された葉に格納されている文字コードを抽出して、前記所定の記憶領域に格納する伸長コード格納手段、
として機能させることを特徴とする付記６〜９のいずれか一つに記載の情報処理プログラム。
【０２２４】
（付記１１）節点の階層数がｋ階層（ｋはｋ≧２の自然数）、節点からその下位節点への枝数が２n本（ｎはｎ≧２の自然数）、第ｉ階層（ｉは１≦ｉ≦ｋの自然数）の節点数が２n(i-1)であり、前記各節点が上位節点へのポインタを格納しており、かつ、葉または下位節点への２n個のポインタを格納可能な節点集合を記憶する記憶手段と、
対象ファイルに記述されている２nビットの文字コードの出現頻度の集計結果を取得する取得手段と、
前記取得手段によって取得された集計結果に基づいて、前記文字コードを出現確率Ｐ（Ｐは１／２ni≦Ｐ＜１／２n(i-1)。ただし、ｉ＝１のときは１／２ni≦Ｐ＜１、ｉ＝ｎのときはＰ＜１／２n(i-1)）に応じて階層別に分類する分類手段と、
前記分類手段によって分類された前記第ｉ階層の文字コード数に基づいて、前記第ｉ階層の葉へのポインタ数を算出するとともに、当該第ｉ階層の葉へのポインタ数に基づいて、（ｉ＋１）階層の節点をリンク先とする前記第ｉ階層の下位節点へのポインタ数と前記第ｉ階層の節点の使用数とを算出する算出手段と、
前記算出手段によって算出された算出結果に基づいて、２n分枝ハフマン木を生成する２n分枝ハフマン木生成手段と、
前記２n分枝ハフマン木生成手段によって生成された２n分枝ハフマン木を、２m分枝（ただし、ｍ＝ｎ×ｋ）の無節点ハフマン木に変換して、前記記憶手段に記憶する変換手段と、
を備えることを特徴とする情報処理装置。
【０２２５】
（付記１２）節点の階層数がｋ階層（ｋはｋ≧２の自然数）、節点からその下位節点への枝数が２n本（ｎはｎ≧２の自然数）、第ｉ階層（ｉは１≦ｉ≦ｋの自然数）の節点数が２n(i-1)であり、前記各節点が上位節点へのポインタを格納しており、かつ、葉または下位節点への２n個のポインタを格納可能な節点集合を記憶する記憶手段を備える情報処理装置が、
対象ファイルに記述されている文字コードの出現頻度の集計結果を取得する取得工程と、
前記取得工程によって取得された集計結果に基づいて、前記文字コードを出現確率Ｐ（Ｐは１／２ni≦Ｐ＜１／２n(i-1)。ただし、ｉ＝１のときは１／２ni≦Ｐ＜１、ｉ＝ｎのときはＰ＜１／２n(i-1)）に応じて階層別に分類する分類工程と、
前記分類手段によって分類された前記第ｉ階層の文字コード数に基づいて、前記第ｉ階層の葉へのポインタ数を算出するとともに、当該第ｉ階層の葉へのポインタ数に基づいて、（ｉ＋１）階層の節点をリンク先とする前記第ｉ階層の下位節点へのポインタ数と前記第ｉ階層の節点の使用数とを算出する算出工程と、
前記算出手段によって算出された算出結果に基づいて、２n分枝ハフマン木を生成する２n分枝ハフマン木生成工程と、
前記２n分枝ハフマン木生成手段によって生成された２n分枝ハフマン木を、２m分枝（ただし、ｍ＝ｎ×ｋ）の無節点ハフマン木に変換して、前記記憶手段に記憶する変換工程と、
を実行することを特徴とする情報処理方法。
【図面の簡単な説明】
【０２２６】
【図１】２n（１６）分枝ハフマン木の生成元となる節点集合体を示す説明図である。
【図２】２n（１６）分枝ハフマン木を示す説明図である。
【図３】圧縮前処理を示す説明図である。
【図４】実施の形態にかかる情報処理装置のハードウェア構成を示すブロック図である。
【図５】実施の形態にかかる情報処理装置の機能的構成１を示すブロック図である。
【図６】文字出現頻度集計テーブルを示す説明図である。
【図７】予約語出現頻度集計テーブルを示す説明図である。
【図８】文字コードおよび予約語の出現頻度を統合した集計結果テーブルを示す説明図である。
【図９】分割文字コード出現頻度集計テーブルを示す説明図である。
【図１０】算出部による算出結果テーブルを示す説明図である。
【図１１】２n（１６）分枝ハフマン木の構造体を示す説明図である。
【図１２】２n分枝ハフマン木の構造体を示す説明図である。
【図１３−１】第４階層から第３階層へ最適化する場合の算出結果テーブルの更新例を示す説明図である。
【図１３−２】第３階層から第２階層へ最適化する場合の算出結果テーブルの更新例を示す説明図である。
【図１３−３】第２階層から第１階層へ最適化する場合の算出結果テーブルの更新例を示す説明図である。
【図１４】最適化後の２n分枝ハフマン木の構造体を示す説明図である。
【図１５】最適化後の２n分枝ハフマン木における葉の構造体が格納する情報を示す説明図である。
【図１６】予約語の構造体を示す説明図である。
【図１７】高位文字コードの構造体を示す説明図である。
【図１８】分割文字コードの構造体を示す説明図である。
【図１９】情報処理装置が自動実行する２n分枝ハフマン木生成処理手順を示すフローチャートである。
【図２０】図２０は、図１９に示した葉数削減処理（ステップＳ１９０３）の詳細な処理手順を示すフローチャートである。
【図２１】図１９に示したパラメータ算出処理（ステップＳ１９０５）の詳細な処理手順を示すフローチャートである。
【図２２】図１９に示した構造体セル構築処理（ステップＳ１９０６）の詳細な処理手順を示すフローチャートである。
【図２３】図２２に示した第ｉ階層の構造体セルＣ（ｉ，ｊ）の構築処理（ステップＳ２２０４）の詳細な処理手順を示すフローチャート（前半）である。
【図２４】図２２に示した第ｉ階層の構造体セルＣ（ｉ，ｊ）の構築処理（ステップＳ２２０４）の詳細な処理手順を示すフローチャート（後半）である。
【図２５】図１９に示した最適化処理（ステップＳ１９０７）の詳細な処理手順を示すフローチャートである。
【図２６】２m（４０９６）分枝の無節点ハフマン木を示す説明図である。
【図２７】無節点ハフマン木の節点（根）の構造体を示す説明図である。
【図２８】無節点ハフマン木の葉の構造体を示す説明図である。
【図２９】葉の構造体に格納される情報を示す説明図である。
【図３０】実施の形態にかかる情報処理装置の機能的構成２を示すブロック図である。
【図３１】情報処理装置が自動実行する２n分枝ハフマン木→２m分枝無節点ハフマン木変換処理手順を示すフローチャートである。
【図３２】実施の形態にかかる情報処理装置の機能的構成３を示すブロック図である。
【図３３】圧縮対象文字コード列の一例を示す説明図である。
【図３４】圧縮符号列の一例を示す説明図である。
【図３５】圧縮処理の具体例を示す説明図である。
【図３６】情報処理装置が自動実行する無節点ハフマン木を用いた圧縮処理手順を示すフローチャート（その１）である。
【図３７】情報処理装置が自動実行する無節点ハフマン木を用いた圧縮処理手順を示すフローチャート（その２）である。
【図３８】情報処理装置が自動実行する無節点ハフマン木を用いた圧縮処理手順を示すフローチャート（その３）である。
【図３９−１】無節点ハフマン木を用いた伸長処理の具体例（その１）を示す説明図である。
【図３９−２】無節点ハフマン木を用いた伸長処理の具体例（その２）を示す説明図である。
【図３９−３】無節点ハフマン木を用いた伸長処理の具体例（その３）を示す説明図である。
【図３９−４】無節点ハフマン木を用いた伸長処理の具体例（その４）を示す説明図である。
【図３９−５】無節点ハフマン木を用いた伸長処理の具体例（その５）を示す説明図である。
【図４０】情報処理装置が自動実行する無節点ハフマン木を用いた伸長処理手順を示すフローチャート（前半）である。
【図４１】情報処理装置が自動実行する無節点ハフマン木を用いた伸長処理手順を示すフローチャート（後半）である。
【符号の説明】
【０２２７】
１００  節点集合体
３００  対象ファイル
５００  情報処理装置
５０１  入力部
５０２  取得部
５０３  集計部
５０４  ソート部
５０５  分割部
５０６  分類部
５０７  算出部
５０８  ポインタ生成部
５０９  ポインタ格納部
５１０  葉生成部
５１１  文字コード格納部
５１２  検出部
５１３  特定部
５１４  最適化部
５１５  文字構造体生成部
５２０  算出結果テーブル
５３０  文字構造体
３００１  決定部
３００２  複製部
３００３  根生成部
３００４  第１の構築部
３００５  第２の構築部
３２０１  設定部
３２０２  圧縮対象文字コード探索部
３２０４  ハフマン木探索部
３２０５  圧縮符号格納部
３２０６  抽出部
３２０７  伸長コード格納部
３２１０  記憶部
３２１１  圧縮バッファ
３２１２  伸長バッファ
【図１】
2010093414.tif 000003
【図２】
2010093414.tif 000004
【図３】
2010093414.tif 000005
【図４】
2010093414.tif 000006
【図５】
2010093414.tif 000007
【図６】
2010093414.tif 000008
【図７】
2010093414.tif 000009
【図８】
2010093414.tif 000010
【図９】
2010093414.tif 000011
【図１０】
2010093414.tif 000012
【図１１】
2010093414.tif 000013
【図１２】
2010093414.tif 000014
【図１３−１】
2010093414.tif 000015
【図１３−２】
2010093414.tif 000016
【図１３−３】
2010093414.tif 000017
【図１４】
2010093414.tif 000018
【図１５】
2010093414.tif 000019
【図１６】
2010093414.tif 000020
【図１７】
2010093414.tif 000021
【図１８】
2010093414.tif 000022
【図１９】
2010093414.tif 000023
【図２０】
2010093414.tif 000024
【図２１】
2010093414.tif 000025
【図２２】
2010093414.tif 000026
【図２３】
2010093414.tif 000027
【図２４】
2010093414.tif 000028
【図２５】
2010093414.tif 000029
【図２６】
2010093414.tif 000030
【図２７】
2010093414.tif 000031
【図２８】
2010093414.tif 000032
【図２９】
2010093414.tif 000033
【図３０】
2010093414.tif 000034
【図３１】
2010093414.tif 000035
【図３２】
2010093414.tif 000036
【図３３】
2010093414.tif 000037
【図３４】
2010093414.tif 000038
【図３５】
2010093414.tif 000039
【図３６】
2010093414.tif 000040
【図３７】
2010093414.tif 000041
【図３８】
2010093414.tif 000042
【図３９−１】
2010093414.tif 000043
【図３９−２】
2010093414.tif 000044
【図３９−３】
2010093414.tif 000045
【図３９−４】
2010093414.tif 000046
【図３９−５】
2010093414.tif 000047
【図４０】
2010093414.tif 000048
【図４１】
2010093414.tif 000049