(57)【特許請求の範囲】
【請求項１】
分節木のデータ構造であって、前記分節木を構成する複数のノードそれぞれが、
特定の文字または文字列に対応する符号を保持する第１の領域と、
前記特定の文字または文字列の次に入力文字列において出現する文字の出現順番を複数の文字それぞれについて保持する第２の領域と、
前記特定の文字または文字列の次に前記入力文字列において出現した文字の出現回数が特定の閾値を超えていない場合は前記出現回数を、前記出現回数が前記特定の閾値を超えた場合は前記特定の文字または文字列と前記特定の文字または文字列の次に前記入力文字列において出現した文字とからなる文字列に対応して生成される符号を、前記特定の文字または文字列の次に前記入力文字列において出現した文字の出現順番に応じて保持する第３の領域と、
を有することを特徴とする文節木のデータ構造。
【請求項２】
特定の文字または文字列に対応する符号を保持する第１の領域と、前記特定の文字または文字列の次に入力文字列において出現する文字の出現順番を複数の文字それぞれについて保持する第２の領域と、前記特定の文字または文字列の次に前記入力文字列において出現した文字の出現回数が特定の閾値を超えていない場合は前記出現回数を、前記出現回数が前記特定の閾値を超えた場合は前記特定の文字または文字列と前記特定の文字または文字列の次に前記入力文字列において出現した文字とからなる文字列に対応して生成される符号を、前記特定の文字または文字列の次に前記入力文字列において出現した文字の出現順番に応じて保持する第３の領域とを含むデータブロックを、前記複数の文字それぞれについて生成し、
前記入力文字列において着目する文字または文字列についてのデータブロックの第２の領域において前記入力文字列において前記着目する文字または文字列の次に出現した文字についての出現順番が保持されており且つ第３の領域において当該出現順番のデータとして出現回数が保持されており且つ当該出現回数が今回前記特定の閾値を超えることになることを検出すると、前記第３の領域において当該出現順番のデータとして、前記着目する文字または文字列と前記次に出現した文字とからなる第２の文字列に対応して生成された符号を格納し、
前記第２の文字列についてのデータブロックを生成する
処理をコンピュータに実行させるためのプログラム。
【請求項３】
前記入力文字列において前記着目する文字または文字列についてのデータブロックの第２の領域において、前記入力文字列において前記着目する文字または文字列の次に出現した文字についての出現順番が保持されており且つ第３の領域において当該出現順番のデータとして出現回数が保持されており且つ当該出現回数を増分しても前記特定の閾値を超えないことを検出すると、前記次に出現した文字を、着目する文字に設定する
処理をさらに前記コンピュータに実行させるための請求項２記載のプログラム。
【請求項４】
前記入力文字列において前記着目する文字または文字列についてのデータブロックの第２の領域において、前記入力文字列において前記着目する文字又は文字列の次に出現した文字についての出現順番が保持されており且つ第３の領域において当該出現順番のデータとして前記着目する文字または文字列と前記次に出現した文字とからなる第２の文字列に対応する符号が保持されていることを検出すると、当該第２の文字列を、着目する文字列に設定する
処理をさらに前記コンピュータに実行させるための請求項２又は３記載のプログラム。
【請求項５】
前記第３の領域が、所定出現順番までの領域に限定されており、
前記データブロックが、前記第３の領域の拡張領域を示すデータを保持する第４の領域をさらに含む、
請求項２乃至４のいずれか１つ記載のプログラム。
【請求項６】
前記入力文字列について生成された複数のデータブロックから、当該複数のデータブロックの各データブロックについて当該データブロックの第１の領域に保持されている符号及び第３の領域に保持されている符号を当該符号に対応する文字または文字列のコードに基づき第２の符号に付与し直した状態における複数のデータブロックで表される木構造における第１階層の各データブロックについては最上位階層を表すデータと当該データブロックの第１の領域に保持されている第２の符号に対応する文字のコードとを対応付ける第１の対応付けデータと、前記状態における複数のデータブロックで表される木構造における第２階層以降の各データブロックについては当該データブロックの親データブロックの第１の領域に保持されている第２の符号と当該データブロックで追加された文字のコードとを対応付ける第２の対応付けデータとを含むデータを生成する生成処理
をさらに前記コンピュータに実行させるための請求項２乃至５のいずれか１つ記載のプログラム。
【請求項７】
前記第１の対応付けデータ及び前記第２の対応付けデータにおいて、
当該データブロックについて第３の領域において保持されている最も大きい第２の符号がさらに対応付けられている
請求項６記載のプログラム。
【請求項８】
特定の文字または文字列に対応する符号を保持する第１の領域と、前記特定の文字または文字列の次に入力文字列において出現する文字の出現順番を複数の文字それぞれについて保持する第２の領域と、前記特定の文字または文字列の次に前記入力文字列において出現した文字の出現回数が特定の閾値を超えていない場合は前記出現回数を、前記出現回数が前記特定の閾値を超えた場合は前記特定の文字または文字列と前記特定の文字または文字列の次に前記入力文字列において出現した文字とからなる文字列に対応して生成される符号を、前記特定の文字または文字列の次に前記入力文字列において出現した文字の出現順番に応じて保持する第３の領域とを含むデータブロックを、前記複数の文字それぞれについてと、当該データブロックが生成された、前記入力文字列内の文字または文字列の次に前記特定の閾値以上の回数出現する文字とについて生成する第１生成処理と、
前記第１生成処理により生成された複数のデータブロックから、当該複数のデータブロックの各データブロックについて当該データブロックの第１の領域に保持されている符号及び第３の領域に保持されている符号を当該符号に対応する文字または文字列のコードに基づき第２の符号に付与し直した状態における複数のデータブロックで表される木構造の第１階層の各データブロックについては最上位階層を表すデータ又は当該データブロックについて第３の領域に保持されている最も大きい第２の符号と当該データブロックの第１の領域に保持されている第２の符号に対応する文字のコードと階層番号とを対応付ける第１の対応付けデータと、前記状態における複数のデータブロックで表される木構造の第２階層以降の各データブロックについては当該データブロックの親データブロックの第１の領域に保持されている第２の符号又は当該データブロックについて第３の領域に保持されている最も大きい第２の符号と当該データブロックで追加された文字のコードと階層番号とを対応付ける第２の対応付けデータとを含むデータを生成する第２生成処理と、
前記状態における複数のデータブロックで表される木構造の第２階層以降の各階層に属する各データブロックの第１の領域に保持されている第２の符号に対応する文字列のコードを含む第１のデータを生成する第３生成処理と、
前記状態における複数のデータブロックで表される木構造の第２階層以降の各階層について当該階層内のデータブロック数と当該階層内のデータブロックの第１の領域に保持されている最小の第２の符号と前記第１のデータにおいて当該最小の第２の符号に対応する文字列の配置位置の、先頭からのオフセット値とを対応付ける階層情報を生成する第４生成処理と、
をコンピュータに実行させるためのプログラム。
【請求項９】
特定の文字または文字列に対応する符号を保持する第１の領域と、前記特定の文字または文字列の次に入力文字列において出現する文字の出現順番を複数の文字それぞれについて保持する第２の領域と、前記特定の文字または文字列の次に前記入力文字列において出現した文字の出現回数が特定の閾値を超えていない場合は前記出現回数を、前記出現回数が前記特定の閾値を超えた場合は前記特定の文字または文字列と前記特定の文字または文字列の次に前記入力文字列において出現した文字とからなる文字列に対応して生成される符号を、前記特定の文字または文字列の次に前記入力文字列において出現した文字の出現順番に応じて保持する第３の領域とを含むデータブロックを、前記複数の文字それぞれについて生成し、
前記入力文字列において着目する文字または文字列についてのデータブロックの第２の領域において前記入力文字列において前記着目する文字または文字列の次に出現した文字についての出現順番が保持されており且つ第３の領域において当該出現順番のデータとして出現回数が保持されており且つ当該出現回数が今回前記特定の閾値を超えることになることを検出すると、前記第３の領域において当該出現順番のデータとして、前記着目する文字または文字列と前記次に出現した文字とからなる第２の文字列に対応して生成された符号を格納し、
前記第２の文字列についてのデータブロックを生成する
処理をコンピュータが実行する情報処理方法。
【請求項１０】
特定の文字または文字列に対応する符号を保持する第１の領域と、前記特定の文字または文字列の次に入力文字列において出現する文字の出現順番を複数の文字それぞれについて保持する第２の領域と、前記特定の文字または文字列の次に前記入力文字列において出現した文字の出現回数が特定の閾値を超えていない場合は前記出現回数を、前記出現回数が前記特定の閾値を超えた場合は前記特定の文字または文字列と前記特定の文字または文字列の次に前記入力文字列において出現した文字とからなる文字列に対応して生成される符号を、前記特定の文字または文字列の次に前記入力文字列において出現した文字の出現順番に応じて保持する第３の領域とを含むデータブロックを、前記複数の文字それぞれについて生成する手段と、
前記入力文字列において着目する文字または文字列についてのデータブロックの第２の領域において前記入力文字列において前記着目する文字または文字列の次に出現した文字についての出現順番が保持されており且つ第３の領域において当該出現順番のデータとして出現回数が保持されており且つ当該出現回数が今回前記特定の閾値を超えることになることを検出すると、前記第３の領域において当該出現順番のデータとして、前記着目する文字または文字列と前記次に出現した文字とからなる第２の文字列に対応して生成された符号を格納する手段と、
前記第２の文字列についてのデータブロックを生成する手段と、
を有する情報処理装置。
【請求項１１】
特定の文字または文字列に対応する符号を保持する第１の領域と、前記特定の文字または文字列の次に入力文字列において出現する文字の出現順番を複数の文字それぞれについて保持する第２の領域と、前記特定の文字または文字列の次に前記入力文字列において出現した文字の出現回数が特定の閾値を超えていない場合は前記出現回数を、前記出現回数が前記特定の閾値を超えた場合は前記特定の文字または文字列と前記特定の文字または文字列の次に前記入力文字列において出現した文字とからなる文字列に対応して生成される符号を、前記特定の文字または文字列の次に前記入力文字列において出現した文字の出現順番に応じて保持する第３の領域とを含むデータブロックを、前記複数の文字それぞれと、当該データブロックが生成された、前記入力文字列内の文字または文字列の次に前記特定の閾値以上の回数出現する文字とについて生成する第１生成処理と、
前記第１生成処理により生成された複数のデータブロックから、当該複数のデータブロックの各データブロックについて当該データブロックの第１の領域に保持されている符号及び第３の領域に保持されている符号を当該符号に対応する文字または文字列のコードに基づき第２の符号に付与し直した状態における複数のデータブロックで表される木構造の第１階層の各データブロックについては最上位階層を表すデータ又は当該データブロックについて第３の領域に保持されている最も大きい第２の符号と当該データブロックの第１の領域に保持されている第２の符号に対応する文字のコードと階層番号とを対応付ける第１の対応付けデータと、前記状態における複数のデータブロックで表される木構造の第２階層以降の各データブロックについては当該データブロックの親データブロックの第１の領域に保持されている第２の符号又は当該データブロックについて第３の領域に保持されている最も大きい第２の符号と当該データブロックで追加された文字のコードと階層番号とを対応付ける第２の対応付けデータとを含むデータを生成する第２生成処理と、
前記状態における複数のデータブロックで表される木構造の第２階層以降の各階層に属する各データブロックの第１の領域に保持されている第２の符号に対応する文字列のコードを含む第１のデータを生成する第３生成処理と、
前記状態における複数のデータブロックで表される木構造の第２階層以降の各階層について当該階層内のデータブロック数と当該階層内のデータブロックの第１の領域に保持されている最小の第２の符号と前記第１のデータにおいて当該最小の第２の符号に対応する文字列の配置位置の、先頭からのオフセット値とを対応付ける階層情報を生成する第４生成処理と、
をコンピュータが実行する情報処理方法。
【請求項１２】
特定の文字または文字列に対応する符号を保持する第１の領域と、前記特定の文字または文字列の次に入力文字列において出現する文字の出現順番を複数の文字それぞれについて保持する第２の領域と、前記特定の文字または文字列の次に前記入力文字列において出現した文字の出現回数が特定の閾値を超えていない場合は前記出現回数を、前記出現回数が前記特定の閾値を超えた場合は前記特定の文字または文字列と前記特定の文字または文字列の次に前記入力文字列において出現した文字とからなる文字列に対応して生成される符号を、前記特定の文字または文字列の次に前記入力文字列において出現した文字の出現順番に応じて保持する第３の領域とを含むデータブロックを、前記複数の文字それぞれと、当該データブロックが生成された、前記入力文字列内の文字または文字列の次に前記特定の閾値以上の回数出現する文字とについて生成する手段と、
生成された複数のデータブロックから、当該複数のデータブロックの各データブロックについて当該データブロックの第１の領域に保持されている符号及び第３の領域に保持されている符号を当該符号に対応する文字または文字列のコードに基づき第２の符号に付与し直した状態における複数のデータブロックで表される木構造の第１階層の各データブロックについては最上位階層を表すデータ又は当該データブロックについて第３の領域に保持されている最も大きい第２の符号と当該データブロックの第１の領域に保持されている第２の符号に対応する文字のコードと階層番号とを対応付ける第１の対応付けデータと、前記状態における複数のデータブロックで表される木構造の第２階層以降の各データブロックについては当該データブロックの親データブロックの第１の領域に保持されている第２の符号又は当該データブロックについて第３の領域に保持されている最も大きい第２の符号と当該データブロックで追加された文字のコードと階層番号とを対応付ける第２の対応付けデータとを含むデータを生成する手段と、
前記状態における複数のデータブロックで表される木構造の第２階層以降の各階層に属する各データブロックの第１の領域に保持されている第２の符号に対応する文字列のコードを含む第１のデータを生成する手段と、
前記状態における複数のデータブロックで表される木構造の第２階層以降の各階層について当該階層内のデータブロック数と当該階層内のデータブロックの第１の領域に保持されている最小の第２の符号と前記第１のデータにおいて当該最小の第２の符号に対応する文字列の配置位置の、先頭からのオフセット値とを対応付ける階層情報を生成する手段と、
を有する情報処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本技術は、符号化技術に関する。
【背景技術】
【０００２】
従来技術では、入力文字列の圧縮を行うために文節木を生成する。この文節木の各ノードは、文字又は文字列と置き換える符号と、圧縮される文字と、階層を表すデータと、親ノードポインタと、使用される可能性がある各文字に対応する子ノードへのポインタと、各子ノードに対応する文字が出現する回数を計数するカウンタとを含む。例えば入力文字列「ABABCABCABCCBCBCBCAAACBACBACBBCCBB」が入力された場合、図１に示すような文節木が生成される。なお、新たなノードを生成するための出現回数の閾値は２である。この例では、第０階層のノードとしてルートノードが設けられており、第１階層のノードとして文字「０ｘ００」乃至「０ｘＦＦ」についてのノードが設けられている。第２階層のノードとして、文字「０ｘ４１」の子ノードとして文字「０ｘ４２」及び「０ｘ４１」についてのノードと、文字「０ｘ４２」の子ノードとして文字「０ｘ４３」についてのノードと、文字「０ｘ４３」の子ノードとして文字「０ｘ４２」についてのノードとが設けられている。さらに、第３階層のノードとして、文字「０ｘ４２」の子ノードとして文字「０ｘ４３」についてのノードと、文字「０ｘ４２」の子ノードとして文字「０ｘ４３」「０ｘ４１」及び「０ｘ４２」についてのノードとが設けられている。なお、各ノードについては、符号（Ａ）と、文字（Ｂ）と、子ノードについての文字の出現回数（Ｃ）と、子ノードへのポインタ（Ｄ）とを模式的に示している。
【０００３】
図２に示すように子ノードポインタと子ノードについての文字の出現回数とが、使用可能な文字種２５６個分となるので、１つのノードで３０８５バイトのメモリ容量が消費されることになる。仮に符号長２バイトで表現できる最大数６５５３６個のノードが設けられるとすると、合計で約１９２Ｍバイトメモリ容量が消費される。
【０００４】
文節木は文字列を置き換える符号の種類（すなわちノード数）が多いほど、多様なデータを圧縮することができる。しかし、符号の種類がこのように多くなるとノード数も多くなり、文節木全体のサイズが大きくなってしまう。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０１１−２２１８４５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
従って、本技術の目的は、一側面において、文節木を表すデータ構造のためのメモリ容量を削減するための技術を提供することである。
【課題を解決するための手段】
【０００７】
本技術の第１の態様に係る文節木のデータ構造は、分節木のデータ構造であって、（Ａ）分節木を構成する複数のノードそれぞれが、特定の文字または文字列に対応する符号を保持する第１の領域と、（Ｂ）特定の文字または文字列の次に入力文字列において出現する文字の出現順番を複数の文字それぞれについて保持する第２の領域と、（Ｃ）特定の文字または文字列の次に入力文字列において出現した文字の出現回数が特定の閾値を超えていない場合は上記出現回数を、出現回数が特定の閾値を超えた場合は特定の文字または文字列と特定の文字または文字列の次に入力文字列において出現した文字とからなる文字列に対応して生成される符号を、特定の文字または文字列の次に入力文字列において出現した文字の出現順番に応じて保持する第３の領域とを有する。
【０００８】
本技術の第２の態様に係るデータ構造は、文節木に対応する第１のデータと、文節木の各ノードに対応する文字又は文字列についての第２のデータと、文節木の階層についての第３のデータとを有する。また、第１のデータにおいて、文節木の各ノードについて、当該ノードの親ノードの符号又は当該ノードの子ノードの符号のうち最大の符号と、当該ノードで表される文字のコードと、当該ノードが所属する階層とを対応付けるデータが、各ノードの符号の順番に並べられている。第２のデータは、文節木の第２階層以降の各階層の各ノードについて当該ノードに対応する文字又は文字列のコードを当該ノードの符号の順に含む。さらに、第３のデータは、文節木の第２階層以降の各階層について、当該階層に属するノードの数と、当該階層に属するノードの符号のうち最小の符号と、第２のデータにおいて当該最小の符号に対応する文字又は文字列の配置位置の、先頭からのオフセット値とを対応付けるデータを含む。
【発明の効果】
【０００９】
文節木を表すデータ構造のためのメモリ容量を削減できるようになる。
【図面の簡単な説明】
【００１０】
【図１】図１は、従来例の文節木を表すデータ構造の一例を模式的に示す図である。
【図２】図２は、従来例の使用メモリ量の一例を示す図である。
【図３】図３は、第１の実施の形態に係る文節木の１ノード分のデータ構造を示す図である。
【図４】図４は、拡張カウンタ兼子ノード番号の配列の一例を示す図である。
【図５】図５は、実施の形態に係る情報処理装置の機能ブロック図である。
【図６】図６は、実施の形態に係るメインの処理フローを示す図である。
【図７】図７は、文節木生成処理の処理フローを示す図である。
【図８】図８は、文節木のデータの生成処理を説明するための図である。
【図９】図９は、文節木のデータの生成処理を説明するための図である。
【図１０】図１０は、文節木のデータの生成処理を説明するための図である。
【図１１】図１１は、文節木のデータの生成処理を説明するための図である。
【図１２】図１２は、文節木のデータの生成処理を説明するための図である。
【図１３】図１３は、文節木のデータの生成処理を説明するための図である。
【図１４】図１４は、文節木のデータの生成処理を説明するための図である。
【図１５】図１５は、文節木のデータの生成処理を説明するための図である。
【図１６】図１６は、文節木のデータの生成処理を説明するための図である。
【図１７】図１７は、文節木のデータの生成処理を説明するための図である。
【図１８】図１８は、文節木のデータの生成処理を説明するための図である。
【図１９】図１９は、文節木のデータの生成処理を説明するための図である。
【図２０Ａ】図２０Ａは、文節木のデータの生成処理を説明するための図である。
【図２０Ｂ】図２０Ｂは、文節木のデータの生成処理を説明するための図である。
【図２０Ｃ】図２０Ｃは、文節木のデータの生成処理を説明するための図である。
【図２０Ｄ】図２０Ｄは、文節木のデータの生成処理を説明するための図である。
【図２０Ｅ】図２０Ｅは、文節木のデータの生成処理を説明するための図である。
【図２０Ｆ】図２０Ｆは、文節木のデータの生成処理を説明するための図である。
【図２１】図２１は、文節木のデータの生成処理を説明するための図である。
【図２２Ａ】図２２Ａは、文節木のデータの生成処理を説明するための図である。
【図２２Ｂ】図２２Ｂは、文節木のデータの生成処理を説明するための図である。
【図２３】図２３は、文節木のデータの生成処理を説明するための図である。
【図２４Ａ】図２４Ａは、文節木のデータの生成処理を説明するための図である。
【図２４Ｂ】図２４Ｂは、文節木のデータの生成処理を説明するための図である。
【図２４Ｃ】図２４Ｃは、文節木のデータの生成処理を説明するための図である。
【図２４Ｄ】図２４Ｄは、文節木のデータの生成処理を説明するための図である。
【図２４Ｅ】図２４Ｅは、文節木のデータの生成処理を説明するための図である。
【図２４Ｆ】図２４Ｆは、文節木のデータの生成処理を説明するための図である。
【図２５】図２５は、文節木のデータの生成処理を説明するための図である。
【図２６Ａ】図２６Ａは、番号取得処理の処理フローを示す図である。
【図２６Ｂ】図２６Ｂは、配列設定処理の処理フローを示す図である。
【図２７】図２７は、カレントノード設定処理の処理フローを示す図である。
【図２８】図２８は、文節木の一例を示す図である。
【図２９】図２９は、ソート後の文節木の一例を示す図である。
【図３０】図３０は、圧縮マップを説明するための図である。
【図３１】図３１は、圧縮マップの生成を説明するための図である。
【図３２】図３２は、圧縮マップの生成処理を説明するための図である。
【図３３】図３３は、圧縮マップの生成処理を説明するための図である。
【図３４】図３４は、圧縮マップの生成処理を説明するための図である。
【図３５】図３５は、圧縮マップの生成処理を説明するための図である。
【図３６】図３６は、圧縮マップの生成処理を説明するための図である。
【図３７】図３７は、圧縮マップの生成処理を説明するための図である。
【図３８】図３８は、圧縮マップの生成処理を説明するための図である。
【図３９】図３９は、圧縮マップの生成処理を説明するための図である。
【図４０】図４０は、圧縮マップの生成処理を説明するための図である。
【図４１】図４１は、圧縮マップの生成処理を説明するための図である。
【図４２】図４２は、圧縮マップの生成処理を説明するための図である。
【図４３】図４３は、圧縮マップの生成処理を説明するための図である。
【図４４】図４４は、圧縮マップの生成処理を説明するための図である。
【図４５】図４５は、圧縮マップの生成処理を説明するための図である。
【図４６】図４６は、圧縮マップの生成処理を説明するための図である。
【図４７】図４７は、圧縮マップの生成処理を説明するための図である。
【図４８】図４８は、圧縮マップの生成処理を説明するための図である。
【図４９】図４９は、圧縮マップの生成処理を説明するための図である。
【図５０】図５０は、圧縮マップの生成処理を説明するための図である。
【図５１】図５１は、圧縮マップ生成処理の処理フローを示す図である。
【図５２】図５２は、エントリ追加処理の処理フローを示す図である。
【図５３】図５３は、圧縮処理の処理フローを示す図である。
【図５４】図５４は、圧縮マップの一例を示す図である。
【図５５】図５５は、圧縮処理を説明するための図である。
【図５６】図５６は、伸張処理の処理フローを示す図である。
【図５７】図５７は、伸張処理を説明するための図である。
【図５８】図５８は、文節木のデータ構造を用いて圧縮する場合の処理を説明するための図である。
【図５９】図５９は、文節木のデータ構造を用いて圧縮する場合の処理を説明するための図である。
【図６０】図６０は、文節木のデータ構造を用いて圧縮する場合の処理を説明するための図である。
【図６１】図６１は、文節木のデータ構造を用いて圧縮する場合の処理を説明するための図である。
【図６２】図６２は、文節木のデータ構造を用いて伸張する場合の処理を説明するための図である。
【図６３】図６３は、文節木のデータ構造を用いて伸張する場合の処理を説明するための図である。
【図６４】図６４は、文節木のデータ構造を用いて伸張する場合の処理を説明するための図である。
【図６５】図６５は、文節木のデータ構造を用いて伸張する場合の処理を説明するための図である。
【図６６】図６６は、文節木のデータ構造を用いて伸張する場合の処理を説明するための図である。
【図６７】図６７は、第２の実施の形態を説明するための文節木を表す図である。
【図６８】図６８は、第２の実施の形態における圧縮マップの模式図である。
【図６９】図６９は、第２の実施の形態におけるエントリ追加処理２の処理フローを示す図である。
【図７０】図７０は、第２の実施の形態における圧縮処理２の処理フローを示す図である。
【図７１】図７１は、第２の実施の形態における圧縮マップの一例を示す図である。
【図７２】図７２は、第３の実施の形態における圧縮マップの一例を示す図である。
【図７３】図７３は、第３の実施の形態における階層情報の一例を示す図である。
【図７４】図７４は、第３の実施の形態における伸張マップの一例を示す図である。
【図７５】図７５は、第３の実施の形態における圧縮マップ生成処理２の処理フローを示す図である。
【図７６】図７６は、第３の実施の形態におけるエントリ追加処理３の処理フローを示す図である。
【図７７】図７７は、第３の実施の形態における設定処理の処理フローを示す図である。
【図７８】図７８は、第３の実施の形態における圧縮処理３の処理フローを示す図である。
【図７９】図７９は、第３の実施の形態における伸張処理２の処理フローを示す図である。
【図８０】図８０は、伸張処理２を説明するための図である。
【図８１】図８１は、第４の実施の形態における圧縮マップの一例を示す図である。
【図８２】図８２は、第４の実施の形態における階層情報の一例を示す図である。
【図８３】図８３は、第４の実施の形態における伸張マップの一例を示す図である。
【図８４】図８４は、第４の実施の形態における圧縮マップ生成処理３の処理フローを示す図である。
【図８５】図８５は、第４の実施の形態におけるエントリ追加処理４の処理フローを示す図である。
【図８６】図８６は、第４の実施の形態における設定処理２の処理フローを示す図である。
【図８７】図８７は、第４の実施の形態における圧縮処理４の処理フローを示す図である。
【図８８】図８８は、第４の実施の形態における伸張処理３の処理フローを示す図である。
【図８９】図８９は、コンピュータの機能ブロック図である。
【発明を実施するための形態】
【００１１】
［実施の形態１］
図３に本実施の形態に係る文節木におけるノード１つ分のデータ構造を示す。ノードのデータブロックは、符号（ＩＤＸ）の領域と、文字出現番号の配列の領域と、カウンタ兼子ノード番号の配列の領域と、スパンド番号の領域と、文字出現数の領域とを含む。また、これとは別に、拡張カウンタ兼子ノード番号の配列数をカウントするための領域を有する。
【００１２】
文字出現番号の領域は、本ノードの符号に対応する文字又は文字列の次に出現する各文字（０ｘ００乃至０ｘＦＦまでの各文字）について出現順番を保持する配列である。但し、文字出現数が２５６の場合以外「ＦＦ」は未使用を表す。また、他の値は、カウンタ兼子ノード番号の配列番号を表す。例えば、文字「０ｘ４１（Ａ）」のノードについて着目し、文節木を生成するための文字列が「ＡＢＡＡＣ」である場合、最初の「Ａ」の次にまず出現した文字はＢ（０ｘ４２）なので、文字出現番号の領域０ｘ４２番目に「０」が設定され、次の「Ａ」の次に出現した文字はＡなので、文字出現番号の領域０ｘ４１番目に「１」が設定され、次の「Ａ」の次に出現した文字はＣなので、文字出現番号の領域０ｘ４３番目に「２」が設定される。
【００１３】
カウンタ兼子ノード番号の配列には、出現順番に従って出現回数（カウンタ）又は子ノード番号（「０ｘ」が付された番号）が格納される。上で述べた例では、「０」番目に文字「０ｘ４２」についての子ノード番号（符号）「０ｘ０１００」が格納され、「１」番目に文字「０ｘ４１」についての子ノード番号（符号）「０ｘ０１０４」が格納され、「２」番目に文字「０ｘ０４３」についての出現回数「１」が格納されている。本実施の形態では、カウンタ兼子ノード番号の領域には、８つの出現回数又は子ノード番号しか格納できない。８つを超える出現回数又は子ノード番号を保持する場合には、拡張カウンタ兼子ノード番号の配列の番号をスパンド番号の領域に設定する。スパンド番号の初期値は「０ｘＦＦＦＦ」である。
【００１４】
拡張カウンタ兼子ノード番号の配列は、どのノードからも参照される共通領域に設けられる。図４に示すように、この配列も１つで８つの出現回数又は子ノード番号を保持できるようになっており、最後にこの配列でも不足する場合に参照すべき拡張カウンタ兼子ノード番号の配列の番号（拡張スパンド番号）が設定されるようになっている。
【００１５】
文字出現数の領域には、本ノードに対応する文字又は文字列の次に出現した文字の数が設定される。上で述べた例では「Ｂ」「Ａ」「Ｃ」の３文字出現したので「３」が設定される。
【００１６】
このように、デフォルトで特定できる子ノードの数を限定して必ずしも用いない子ノードへのポインタの領域を削減している。また、親ノードへのポインタも有していないので、メモリ使用量が削減されている。
【００１７】
本実施の形態では、このような文節木を生成する処理、このような文節木からディスクに格納するためのデータ構造である圧縮マップを生成する処理、圧縮マップを用いた圧縮処理及び伸張処理、並びにこれらの処理を実施する装置などについて説明する。
【００１８】
本実施の形態に係る情報処理装置１００の機能ブロック図を図５に示す。情報処理装置１００は、文節木生成部１１０と、圧縮マップ生成部１２０と、データ格納部１３０と、圧縮処理部１４０と、伸張処理部１５０と、入出力部１６０とを有する。
【００１９】
文節木生成部１１０は、例えば入出力部１６０から入力された文節木生成のための入力文字列に対して処理を行って本実施の形態に係る文節木のデータを生成する。圧縮マップ生成部１２０は、文節木生成部１１０が生成した文節木のデータから圧縮マップを生成して、データ格納部１３０に格納する。
【００２０】
圧縮処理部１４０は、データ格納部１３０に格納されている圧縮マップを用いて例えば入出力部１６０から入力された圧縮対象の入力文字列に対して圧縮処理を実施して、圧縮結果をデータ格納部１３０に格納する。伸張処理部１５０は、データ格納部１３０に格納されている圧縮マップを用いて、例えばデータ格納部１３０に格納されている圧縮結果に対して伸張処理を実施し、伸張結果をデータ格納部１３０に格納する。入出力部１６０は、伸張結果を表示装置などの出力装置又は他のコンピュータなどに出力する場合もある。
【００２１】
次に、図６乃至図６６を用いて情報処理装置１００の処理内容について説明する。まず、文節木生成部１１０は、入力文字列に対して文節木生成処理を実施する（図６：ステップＳ１）。この文節木生成処理については図７乃至図２７を用いて詳細に説明する。また、圧縮マップ生成部１２０は、文節木生成部１１０によって生成された文節木から圧縮マップを生成する圧縮マップ生成処理を実施し、データ格納部１３０に格納する（ステップＳ３）。圧縮マップ生成処理については図２８乃至図５２を用いて詳細に説明する。
【００２２】
その後、例えば入出力部１６０から圧縮対象の入力文字列が入力されると、圧縮処理部１４０は、圧縮マップを用いて圧縮処理を実施し、圧縮結果をデータ格納部１３０に格納する（ステップＳ５）。圧縮処理については図５３乃至図５５を用いて詳細に説明する。また、例えば入出力部１６０から指示されると、伸張処理部１５０は、例えばデータ格納部１３０に格納されている圧縮結果に対して、圧縮マップを用いて伸張処理を実施し、処理結果をデータ格納部１３０に格納する（ステップＳ７）。伸張処理については図５６及び図５７を用いて詳細に説明する。
【００２３】
次に、文節木生成処理について図７を用いて説明する。まず、文節木生成部１１０は、符号０ｘ００００乃至０ｘ００ＦＦのノードのデータを生成する（ステップＳ１１）。必ず設けられる第１階層のノードを初期設定として生成する。
【００２４】
そして、文節木生成部１１０は、入力文字列から入力文字を１バイト読み込み、そのノードをカレントノードに設定する（ステップＳ１３）。さらに、文節木生成部１１０は、入力文字列から次の入力文字を１バイト読み込む（ステップＳ１５）。そして、文節木生成部１１０は、次の入力文字が入力文字列の終端であるか判断する（ステップＳ１７）。次の入力文字が入力文字列の終端であれば、処理は呼出元の処理に戻る。
【００２５】
一方、次の入力文字が入力文字列の終端ではない場合には、文節木生成部１１０は、入力文字のコードを配列番号として用いて、カレントノードの文字出現番号の配列に格納されている値Ａを取得する（ステップＳ１８）。そして、文節木生成部１１０は、番号取得処理を実施する（ステップＳ１９）。この番号取得処理については、図２６Ａ及び図２６Ｂを用いて説明する。
【００２６】
その後、文節木生成部１１０は、カレントノード設定処理を実施する（ステップＳ２１）。カレントノード設定処理については、図２７を用いて説明する。その後処理はステップＳ１５に戻る。
【００２７】
番号取得処理及びカレントノード設定処理の詳細を述べる前に、処理内容を分かり易くするために、具体例について図８乃至図２５を用いて説明しておく。ここでは、「ABABCABCABCCBCBCBCAAACBACBACBBCCBBCBECBECBDCBDCBGCBGCBHCBHCBFCBFCBICBI」という文字列を入力する際の処理を説明する。また、文節木のデータ構造だけではなく、文節木の模式図をも併せて説明する。
【００２８】
ステップＳ１１では、模式的に示せば図８に示すように、第１階層として符号０ｘ０００１乃至０ｘ００ＦＦのノードが生成される。この例では主に符号「０ｘ００４１」「０ｘ００４２」「０ｘ００４３」のノード及びその子ノードが主な処理対象となるので、この部分のみが示されている。また、図９に示すようなデータ構造のデータブロックが生成される。このように、文字「０ｘ４１」に対応する符号「０ｘ００４１」についての図３に示したデータブロックと、文字「０ｘ４２」に対応する符号「０ｘ００４２」についての図３に示したデータブロックと、文字「０ｘ４３」に対応する符号「０ｘ００４３」についての図３に示したデータブロックとが生成される。この段階では設定される値は初期値である。
【００２９】
次に、入力文字列「ＡBABCABCABCCBCBCBCAAACBACBACBBCCBBCBECBECBDCBDCBGCBGCBHCBHCBFCBFCBICBI」の最初の「Ａ」を読み込み、対応する符号「０ｘ００４１」のノードをカレントノードに設定する。また、入力文字列「AＢABCABCABCCBCBCBCAAACBACBACBBCCBBCBECBECBDCBDCBGCBGCBHCBHCBFCBFCBICBI」の次の「Ｂ」を読み込む。そうすると、図１０に示すように、カレントノードの文字出現番号の配列において「０ｘ４２（Ｂ）」の値を参照すると「０ｘＦＦ」のため、文字出現番号＝出現順番＝０を設定する。また、文字出現数の値を「０」から「１」に更新する。さらに、カウンタ兼子ノード番号の配列において、出現順番「０」番目の値が「０ｘ０１００」より小さいので、出現回数「０」を１インクリメントして「１」を設定する。また、出現回数が閾値「２」に達していないので、カレントノードを文字「０ｘ４２」に対応する符号「０ｘ００４２」のノードに変更する。なお、新たなカレントノードを黒塗り三角形で表し、旧カレントノードを白抜き三角形で表す。
【００３０】
次に、入力文字列「ABＡBCABCABCCBCBCBCAAACBACBACBBCCBBCBECBECBDCBDCBGCBGCBHCBHCBFCBFCBICBI」の「Ａ」を読み込む。そうすると、図１１に示すように、カレントノードの文字出現番号の配列において「０ｘ４１（Ａ）」の値を参照すると「０ｘＦＦ」のため、文字出現番号＝出現順番＝０を設定する。また、文字出現数の値を「０」から「１」に更新する。さらに、カウンタ兼子ノード番号の配列において、出現順番「０」番目の値が「０ｘ０１００」より小さいので、出現回数「０」を１インクリメントして「１」を設定する。また、出現回数が閾値「２」に達していないので、カレントノードを文字「０ｘ４１」に対応する符号「０ｘ００４１」のノードに変更する。
【００３１】
さらに、入力文字列「ABAＢCABCABCCBCBCBCAAACBACBACBBCCBBCBECBECBDCBDCBGCBGCBHCBHCBFCBFCBICBI」の「Ｂ」を読み込む。そうすると、図１２に示すように、カレントノードの文字出現番号の配列において「０ｘ４２（Ｂ）」の値を参照すると出現順番「０」が得られる。そして、カウンタ兼子ノード番号の配列において、出現順番「０」番目の値が「０ｘ０１００」より小さいので、出現回数「１」を１インクリメントする。そうすると、閾値「２」に達するので、図１２に示すように、新規に符号「０ｘ０１００」の子ノードを生成し、カウンタ兼子ノード番号の配列の「０」番目に子ノードの符号「０ｘ０１００」を設定する。符号「０ｘ０１００」は「ＡＢ」に対応する符号となる。そして、カレントノードを符号「０ｘ０１００」の子ノードに設定する。文節木は、図８のような状態から、図１３に示す状態に変化する。
【００３２】
また、入力文字列「ABABＣABCABCCBCBCBCAAACBACBACBBCCBBCBECBECBDCBDCBGCBGCBHCBHCBFCBFCBICBI」の「Ｃ」を読み込む。そうすると、図１４に示すように、カレントノードの文字出現番号の配列において「０ｘ４３（Ｃ）」の値を参照すると「０ｘＦＦ」のため、文字出現番号＝出現順番＝０を設定する。また、文字出現数の値を「０」から「１」に更新する。さらに、カウンタ兼子ノード番号の配列において、出現順番「０」番目の値が「０ｘ０１００」より小さいので、出現回数「０」を１インクリメントして「１」を設定する。また、出現回数が閾値「２」に達していないので、カレントノードを文字「０ｘ４３」に対応する符号「０ｘ００４３」のノードに変更する。
【００３３】
さらに、入力文字列「ABABCＡBCABCCBCBCBCAAACBACBACBBCCBBCBECBECBDCBDCBGCBGCBHCBHCBFCBFCBICBI」の「Ａ」を読み込む。そうすると、図１５に示すように、カレントノードの文字出現番号の配列において「０ｘ４１（Ａ）」の値を参照すると「０ｘＦＦ」のため、文字出現番号＝出現順番＝０を設定する。また、文字出現数の値を「０」から「１」に更新する。さらに、カウンタ兼子ノード番号の配列において、出現順番「０」番目の値が「０ｘ０１００」より小さいので、出現回数「０」を１インクリメントして「１」を設定する。また、出現回数が閾値「２」に達していないので、カレントノードを文字「０ｘ４１」に対応する符号「０ｘ００４１」のノードに変更する。
【００３４】
さらに、入力文字列「ABABCAＢCABCCBCBCBCAAACBACBACBBCCBBCBECBECBDCBDCBGCBGCBHCBHCBFCBFCBICBI」の「Ｂ」を読み込む。そうすると、図１６に示すように、カレントノードの文字出現番号の配列において「０ｘ４２（Ｂ）」の値を参照すると「０」のため、カウンタ兼子ノード番号の配列において、出現順番「０」番目の値を参照する。そうすると符号「０ｘ０１００」が得られるので、カレントノードを符号「０ｘ０１００」のノードに変更する。
【００３５】
さらに、入力文字列「ABABCABＣABCCBCBCBCAAACBACBACBBCCBBCBECBECBDCBDCBGCBGCBHCBHCBFCBFCBICBI」の「Ｃ」を読み込む。そうすると、図１７に示すように、カレントノードの文字出現番号の配列において「０ｘ４３（Ｃ）」の値を参照すると出現順番「０」が得られる。そして、カウンタ兼子ノード番号の配列において、出現順番「０」番目の値が「０ｘ０１００」より小さいので、出現回数「１」を１インクリメントする。そうすると、閾値「２」に達するので、図１７に示すように、新規に符号「０ｘ０１０１」の子ノードを生成し、カウンタ兼子ノード番号の配列の「０」番目に子ノードの符号「０ｘ０１０１」を設定する。符号「０ｘ０１０１」は「ＡＢＣ」に対応する符号となる。そして、カレントノードを符号「０ｘ０１０１」の子ノードに設定する。文節木は、図１３のような状態から、図１８に示す状態に変化する。
【００３６】
さらに、入力文字列「ABABCABCＡBCCBCBCBCAAACBACBACBBCCBBCBECBECBDCBDCBGCBGCBHCBHCBFCBFCBICBI」の「Ａ」を読み込む。そうすると、図１９に示すように、カレントノードの文字出現番号の配列において「０ｘ４１（Ａ）」の値を参照すると「０ｘＦＦ」のため、文字出現番号＝出現順番＝０を設定する。また、文字出現数の値を「０」から「１」に更新する。さらに、カウンタ兼子ノード番号の配列において、出現順番「０」番目の値が「０ｘ０１００」より小さいので、出現回数「０」を１インクリメントして「１」を設定する。また、出現回数が閾値「２」に達していないので、カレントノードを文字「０ｘ４１」に対応する符号「０ｘ００４１」のノードに変更する。このような処理を繰り返して行く。
【００３７】
そして、入力文字列「ABABCABCABCCBCBCBCAAACBACBACBBCCBBCBECBECBDCBDCBGCBGCBHCBHCBFCBFCBＩCBI」の「Ｉ」を読み込む段階になったものとする。この時カレントノードは符号「０ｘ０１０２」のノードであり、図２０Ａ乃至図２０Ｆに示すように、カレントノードの文字出現番号の配列において「０ｘ４９（Ｉ）」の値を参照すると「０ｘＦＦ」であるため、文字出現番号＝出現順番「８」を設定する。また、文字出現数の値を「８」から「９」に更新する。さらに、カウンタ兼子ノード番号の配列において、出現順番「８」番目は、デフォルトの配列には入っていないので、拡張カウンタ兼子ノード番号の配列を参照することになる。ここでは拡張カウンタ兼子ノード番号の配列「０」を確保し、その配列において「０（＝８−８）」番目の値を参照する。この拡張カウンタ兼子ノード番号の配列「０」における出現順番「０」番目の値が「０ｘ０１００」より小さいので、出現回数「０」を１インクリメントして「１」を設定する。また、出現回数が閾値「２」に達していないので、カレントノードを文字「０ｘ４９」に対応する符号「０ｘ００４９」のノードに変更する。なお、この段階では文節木は図２１に示すような状態となっている。符号「０ｘ０１０２」の子ノード（第３階層のノード）が８つ既に生成されている。
【００３８】
その後、入力文字列「ABABCABCABCCBCBCBCAAACBACBACBBCCBBCBECBECBDCBDCBGCBGCBHCBHCBFCBFCBIＣBI」の「Ｃ」を読み込む。そうすると、図２２Ａ及び図２２Ｂに示すように、カレントノードの文字出現番号の配列において「０ｘ４３（Ｃ）」の値を参照すると出現順番「０」が得られる。そして、カウンタ兼子ノード番号の配列において、出現順番「０」番目の値が「０ｘ０１００」より小さいので、出現回数「０」を１インクリメントして「１」を設定する。また、出現回数が閾値「２」に達していないので、カレントノードを文字「０ｘ４３」に対応する符号「０ｘ００４３」のノードに変更する。
【００３９】
さらに、入力文字列「ABABCABCABCCBCBCBCAAACBACBACBBCCBBCBECBECBDCBDCBGCBGCBHCBHCBFCBFCBICＢI」の「Ｂ」を読み込む。そうすると、図２３に示すように、カレントノードの文字出現番号の配列において「０ｘ４２（Ｂ）」の値を参照すると「１」のため、カウンタ兼子ノード番号の配列において、出現順番「１」番目の値を参照する。そうすると符号「０ｘ０１０２」が得られるので、カレントノードを符号「０ｘ０１０２」のノードに変更する。
【００４０】
最後に、入力文字列「ABABCABCABCCBCBCBCAAACBACBACBBCCBBCBECBECBDCBDCBGCBGCBHCBHCBFCBFCBICBＩ」の「Ｉ」を読み込む。そうすると、図２４Ａ乃至図２４Ｆに示すように、カレントノードの文字出現番号の配列において「０ｘ４９（Ｉ）」の値を参照すると出現順番「８」が得られる。カウンタ兼子ノード番号の配列において、出現順番「８」番目は、デフォルトの配列には入っていないので、拡張カウンタ兼子ノード番号の配列を参照することになる。ここでは拡張カウンタ兼子ノード番号の配列「０」において「０（＝８−８）」番目の値を参照すると、「０ｘ０１００」より小さいので、出現回数「１」を１インクリメントする。そうすると、閾値「２」に達するので、図２４Ａ乃至図２４Ｆに示すように、新規に符号「０ｘ０１０Ｄ」の子ノードを生成し、カウンタ兼子ノード番号の配列の「０」番目に子ノードの符号「０ｘ０１０Ｄ」を設定する。符号「０ｘ０１０Ｄ」は「ＡＢＩ」に対応する符号となる。そして、カレントノードを符号「０ｘ０１０Ｄ」の子ノードに設定する。文節木は、図２３のような状態から、図２５に示す状態に変化する。このように、第２階層には４個、第３階層には１０個のノードを有する文節木が生成されるが、出現順番で子ノードを生成しているので、第２階層及び第３階層において、符号は、対応する文字のコード順には並べられていない。
【００４１】
このような処理を実施するための番号取得処理について、図２６Ａを用いて説明する。文節木生成部１１０は、値Ａが０ｘＦＦ且つ文字出現数が２５６ではないという条件を満たしているか判断する（ステップＳ３１）。この条件が満たされている場合には、今まで出現していなかった文字が出現したことになるので、文節木生成部１１０は、値Ａにカレントノードについての文字出現番号を設定し（ステップＳ３３）、文字出現数を１インクリメントする（ステップＳ３５）。
【００４２】
ステップＳ３１の条件を満たしていないと判断された場合又はステップＳ３５の後に、文節木生成部１１０は、値Ａが８以上であるか判断する（ステップＳ３７）。値Ａが８未満であれば、文節木生成部１１０は、カウンタ兼子ノード番号の配列においてＡ番目に格納されている値Ｂを取得する（ステップＳ５１）。そして呼出元の処理に戻る。
【００４３】
一方、値Ａが８以上であれば、文節木生成部１１０は、スパンド番号が０ｘＦＦＦＦとなっているか判断する（ステップＳ３９）。スパンド番号が０ｘＦＦＦＦである場合には、まだ拡張カウンタ兼子ノード番号の配列を取得していないことになる。従って、スパンド番号が０ｘＦＦＦＦである場合には、文節木生成部１１０は、配列設定処理を実施する（ステップＳ４１）。そして処理はステップＳ４３に移行する。
【００４４】
配列設定処理について図２６Ｂを用いて説明する。文節木生成部１１０は、カレントノードについてのスパンド番号又は現在参照している拡張カウンタ兼子ノード番号の配列の拡張スパンド番号に、現在の配列数を設定する（ステップＳ６８）。そして、文節木生成部１１０は、配列数を１インクリメントする（ステップＳ６９）。そして、呼出元の処理に戻る。
【００４５】
ステップＳ３９でスパンド番号が０ｘＦＦＦＦではなく他の値が設定されているか、又はステップＳ４１の後に、文節木生成部１１０は、取得した「スパンド番号」又は「拡張スパンド番号」番目の拡張カウンタ兼子ノード番号の配列を参照する（ステップＳ４３）。そして、文節木生成部１１０は、Ａ＝Ａ−８を算出する（ステップＳ４５）。その後、文節木生成部１１０は、Ａが８以上であるか判断する（ステップＳ４７）。Ａが８以上であれば、拡張カウンタ兼子ノード番号の配列を２以上使用することになる。Ａが８以上であれば、現在参照している拡張カウンタ兼子ノード番号の配列における拡張スパンド番号が０ｘＦＦＦＦであるか判断する（ステップＳ５３）。拡張スパンド番号が０ｘＦＦＦＦでない場合にはステップＳ５７に移行する。一方、拡張スパンド番号が０ｘＦＦＦＦである場合には、新たな拡張カウンタ兼子ノード番号の配列を設定することになるので、文節木生成部１１０は、配列設定処理（図２６Ｂ）を実施する（ステップＳ５５）。そして処理はステップＳ５７に移行する。
【００４６】
そして、文節木生成部１１０は、参照先の拡張カウンタ兼子ノード番号の配列における拡張スパンド番号、又は配列設定処理において設定された拡張カウンタ兼子ノード番号の配列における拡張スパンド番号を取得する（ステップＳ５７）。そして処理はステップＳ４３に戻る。
【００４７】
一方、値Ａが８未満となれば、文節木生成部１１０は、参照先の拡張カウンタ兼子ノード番号の配列のＡ番目に格納されている値Ｂを取得する（ステップＳ４９）。そして処理は呼出元の処理に戻る。
【００４８】
以上の処理を実施することで、子ノードの符号又は文字の出現回数を得ることができるようになる。
【００４９】
次に、カレントノード設定処理について、図２７を用いて説明する。文節木生成部１１０は、カウンタ兼子ノード番号（又は拡張カウンタ兼子ノード番号）の配列のＡ番目に格納されている値Ｂが子ノード番号（すなわち０ｘ０１００以上の符号）であるか判断する（ステップＳ７１）。値Ｂが子ノード番号である場合には、文節木生成部１１０は、カレントノードを子ノードに位置づける（ステップＳ８３）。そして呼出元の処理に戻る。
【００５０】
一方、値Ｂが子ノード番号ではない場合には、文節木生成部１１０は、値Ｂを１インクリメントする（ステップＳ７３）。そして、文節木生成部１１０は、値Ｂが閾値以上となったか判断する（ステップＳ７５）。値Ｂが閾値未満であれば、文節木生成部１１０は、カレントノードを入力文字の対応する符号のノード（すなわち、入力文字コードのノード）に位置づける（ステップＳ７７）。そして呼出元の処理に移行する。
【００５１】
一方、値Ｂが閾値以上であれば、文節木生成部１１０は、カウンタ兼子ノード番号（又は拡張カウンタ兼子ノード番号）の配列のＡ番目に、新たな子ノードの符号を設定する（ステップＳ７９）。データブロックのうち最も大きい符号＋１で新たな子ノードの符号が設定される。さらに、文節木生成部１１０は、設定した符号の新たな子ノードのデータブロックを生成し、カレントノードを、生成したノードに位置づける（ステップＳ８１）。
【００５２】
このような処理を実施すれば、図２４Ａ乃至図２４Ｆに示すような文節木が生成される。
【００５３】
次に、圧縮マップ生成処理について説明する。上でも述べたように、文節木は、第１階層については文字コードの順に符号を付与しているので符号の小さい順にソートされているが、第２階層以降については出現順に符号が付与されてしまうので、階層や対応する文字コードとは無関係に符号が付与されている。図２８に示す簡単な例では、第２階層には符号「０ｘ０１００」「０ｘ０１０４」「０ｘ０１０６」「０ｘ０１０２」のノードが付与されており、連続した符号となっていない。また、文字コード「０ｘ４１」に対応する符号「０ｘ００４１」の子ノード「０ｘ０１００」で表す文字コードは「０ｘ４２」であり、子ノード「０ｘ０１０４」で表す文字コードは「０ｘ４１」であり、この点においても符号は文字コードの順に整列されていない。
【００５４】
本実施の形態では、圧縮マップを生成する際に、図２８に示すような符号の付与態様から、図２９に示すように、階層順及び親ノード毎に対応する文字（符号に対応する文字列の最後の文字）のコード順にソートするように、符号を振り直す。図２９の例では、第２階層の符号「０ｘ０１００」には文字「０ｘ４１」のノードを対応付け、符号「０ｘ０１０１」には文字「０ｘ４２」のノードを対応付け、符号「０ｘ０１０２」には文字「０ｘ４３」のノードを対応付け、符号「０ｘ０１０３」に文字「０ｘ４２」のノードを対応付ける。また、第３階層の符号「０ｘ０１０４」に文字「０ｘ４３」のノードを対応付け、符号「０ｘ０１０５」に文字「０ｘ４１」のノードを対応付け、符号「０ｘ０１０６」に文字「０ｘ４２」のノードを対応付け、符号「０ｘ０１０７」に文字「０ｘ４３」のノードを対応付ける。このようにすれば、ノードの二分探索（二分検索）が可能となる。
【００５５】
より具体的に圧縮マップを説明する。圧縮マップは、親ノードの符号と自ノードの文字コード（自ノードの符号に対応する文字又は文字列の最後の文字）とを対応付ける対応付けデータを符号の順番で並べたデータである。実際には、カレントノードの符号と、当該カレントノードのカウンタ兼子ノード番号の配列に符号が格納されていることが確認された文字出現番号の配列の番号とを対応付ける対応付けデータを含む。図２８に示すような文節木の場合には、図３０の左側のような圧縮マップが生成される。上でも述べたように、符号は出現順に付与されるので、親ノードの符号の列はソートされておらず、結果として符号で表される文字列自体も文字コード順にソートされていない。なお、図３０の例では、符号も文字列も示されているが、これらのデータは圧縮マップには含まれていない補足情報である。
【００５６】
本実施の形態では、文節木から図３０の右側に示すように、上記のようなソート及び符号の振り直しを実施して、親ノードの符号と自ノードの文字コードとを対応付ける対応付けデータを、新たに振り直された符号の順番に並べることで圧縮マップを生成する。図３０の例でも分かるように、親ノードの符号は符号の小さい順にソートされている。これによって圧縮マップの二分探索が可能となる。
【００５７】
本実施の形態では、ソートを行うために、図３１に示すように、ソート領域を導入する。ソート領域には、以下の処理で特定される符号を、以下の処理で特定された順で格納する。この際、ソート領域の配列番号はソート後の符号となる。図３１の例では、配列番号「０ｘ０１００」の位置には、第２階層のノードの符号として最初にソート前符号「０ｘ０１０４」が格納される。すなわち、ソート前符号「０ｘ０１０４」のノードは、今後ソート後符号「０ｘ０１００」として取り扱われる。このノードについては、親ノードの符号は「０ｘ００４１」であり、このノードで表される文字コードは「０ｘ４１」である。
【００５８】
より具体的な処理内容を、図２４Ａ乃至図２４Ｆに示すような文節木のデータが得られた場合を一例として段階的に説明する。
【００５９】
まず、符号「０ｘ００００」乃至「０ｘ００ＦＦ」のノードについてはソートを行わなくてもよいので、そのまま圧縮マップにデータを登録する。例えば図３２に示すようなデータが圧縮マップに登録される。なお、親ノードは根ノードなので親ノードの符号として「ｒｏｏｔ」というデータが登録されており、さらにそれぞれの担当する文字「０ｘ００」乃至「０ｘＦＦ」が登録される。さらに、図３３に示すように、ソート領域にはノード「０ｘ００００」乃至「０ｘ００ＦＦ」を小さい順に登録する。
【００６０】
次に、ソート領域に登録されている符号のノードを配列番号（＝ソート後の符号）の小さい順に処理を行う。但し、子ノードが存在しないと圧縮マップには対応付けデータは登録されないので、図２５に示す文節木に示すように符号「０ｘ００４０」までの処理の説明は省略する。そして、図３４に示すように、配列番号「０ｘ００４１」を処理することになると、符号「０ｘ００４１」のデータブロックを参照し、その文字出現番号の配列番号「０ｘ００」から順番に「０ｘＦＦ」以外の値が登録されている位置を探索する。この例では、「０ｘ４１」番目に出現順番「１」が登録されているので、カウンタ兼子ノード番号の配列で「１」番目を参照する。そうすると、「０ｘ１００」以上の値として符号「０ｘ０１０４」が登録されているので、ソート領域の最後端「０ｘ０１００」に「０ｘ０１０４」を登録する。さらに、圧縮マップに、図３５に示すように、ソート後符号「０ｘ１００」番目に、親ノードのソート後の符号「０ｘ００４１」と文字出現番号の配列番号「０ｘ４１」に相当する文字コードとを対応付ける対応付けデータを登録する。
【００６１】
また、図３６に示すように、符号「０ｘ００４１」のデータブロックにおける文字出現番号の配列番号「０ｘ４２」番目には、出現順番「０」が登録されているので、カウンタ兼子ノード番号の配列で「０」番目を参照する。そうすると、「０ｘ１００」以上の値として符号「０ｘ０１００」が登録されているので、ソート領域の最後端「０ｘ０１０１」に「０ｘ０１００」を登録する。さらに、圧縮マップに、図３７に示すように、ソート後符号「０ｘ１０１」番目に、親ノードのソート後の符号「０ｘ００４１」と文字出現番号の配列番号「０ｘ４２」に相当する文字コードとを対応付ける対応付けデータを登録する。
【００６２】
さらに、図３８に示すように、符号「０ｘ００４１」のデータブロックにおける文字出現番号の配列番号「０ｘ４３」番目には、出現順番「２」が登録されているので、カウンタ兼子ノード番号の配列で「２」番目を参照する。そうすると、「０ｘ１００」未満の値「１」が登録されているので、圧縮マップに対応付けデータを登録することはない。文字出現番号の以後の配列番号について処理しても圧縮マップに対応付けデータを登録することはない。
【００６３】
次に、図３９に示すように、配列番号「０ｘ００４２」を処理することになると、符号「０ｘ００４２」のデータブロックを参照し、その文字出現番号の配列番号「０ｘ００」から順番に「０ｘＦＦ」以外の値が登録されている位置を探索する。この例では、「０ｘ４１」番目に出現順番「０」が登録されているので、カウンタ兼子ノード番号の配列で「０」番目を参照する。そうすると、「０ｘ１００」未満の値「１」が登録されているので、圧縮マップに対応付けデータを登録することはない。
【００６４】
また、符号「０ｘ００４２」のデータブロックにおける文字出現番号の配列番号「０ｘ４２」番目には、「０ｘＦＦ」が登録されているので圧縮マップにはデータは登録されない。
【００６５】
さらに、図４０に示すように、符号「０ｘ００４２」のデータブロックにおける文字出現番号の配列番号「０ｘ４３」番目には、出現順番「１」が登録されているので、カウンタ兼子ノード番号の配列で「１」番目を参照する。そうすると、「０ｘ１００」以上の値として符号「０ｘ０１０６」が登録されているので、ソート領域の最後端「０ｘ０１０２」に「０ｘ０１０６」を登録する。さらに、圧縮マップに、図４１に示すように、ソート後符号「０ｘ１０２」番目に、親ノードのソート後の符号「０ｘ００４２」と文字出現番号の配列番号「０ｘ４３」に相当する文字コードとを対応付ける対応付けデータを登録する。文字出現番号の以後の配列番号について処理しても圧縮マップに対応付けデータを登録することはない。
【００６６】
次に、図４２に示すように、配列番号「０ｘ００４３」を処理することになると、符号「０ｘ００４３」のデータブロックを参照し、その文字出現番号の配列番号「０ｘ００」から順番に「０ｘＦＦ」以外の値が登録されている位置を探索する。この例では、「０ｘ４１」番目に出現順番「０」が登録されているので、カウンタ兼子ノード番号の配列で「０」番目を参照する。そうすると、「０ｘ１００」未満の値「１」が登録されているので、圧縮マップに対応付けデータを登録することはない。
【００６７】
さらに、図４３に示すように、符号「０ｘ００４３」のデータブロックにおける文字出現番号の配列番号「０ｘ４２」番目には、出現順番「１」が登録されているので、カウンタ兼子ノード番号の配列で「１」番目を参照する。そうすると、「０ｘ１００」以上の値として符号「０ｘ０１０２」が登録されているので、ソート領域の最後端「０ｘ０１０３」に「０ｘ０１０２」を登録する。さらに、圧縮マップに、図４４に示すように、ソート後符号「０ｘ１０３」番目に、親ノードのソート後の符号「０ｘ００４３」と文字出現番号の配列番号「０ｘ４２」に相当する文字コードとを対応付ける対応付けデータを登録する。文字出現番号の以後の配列番号について処理しても圧縮マップに対応付けデータを登録することはない。
【００６８】
ソート後符号「０ｘ００４４」のデータブロックを処理しても圧縮マップにデータが登録されることはなく、ソート後符号「０ｘ００ＦＦ」までの全データブロックを処理しても圧縮マップにデータが登録されることはない。
【００６９】
また、図４５に示すように、配列番号「０ｘ０１００」を処理することになると、符号「０ｘ０１００」のデータブロックを参照し、その文字出現番号の配列番号「０ｘ００」から順番に「０ｘＦＦ」以外の値が登録されている位置を探索する。この例では、「０ｘ４３」番目に出現順番「０」が登録されているので、カウンタ兼子ノード番号の配列で「０」番目を参照する。そうすると、「０ｘ１００」以上の値として符号「０ｘ０１０１」が登録されているので、ソート領域の最後端「０ｘ０１０４」に「０ｘ０１０１」を登録する。さらに、圧縮マップに、図４６に示すように、ソート後符号「０ｘ１０４」番目に、親ノードのソート後の符号「０ｘ０１００」と文字出現番号の配列番号「０ｘ４３」に相当する文字コードとを対応付ける対応付けデータを登録する。文字出現番号の以後の配列番号について処理しても圧縮マップに対応付けデータを登録することはない。
【００７０】
また、ソート後符号「０ｘ０１０１」のデータブロックを処理しても圧縮マップにデータが登録されることはない。
【００７１】
また、図４７に示すように、配列番号「０ｘ０１０２」を処理することになると、符号「０ｘ０１０２」のデータブロックを参照し、その文字出現番号の配列番号「０ｘ００」から順番に「０ｘＦＦ」以外の値が登録されている位置を探索する。この例では、「０ｘ４１」番目に出現順番「１」が登録されているので、カウンタ兼子ノード番号の配列で「１」番目を参照する。そうすると、「０ｘ１００」以上の値として符号「０ｘ０１０５」が登録されているので、ソート領域の最後端「０ｘ０１０５」に「０ｘ０１０５」を登録する。さらに、圧縮マップに、図４８に示すように、ソート後符号「０ｘ１０５」番目に、親ノードのソート後の符号「０ｘ０１０３」と文字出現番号の配列番号「０ｘ４１」に相当する文字コードとを対応付ける対応付けデータを登録する。このデータブロックについては、文字出現番号の以後の配列番号について処理すると、順調に圧縮マップに対応付けデータが追加されるようになる。
【００７２】
そして、図４９に示すように、符号「０ｘ０１０２」のデータブロックにおける文字出現番号の配列番号「０ｘ４９」番目には、出現順番「８」が登録されているので、拡張カウンタ兼子ノード番号の配列で「０」番目を参照する。そうすると、「０ｘ１００」以上の値として符号「０ｘ０１０Ｄ」が登録されているので、ソート領域の最後端「０ｘ０１０Ｄ」に「０ｘ０１０Ｄ」を登録する。さらに、圧縮マップに、図５０に示すように、ソート後符号「０ｘ１０Ｄ」番目に、親ノードのソート後の符号「０ｘ０１０３」と文字出現番号の配列番号「０ｘ４９」に相当する文字コードとを対応付ける対応付けデータを登録する。文字出現番号の以後の配列番号について処理しても圧縮マップに対応付けデータを登録することはない。以下の処理で圧縮マップにはデータは登録されないので、説明を省略する。
【００７３】
次に、図５１及び図５２を用いて圧縮マップ生成処理を説明する。
【００７４】
圧縮マップ生成部１２０は、圧縮マップに、第１階層のノード「０ｘ００００」乃至「０ｘ００ＦＦ」のデータとして、根ノードを表すデータｒｏｏｔとノードの符号に対応する文字コードとを対応付ける対応付けデータを順番に追加する（図５１：ステップＳ９１）。また、圧縮マップ生成部１２０は、ソート領域に、第１の階層のノード「０ｘ００００」乃至「０ｘ００ＦＦ」の符号を、順番に追加する（ステップＳ９３）。そして、圧縮マップ生成部１２０は、ソート領域から、ソート後符号の小さい順に、未処理の符号を１つ読み出す（ステップＳ９５）。ここで未処理の符号を読み出すことができない場合には（ステップＳ９７：Ｎｏルート）、呼出元の処理に戻る。
【００７５】
一方、未処理の符号を読み出すことができれば（ステップＳ９７：Ｙｅｓルート）、圧縮マップ生成部１２０は、文節木において、読み出した符号のノードのデータブロックを参照する（ステップＳ９９）。そして、圧縮マップ生成部１２０は、エントリ追加処理を実施する（ステップＳ１０１）。このエントリ追加処理については、図５２を用いて説明する。エントリ追加処理が終了すると、ステップＳ９５に戻る。
【００７６】
次に、エントリ追加処理の処理フローについて説明する。
【００７７】
圧縮マップ生成部１２０は、読み出した符号のノードのデータブロックにおいて、文字出現番号の配列における未処理の番号における値Ａを、番号の小さい順に取り出す（図５２：ステップＳ１１１）。ここで、圧縮マップ生成部１２０は、処理が、文字出現番号の配列における終端まで既に行われていたか判断する（ステップＳ１１３）。処理が文字出現番号の配列における終端まで既に行われていた場合には、呼出元の処理に戻る。
【００７８】
一方、処理が文字出現番号の配列における終端まで行われていない場合には、圧縮マップ生成部１２０は、取り出した値Ａが０ｘＦＦであり且つ文字出現数が２５６ではないか判断する（ステップＳ１１５）。この条件を満たす場合には、符号がカウンタ兼子ノード番号の配列に登録されていないのでステップＳ１１１に戻る。
【００７９】
一方、値Ａが上で述べた条件を満たさない場合には、圧縮マップ生成部１２０は、値Ａが８以上であるか判断する（ステップＳ１１７）。Ａが８以上の場合には、拡張カウンタ兼子ノード番号の配列を用いているので、圧縮マップ生成部１２０は、スパンド番号の値を読み取り、スパンド番号番目（拡張スパンド番号の場合もある）の拡張カウンタ兼子ノード番号の配列を参照する（ステップＳ１１９）。また、圧縮マップ生成部１２０は、値Ａを−８する（ステップＳ１２１）。そして、圧縮マップ生成部１２０は、値Ａが８以上であるか判断する（ステップＳ１２３）。まだ値Ａが８以上である場合には、圧縮マップ生成部１２０は、拡張カウンタ兼子ノード番号の最後尾に格納されている拡張スパンド番号の値Ｃを取得する（ステップＳ１２５）。そして処理はステップＳ１１９に戻る。
【００８０】
一方、値Ａが８より小さい場合には、圧縮マップ生成部１２０は、参照先の拡張カウンタ兼子ノード番号の配列においてＡ番目に格納されている値Ｂを読み出す（ステップＳ１２７）。そして処理はステップＳ１３０に移行する。
【００８１】
一方、値Ａが初めからＡが８未満である場合には、圧縮マップ生成部１２０は、カウンタ兼子ノード番号の配列においてＡ番目に格納されている値Ｂを読み出す（ステップＳ１２９）。
【００８２】
そして、圧縮マップ生成部１２０は、取り出した値Ｂが「０ｘ０１００」以上であるか判断する（ステップＳ１３０）。取り出した値Ｂが「０ｘ０１００」未満であれば、圧縮マップのデータを追加することはないので、処理はステップＳ１１１に戻る。一方、取り出した値Ｂが「０ｘ０１００」以上であれば、圧縮マップ生成部１２０は、符号Ｂをソート領域の最後尾に追加する（ステップＳ１３１）。また、圧縮マップ生成部１２０は、圧縮マップに、ソート領域における処理対象の配列番号と文字出現番号の配列における処理対象の配列番号とを対応付ける対応付けデータを追加する（ステップＳ１３３）。そして処理はステップＳ１１１に戻る。
【００８３】
以上のような処理を実施することで、上で具体的に説明した処理が行われるようになる。また、このように生成された圧縮マップであれば、ディスクにそのまま格納することができ、圧縮処理及び伸張処理において利用することができる。
【００８４】
次に、圧縮マップを用いた圧縮処理について、図５３乃至図５５を用いて説明する。
【００８５】
圧縮処理部１４０は、圧縮対象の入力文字列から１文字取り出し、圧縮マップにおいて当該文字に対応する符号をカレントノードに位置づける（図５３：ステップＳ１４１）。また、圧縮処理部１４０は、入力文字列から次の１文字取り出す（ステップＳ１４３）。ここで、圧縮処理部１４０は、ステップＳ１４３で文字を取り出すことができたか判断する（ステップＳ１４４）。文字を取り出すことができれば、圧縮処理部１４０は、カレントノードの符号が「０ｘ０１００」より小さいか判断する（ステップＳ１４７）。
【００８６】
カレントノードの符号が「０ｘ０１００」より小さい場合には、圧縮処理部１４０は、「親ノードの符号＝カレントノードの符号、文字コード＝取り出した文字」となるノードについて、圧縮マップにおいて符号「０ｘ０１００」から最終ノードの範囲で二分探索を実施する（ステップＳ１４９）。そして処理はステップＳ１５３に移行する。
【００８７】
一方、カレントノードが「０ｘ０１００」以上であれば、圧縮処理部１４０は、「親ノードの符号＝カレントノードの符号、文字コード＝取り出した文字」となるノードについて、圧縮マップにおいてカレントノードの符号＋１から最終ノードの範囲で二分探索を実施する（ステップＳ１５１）。そして処理はステップＳ１５３に移行する。
【００８８】
ステップＳ１５３の処理に移行して、圧縮処理部１４０は、二分探索により該当ノードが見つかったか判断する（ステップＳ１５３）。該当ノードが見つからなかった場合には、圧縮処理部１４０は、圧縮結果としてカレントノードの符号を出力し（ステップＳ１５７）、カレントノードを、ステップＳ１４３で取り出した文字のノードに設定する（ステップＳ１５９）。そして処理はステップＳ１４３に戻る。一方、該当ノードが見つかった場合には、圧縮処理部１４０は、カレントノードを該当ノードに変更する（ステップＳ１５５）。そして処理はステップＳ１４３に戻る。
【００８９】
ステップＳ１４３で文字が取り出せなかった場合には、圧縮処理部１４０は、カレントノードの符号を圧縮結果として出力する（ステップＳ１４５）。そして処理は呼出元の処理に戻る。
【００９０】
このような処理を実施することで、文字列の圧縮が行われる。
【００９１】
例えば、図５４に示すような圧縮マップが生成され、「ABCAA」という圧縮対象の文字列が入力された場合の処理について具体的に説明する。
【００９２】
まず、入力文字列「ＡBCAA」の「Ａ」を処理する場合には、カレントノードが「０ｘ００４１」に設定される（図５５における［１］）。次に、「AＢCAA」の「Ｂ」を処理する場合には、「親ノードの符号＝０ｘ００４１、文字コード＝０ｘ４２」というノードについて、符号「０ｘ０１００」から「０ｘ０１０７」の範囲で二分探索を実施する。そうすると、符号「０ｘ０１０１」が該当するノードであることが分かるので、カレントノードを「０ｘ０１０１」に設定する（図５５における［２］）。
【００９３】
さらに、「ABＣAA」の「Ｃ」を処理する場合には、「親ノードの符号＝０ｘ０１０１、文字コード＝０ｘ４３」というノードについて、符号「０ｘ０１０２」から「０ｘ０１０７」の範囲で二分探索を実施する。そうすると、符号「０ｘ０１０４」が該当するノードであることが分かるので、カレントノードを「０ｘ０１０４」に設定する（図５５における［３］）。さらに、「ABCＡA」の「Ａ」を処理する場合には、「親ノードの符号＝０ｘ０１０４、文字コード＝０ｘ４１」となるノードについて、符号「０ｘ０１０５」から「０ｘ０１０７」の範囲で二分探索を実施する。そうすると、見つからないので、カレントノードの符号「０ｘ０１０４」を圧縮結果に追加する（図５５における［４］）。なお、文字コード「０ｘ０４１」に対応する符号「０ｘ００４１」のノードをカレントノードに設定する。
【００９４】
さらに、「ABCAＡ」の「Ａ」を処理する場合には、「親ノードの符号＝０ｘ００４１、文字コード＝０ｘ４１」というノードについて、符号「０ｘ０１００」から「０ｘ０１０７」の範囲で二分探索を実施する。そうすると、符号「０ｘ０１００」が該当するノードであることが分かるので、カレントノードを「０ｘ０１００」に設定する（図５５における［５］）。これで入力文字列の全文字を処理したので、カレントノードの符号「０ｘ０１００」を出力して、処理を終了する（図５５における［６］）。
【００９５】
このように圧縮処理を実施することができる。
【００９６】
次に、図５６及び図５７を用いて伸張処理の処理フローを説明する。まず、伸張処理部１５０は、圧縮データから未処理の符号を１つ読み出し、圧縮マップにおいて該当するノードをカレントノードに設定する（図５６：ステップＳ１６１）。なお、ステップＳ１６１で符号を取得できなければ処理は呼出元の処理に戻る（ステップＳ１６３：Ｎｏルート）。一方、符号が取得できれば（ステップＳ１６３：Ｙｅｓルート）、伸張処理部１５０は、カレントノードの文字を作業域に出力する（ステップＳ１６５）。そして、伸張処理部１５０は、カレントノードに親ノードの符号が含まれているか判断する（ステップＳ１６７）。親ノードの符号がｒｏｏｔである場合には、親ノードの符号は無しと判断する。親ノードの符号がない場合には、伸張処理部１５０は、作業域の文字列を後ろから伸張結果として出力する（ステップＳ１６９）。処理はステップＳ１６１に戻る。一方、親ノードの符号がある場合には、伸張処理部１５０は、親ノードの符号をカレントノードに位置づける（ステップＳ１７１）。そして処理はステップＳ１６５に戻る。
【００９７】
このような処理を実施することで符号を文字列に伸張することができるようになる。
【００９８】
例えば図５４に示すような圧縮マップを用いて符号「０ｘ０１０４、０１００」が圧縮データとして入力された場合を説明する。
【００９９】
まず、符号「０ｘ０１０４」のノードをカレントノードに設定し、カレントノードにおける文字「Ｃ」を作業領域に出力する。また、親ノードの符号が「０ｘ０１０１」であるので、カレントノードを符号「０ｘ０１０１」のノードに設定する（図５７における［１］）。また、カレントノードの符号「０ｘ０１０１」における文字「Ｂ」を作業域に出力する。さらに、親ノードの符号が「０ｘ００４１」であるので、カレントノードを符号「０ｘ００４１」に設定する（図５７における［２］）。
【０１００】
そして、カレントノードの符号「０ｘ００４１」における文字「Ａ」を作業域に出力する。但し、親ノードは存在しないので、作業域の文字を逆順に出力すると、「ＡＢＣ」が得られる。
【０１０１】
次に、新たな符号「０ｘ０１００」を読み出すと、カレントノードに設定して、当該符号のノードにおける文字「Ａ」を作業域に出力する。そして、親ノードの符号が「０ｘ００４１」であるので、カレントノードを符号「０ｘ００４１」のノードに設定する（図５７における［４］）。そして、カレントノードにおける文字「Ａ」を作業域に出力する。ここでカレントノードには親ノードの符号は無いので、作業域の文字列を逆順に出力すると、「ＡＡ」がさらに得られる。ここで伸張処理が完了する（図５７における［５］）。
【０１０２】
このように文節木のデータ構造を変更したため、処理途中で消費するメモリ容量を削減できる。
【０１０３】
なお、圧縮マップを生成せずとも、文節木のデータを用いて圧縮処理を実施することができる。
【０１０４】
例えば、図２４Ａ乃至図２４Ｆで表した文節木のデータを用いて文字列「ＡＢＣＡＡ」を圧縮する場合を一例に説明する。
【０１０５】
「ＡBCAA」における「Ａ」を読み出すと、図５８に示すように、文字「Ａ」に対応する符号「０ｘ００４１」のノードをカレントノードに設定する。さらに、「AＢCAA」における「Ｂ」を読み出すと、文字出現番号の配列において「０ｘ４２（Ｂ）」番目の値「０」を得て、カウンタ兼子ノード番号の配列における出現順番「０」の値を読み出す。この場合、符号「０ｘ０１００」が得られる。符号「０ｘ０１００」であれば、この符号に対応するノードをカレントノードに設定する。
【０１０６】
次に、「ABＣAA」における「Ｃ」を読み出すと、図５９に示すように、文字出現番号の配列において「０ｘ４３（Ｃ）」番目の値「０」を得て、カウンタ兼子ノード番号の配列における出現順番「０」の値を読み出す。ここでは、符号「０ｘ０１０１」が得られる。符号「０ｘ０１０１」であれば、この符号のノードをカレントノードに設定する。
【０１０７】
また、「ABCＡA」における「Ａ」を読み出すと、図６０に示すように、文字出現番号の配列において「０ｘ４１（Ａ）」番目の値「０」を得て、カウンタ兼子ノード番号の配列における出現順番「０」の値を読み出す。そうすると、符号「０ｘ０１００」より小さい値であるので、カレントノードの符号「０ｘ０１０１」を圧縮結果として出力する。
【０１０８】
さらに、「ABCAＡ」における「Ａ」を読み出すと、図６１に示すように、文字出現番号の配列において「０ｘ４１（Ａ）」番目の値「１」を得て、カウンタ兼子ノード番号の配列における出現順番「１」の値を読み出す。そうすると、符号「０ｘ０１０４」が得られる。ここで入力文字列は終了するので、符号「０ｘ０１０４」も圧縮結果として出力する。そうすると、最終的に「０ｘ０１０１」「０ｘ０１０４」が圧縮結果として出力されることになる。
【０１０９】
また、文節木のデータを用いて圧縮データを伸張することもできる。ここでは、図２４Ａ乃至図２４Ｆで表した文節木のデータを用いて符号「０ｘ０１０１」「０ｘ０１０４」を伸張する場合を一例に説明する。
【０１１０】
まず、図６２に示すように、符号「０ｘ０１０１」を、カウンタ兼子ノード番号の配列の中に含むノードを探索する。そうすると、今回は符号「０ｘ０１００」のノードの出現順番「０」が特定される。そうすると、文字出現番号の配列で「０」が登録されている番号を探索すると「０ｘ４３」が得られる。この文字コード「０ｘ４３」を作業域に出力する。
【０１１１】
次に、図６３に示すように、符号「０ｘ０１００」を、カウンタ兼子ノード番号の配列の中に含むノードを探索する。そうすると、今回は符号「０ｘ００４１」のノードの出現順番「０」が特定される。そうすると、文字出現番号の配列で「０」が登録されている番号を探索すると「０ｘ４２」が得られる。この文字コード「０ｘ４２」を作業域に出力する。
【０１１２】
次に、符号「０ｘ００４１」が探索対象となるが符号「０ｘ０１００」より小さいので、符号「０ｘ００４１」に対応する文字「０ｘ４１」を作業域に出力する。
【０１１３】
そうすると、図６４に示すように、作業域内の文字の順番を入れ替えて、「０ｘ４１」「０ｘ４２」「０ｘ４３」が伸張結果として出力される。
【０１１４】
次に、図６５に示すように、符号「０ｘ０１０４」を、カウンタ兼子ノード番号の配列の中に含むノードを探索する。そうすると、今回は符号「０ｘ００４１」のノードの出現番号「１」が特定される。そうすると、文字出現番号の配列で「１」が登録されている番号を探索すると「０ｘ４１」が得られる。この文字コード「０ｘ４１」を作業域に出力する。
【０１１５】
さらに、符号「０ｘ００４１」が探索対象となるが上で述べたのと同様に符号「０ｘ０１００」より小さいので、符号「０ｘ００４１」に対応する文字「０ｘ４１」を作業域に出力する。
【０１１６】
そうすると、図６６に示すように、作業域内の文字の順番を入れ替えて、「０ｘ４１」「０ｘ４１」を伸張結果に追加する。このようにして、「ＡＢＣＡＡ」が得られる。
【０１１７】
［実施の形態２］
本実施の形態では圧縮処理の処理速度を向上させるために、圧縮マップのデータ構造を変更する。
【０１１８】
具体的には、各ノードについて子ノードの最大ノード番号（最大子ノードの符号）を保持するようにする。圧縮処理では、ステップＳ１４９及びステップＳ１５１でも、カレントノードを親ノードとするノードを探索している。すなわち、カレントノードの子ノードであることが検索の条件となっているが、探索範囲はステップＳ１４９では「０ｘ０１００」から最終ノードまでであり、ステップＳ１５１ではカレントノードの符号＋１から最終ノードまでである。
【０１１９】
図６７に模式的に示す文節木において、例えば、カレントノードが「０ｘ０１０３」のノードであるとすると、子ノードの探索範囲は、実際には「０ｘ０１０５」乃至「０ｘ０１０７」のノードであるが、第１の実施の形態では、「０ｘ０１０４」についても探索対象となっていた。この例では１つのノードしか余分になっていないが、実際には「０ｘ０１００」「０ｘ０１０１」「０ｘ０１０２」に多数の子ノードが存在する場合には影響がある。また、「０ｘ０１０１」がカレントノードであれば、子ノードは「０ｘ０１０４」のみであるが、第１の実施の形態では「０ｘ０１０２」乃至「０ｘ０１０７」が探索範囲となっていた。
【０１２０】
これに対して各ノードについて最大子ノードの符号を保持すれば、カレントノードの１つ前のノードの最大子ノードの符号＋１のノードからカレントノードの最大子ノードまでを探索範囲として絞り込むことができるようになる。なお、子ノードが存在しない場合には、そのノードの符号−１のノードの最大子ノードの符号をコピーしておく。
【０１２１】
このように最大子ノードの符号を保持すれば、カレントノードが「０ｘ０１０３」であれば最大子ノードは「０ｘ０１０７」となっている。さらにカレントノードの符号「０ｘ０１０３」−１＝「０ｘ０１０２」の最大子ノードの符号「０ｘ０１０４」＋１＝「０ｘ０１０５」が得られるので、探索範囲は「０ｘ０１０５」乃至「０ｘ０１０７」であると効率的に特定できるようになる。
【０１２２】
具体的には、圧縮マップは、図６８に示すように、親ノードの符号と、文字コードと、最大子ノードの符号とを対応付ける形に変形される。
【０１２３】
次に、本実施の形態に係る圧縮マップ生成処理について説明する。本実施の形態では、圧縮マップ生成処理におけるエントリ追加処理を、図６９に示すように変更する。但し、変更部分は、ステップＳ１３５が追加された部分のみである。
【０１２４】
ステップＳ１３５では、１つのノードについて文字出現番号の配列を最後まで処理した後に、圧縮マップ生成部１２０は、ソート領域に最後に追加した符号の配列番号を最大子ノードの符号として設定する。処理に係るノードについてソート領域に子ノードの符号を追加しなかった場合、すなわち子ノードが存在していない場合には、処理に係るノードより前のノードと同じ符号が最大子ノードの符号として設定されることになる。
【０１２５】
また、本実施の形態に係る圧縮処理は、図７０に示すような処理フローとなる。但し、図５３の処理フローと異なる部分は、ステップＳ１４７乃至ＳＳ１５１の部分のみである。
【０１２６】
具体的には、圧縮処理部１４０は、カレントノードの符号が「０ｘ００００」であるか否かを判断する（ステップＳ１４７ｂ）。これは、「０ｘ００００」のノードだけが、カレントノードより１つ前のノードの最大子ノードを取得できないためである。カレントノードの符号が「０ｘ００００」である場合には、圧縮処理部１４０は、「親ノードの符号＝カレントノードの符号、文字コード＝取り出した文字」となるノードについて、圧縮マップにおいて符号「０ｘ０１００」から最大子ノードの符号の範囲で二分探索を実施する（ステップＳ１４９ｂ）。そして処理はステップＳ１５３に移行する。ステップＳ１４９よりも探索の範囲が狭められている。
【０１２７】
一方、カレントノードが「０ｘ００００」でない場合には、圧縮処理部１４０は、「親ノードの符号＝カレントノードの符号、文字コード＝取り出した文字」となるノードについて、圧縮マップにおいて、カレントノードの１つ前のノードの最大子ノードの符号＋１から最大子ノードの符号の範囲で二分探索を実施する（ステップＳ１５１ｂ）。そして処理はステップＳ１５３に移行する。同様に、ステップＳ１５１よりも探索の範囲が狭められている。
【０１２８】
図６７の文節木について上で述べた処理を実施すれば、図７１のような圧縮マップが得られる。このような圧縮マップを用いて、入力文字列「ＡＢＣＡＡ」について上で述べた圧縮処理を実施すると、以下のようになる。なお、処理結果自体は、図５５に示したものと同様である。
【０１２９】
まず、入力文字列「ＡBCAA」の「Ａ」を処理する場合には、カレントノードが「０ｘ００４１」に設定される（図５５における［１］）。次に、「AＢCAA」の「Ｂ」を処理する場合には、「親ノードの符号＝０ｘ００４１、文字コード＝０ｘ４２」というノードについて、符号「０ｘ０１００」から「０ｘ０１０１」（カレントノードの最大子ノードの符号）の範囲で二分探索を実施する。そうすると、符号「０ｘ０１０１」が該当するノードであることが分かるので、カレントノードを「０ｘ０１０１」に設定する（図５５における［２］）。
【０１３０】
さらに、「ABＣAA」の「Ｃ」を処理する場合には、「親ノードの符号＝０ｘ０１０１、文字コード＝０ｘ４３」というノードについて、符号「０ｘ０１０４」（１つ前のノードの最大子ノードの符号＋１＝カレントノードの最大子ノードの符号）で二分探索を実施する。そうすると、符号「０ｘ０１０４」が該当するノードであることが分かるので、カレントノードを「０ｘ０１０４」に設定する（図５５における［３］）。
【０１３１】
さらに、「ABCＡA」の「Ａ」を処理する場合には、「親ノードの符号＝０ｘ０１０４、文字コード＝０ｘ４１」となるノードについて、符号「０ｘ０１０８」（１つ前のノードの最大子ノードの符号＋１）から符号「０ｘ０１０７」（カレントノードの最大子ノード）が探索範囲として特定されるが、探索範囲の始点と終点が逆転しており、探索不要であることが分かる。そうすると、目的のノードは見つからないので、カレントノードの符号「０ｘ０１０４」を圧縮結果に追加する（図５５における［４］）。なお、文字コード「０ｘ０４１」に対応する符号「０ｘ００４１」のノードをカレントノードに設定する。
【０１３２】
さらに、「ABCAＡ」の「Ａ」を処理する場合には、「親ノードの符号＝０ｘ００４１、文字コード＝０ｘ４１」というノードについて、符号「０ｘ０１００」から「０ｘ０１０１」（カレントノードの最大子ノードの符号）の範囲で二分探索を実施する。そうすると、符号「０ｘ０１００」が該当するノードであることが分かるので、カレントノードを「０ｘ０１００」に設定する（図５５における［５］）。これで入力文字列の全文字を処理したので、カレントノードの符号「０ｘ０１００」を出力して、処理を終了する（図５５における［６］）。
【０１３３】
以上のように具体例でも探索範囲が狭められていることが分かる。
【０１３４】
［実施の形態３］
第３の実施の形態では、伸張処理の処理速度を向上させる。図５６で示した処理では、根ノード（ｒｏｏｔ）までノードを遡ることになるので、ノードの探索の処理回数が多くなっている。そこで、本実施の形態では、圧縮マップのデータ構造を変更すると共に、新たに階層情報及び伸張マップを生成して保持しておくものとする。このように追加のデータを保持するようになったとしても、追加で必要な容量は８００ＫＢ程度であり、負担がそれほど増えるわけではない。なお、圧縮マップは、４４６ＫＢ程度である。
【０１３５】
図７２に本実施の形態に係る圧縮マップの一例を示す。図７２に示すように、基本的な構成は第１の実施の形態と同様であるが、親ノードの符号と自ノードの文字コードと自ノードの所属階層の番号とを対応付けて格納するようになっている。
【０１３６】
また、図７３は、第１階層以降の各階層について、階層内ノード数と、階層内先頭符号と、伸張文字列先頭オフセット（offset）値とが対応付けられるようになっている。図７３の例は、図６７の文節木を基にしているが、階層情報があれば、第２階層には４つのノード「０ｘ０１００」「０ｘ０１０１」「０ｘ０１０２」「０ｘ０１０３」があり、これらがそれぞれ２文字からなる文字列を表していることが分かる。また、これらの文字列は合計２×４＝８バイトである。また、第３階層においては４つのノード「０ｘ０１０４」「０ｘ０１０５」「０ｘ０１０６」「０ｘ０１０７」があり、これらがそれぞれ３文字からなる文字列を表していることが分かる。また、これらの文字列は合計３×４＝１２バイトであることも分かる。伸張文字列先頭オフセット値は、階層が特定されたとき、当該階層の先頭の符号の文字又は文字列が、伸張マップの先頭からどれだけ離れた位置に配置されているかを示している。
【０１３７】
さらに、図７４は、本実施の形態に係る伸張マップの一例を示す。本実施の形態に係る伸張マップは、所属するノードの符号に対応する文字が、符号の順番で格納されている連想配列である。図６７の文節木であれば、第２階層については、０番目には「ＡＡ」、１番目には「ＡＢ」、２番目には「ＢＣ」、３番目には「ＣＢ」が登録されている。また、第３階層については、０番目には「ＡＢＣ」、１番目には「ＣＢＡ」、２番目には「ＣＢＢ」、３番目には「ＣＢＣ」が登録されている。
【０１３８】
このような圧縮マップなどのデータを生成する処理を、図７５乃至図７７を用いて説明する。
【０１３９】
圧縮マップ生成部１２０は、圧縮マップに、第１階層のノード「０ｘ００００」乃至「０ｘ００ＦＦ」のデータとして、根ノードを表すデータｒｏｏｔとノードの符号に対応する文字コードと所属階層番号「１」を対応付ける対応付けデータを順番に追加する（図７５：ステップＳ１８１）。
【０１４０】
また、圧縮マップ生成部１２０は、階層情報に第１階層の情報を設定する（ステップＳ１８３）。すなわち、第１階層には２５６個のノードがあるので、階層内ノード数に２５６を設定し、階層内先頭符号に「０ｘ００００」を設定し、伸張文字列先頭オフセットには「０」を設定する。これらは固定値である。
【０１４１】
さらに、圧縮マップ生成部１２０は、伸張マップに第１階層の情報を設定する（ステップＳ１８５）。第１階層は１文字で文字コードそのものであるから「０ｘ００」から「０ｘＦＦ」までを設定する。これらは固定値である。
【０１４２】
そして、圧縮マップ生成部１２０は、ソート領域に、第１の階層のノード「０ｘ００００」乃至「０ｘ００ＦＦ」の符号を、順番に追加する（ステップＳ１８７）。また、圧縮マップ生成部１２０は、次階層内先頭符号に「０ｘ０１００」を設定する（ステップＳ１８９）。次階層内先頭符号は、以下で用いる変数である。さらに、圧縮マップ生成部１２０は、階層カウンタを１に初期化する（ステップＳ１９０）。
【０１４３】
その後、圧縮マップ生成部１２０は、ソート領域から、ソート後符号の小さい順に、未処理の符号を１つ読み出す（ステップＳ１９１）。ここで未処理の符号を読み出すことができない場合には（ステップＳ１９３：Ｎｏルート）、圧縮マップ生成部１２０は、以下で説明するノード数カウンタの値を、階層情報における最終階層の階層内ノード数として設定する（ステップＳ１９５）。そして処理は呼出元の処理に戻る。
【０１４４】
一方、未処理の符号を読み出すことができれば（ステップＳ１９３：Ｙｅｓルート）、圧縮マップ生成部１２０は、文節木において、読み出した符号のノードのデータブロックを参照する（ステップＳ１９７）。そして、圧縮マップ生成部１２０は、本実施の形態に係るエントリ追加処理３を実施する（ステップＳ１９９）。このエントリ追加処理３については、図７６を用いて説明する。さらに、エントリ追加処理３の後に、圧縮マップ生成部１２０は、設定処理を実施する（ステップＳ２０１）。設定処理については、図７７を用いて説明する。そして処理はステップＳ１９１に戻る。
【０１４５】
次に、エントリ追加処理３について図７６を用いて説明する。図７６は、図５２とほぼ同じであるが、ステップＳ１３３がステップＳ１３３ｂに変更され、ステップＳ１３７及びＳ１３９が追加されている。
【０１４６】
すなわち、ステップＳ１３３ｂでは、圧縮マップ生成部１２０は、圧縮マップに、ソート領域における処理対象の配列番号（親ノードの符号）と文字出現番号の配列における処理対象の配列番号（子ノードの文字コード）と階層カウンタの値（所属階層）とを対応付ける対応付けデータを追加する（ステップＳ１３３ｂ）。
【０１４７】
また、圧縮マップ生成部１２０は、伸張マップに、親ノードの文字列＋文字出現番号の配列番号（子ノードの文字コード）を、子ノードに対応する文字列として階層カウンタの値の階層において設定する（ステップＳ１３７）。親ノードの文字列（処理に係る符号の文字列）は、例えば圧縮マップをステップＳ９５で特定された符号を用いてたどることによって特定する。また、親ノードの文字列は、圧縮マップで所属階層を取得して、階層情報における、カレントノードが所属する階層の「伸張文字列先頭オフセット」＋（カレントノードの符号−階層内先頭符号）×階層の位置を、伸張マップにおいて参照すれば、得ることができる。
【０１４８】
さらに、圧縮マップ生成部１２０は、ノード数カウンタの値を１インクリメントする（ステップＳ１３９）。そして処理はステップＳ１１１に戻る。
【０１４９】
以上のようにすれば、圧縮マップ、階層情報及び伸張マップの一部を生成できるようになる。
【０１５０】
次に、設定処理について、図７７を用いて説明する。
【０１５１】
圧縮マップ生成部１２０は、これまでに設定されていた次階層先頭符号がカレントノードの符号であるか判断する（ステップＳ２１１）。次階層先頭符号の初期値は「０ｘ０１００」である。次階層先頭符号がカレントノードの符号ではない場合には処理はステップＳ２１９に移行する。一方、次階層先頭符号がカレントノードの符号であれば、圧縮マップ生成部１２０は、エントリ追加処理３において、子ノードが特定されたか判断する（ステップＳ２１３）。子ノードが存在しない場合には、圧縮マップ生成部１２０は、次階層先頭符号に、カレントノードの符号＋１を設定する（ステップＳ２１７）。そして処理は呼出元の処理に戻る。
【０１５２】
一方、子ノードが存在した場合には、次階層先頭符号に、エントリ追加処理３において特定された子ノードのうち最小子ノードの符号を設定する（ステップＳ２１５）。そして処理はステップＳ２１９に移行する。
【０１５３】
ステップＳ２１９の処理に移行して、圧縮マップ生成部１２０は、カレントノードの符号＋１が次階層先頭符号であるか判断する（ステップＳ２１９）。すなわち、処理に係るノードが、現階層の最終ノードであるか判断する。カレントノードの符号＋１が次階層先頭符号である場合には、圧縮マップ生成部１２０は、階層情報の階層内ノード数に、ノード数カウンタの値を設定する（ステップＳ２２１）。また、圧縮マップ生成部１２０は、階層情報において、次階層の階層内先頭符号としてカレントノード＋１を設定する（ステップＳ２２３）。さらに、圧縮マップ生成部１２０は、階層情報における次の階層の伸張文字列先頭オフセットとして、現階層の伸張文字列先頭オフセット＋ノード数カウンタ×階層番号（階層カウンタの値）を設定する（ステップＳ２２５）。
【０１５４】
そして、圧縮マップ生成部１２０は、ノード数カウンタを０に初期化し（ステップＳ２２７）、階層カウンタの値を１インクリメントする（ステップＳ２２９）。そして処理は、呼出元の処理に戻る。
【０１５５】
このような処理を実施することで上で述べた圧縮マップ、階層情報及び伸張マップを生成することができる。
【０１５６】
次に、本実施の形態に係る圧縮処理３について図７８を用いて説明する。本実施の形態に係る圧縮処理３は、第１の実施の形態に係る圧縮処理とほぼ同じであり、異なるのはステップＳ１４７乃至Ｓ１５１に代わり、ステップＳ１５１ｃを実行するような点である。
【０１５７】
すなわち、圧縮処理部１４０は、「親ノードの符号＝カレントノードの符号、文字コード＝取り出した文字」となるノードについて、圧縮マップにおいて、カレントノードの階層の次の階層の階層内先頭符号（階層情報内のデータ）から次の階層（階層情報内のデータ）の階層内ノード数の範囲で二分探索を実施する（ステップＳ１５１ｃ）。
【０１５８】
このようにすれば、第１の実施の形態に係る圧縮処理における探索範囲より狭められている。
【０１５９】
例えば、「ABCAA」という圧縮対象の文字列が入力された場合の処理について具体的に説明する。
【０１６０】
まず、入力文字列「ＡBCAA」の「Ａ」を処理する場合には、カレントノードが「０ｘ００４１」に設定される（図５５における［１］）。次に、「AＢCAA」の「Ｂ」を処理する場合には、「親ノードの符号＝０ｘ００４１、文字コード＝０ｘ４２」というノードについて、現階層が「１」であるから第２階層の符号「０ｘ０１００」から「０ｘ０１０３」の範囲で二分探索を実施する。そうすると、符号「０ｘ０１０１」が該当するノードであることが分かるので、カレントノードを「０ｘ０１０１」に設定する（図５５における［２］）。
【０１６１】
さらに、「ABＣAA」の「Ｃ」を処理する場合には、「親ノードの符号＝０ｘ０１０１、文字コード＝０ｘ４３」というノードについて、現階層が「２」であるから第３階層の符号「０ｘ０１０４」から「０ｘ０１０７」の範囲で二分探索を実施する。そうすると、符号「０ｘ０１０４」が該当するノードであることが分かるので、カレントノードを「０ｘ０１０４」に設定する（図５５における［３］）。
【０１６２】
さらに、「ABCＡA」の「Ａ」を処理する場合には、「親ノードの符号＝０ｘ０１０４、文字コード＝０ｘ４１」となるノードについて、現階層が「３」であるので、次階層が存在しないので、探索無しで該当ノード無しと言うことが分かる。従って、カレントノードの符号「０ｘ０１０４」を圧縮結果に追加する（図５５における［４］）。なお、文字コード「０ｘ４１」に対応する符号「０ｘ００４１」のノードをカレントノードに設定する。
【０１６３】
さらに、「ABCAＡ」の「Ａ」を処理する場合には、「親ノードの符号＝０ｘ００４１、文字コード＝０ｘ４１」というノードについて、現階層が「１」であるから第２階層の符号「０ｘ０１００」から「０ｘ０１０３」の範囲で二分探索を実施する。そうすると、符号「０ｘ０１００」が該当するノードであることが分かるので、カレントノードを「０ｘ０１００」に設定する（図５５における［５］）。これで入力文字列の全文字を処理したので、カレントノードの符号「０ｘ０１００」を出力して、処理を終了する（図５５における［６］）。
【０１６４】
このように圧縮処理を実施することができる。
【０１６５】
次に、本実施の形態に係る伸張処理２の処理内容について図７９及び図８０を用いて説明する。
【０１６６】
まず、伸張処理部１５０は、圧縮データから１つ符号を取り出し、圧縮マップにおいて該当するノードをカレントノードに位置づける（ステップＳ２３１）。圧縮データから符号が読み出せなかった場合には（ステップＳ２３３：Ｎｏルート）、処理は呼出元の処理に戻る。一方、圧縮データから符号を読み出すことができれば（ステップＳ２３３：Ｙｅｓルート）、階層情報における、カレントノードが所属する階層の「伸張文字列先頭オフセット」＋（カレントノードの符号−階層内先頭符号）×階層の位置を、伸張マップにおいて参照し、階層バイト分出力する（ステップＳ２３５）。そしてステップＳ２３１に戻る。伸長文字列先頭オフセット、階層内先頭符号については、階層情報から読み出すことによって得られる。
【０１６７】
このように階層情報と伸張マップを用いることで処理が高速化される。
【０１６８】
例えば、「０ｘ０１０４」「０ｘ０１００」を伸張する場合の処理を図８０を用いて説明する。
【０１６９】
まず、符号「０ｘ０１０４」を読み出すと、圧縮マップから第３階層であることが特定されるので、第３階層の伸張文字列先頭オフセット「２６４」＋（カレントノードの符号「０ｘ０１０４」−階層内先頭符号「０ｘ０１０４」）×３＝「２６４」となるので、伸張マップの先頭から２６４バイトから３バイト分取り出す。そうすると、「ＡＢＣ」が出力される（図８０［１］）。
さらに、次の符号「０ｘ０１００」を読み出すと、圧縮マップから第２階層であることが特定されるので、第２階層の伸張文字オフセット「２５６」＋（カレントノードの符号「０ｘ０１００」−階層内先頭符号「０ｘ０１００」）×２＝「２５６」となるので、伸張マップの先頭から２５６バイトから２バイト分取り出す。そうすると、「ＡＡ」がさらに出力されることになる（図８０［２］）。
【０１７０】
以上のように２ステップで伸張されるので、処理が高速化される。
【０１７１】
［実施の形態４］
本実施の形態では実施の形態２及び３を統合する。また、伸張マップ及び階層情報において固定で且つ圧縮マップのデータから得られる情報については省略することで、メモリ使用量を削減する。
【０１７２】
本実施の形態に係る圧縮マップの一例を図８１に示す。本実施の形態では、ソート後の符号の順番で、自ノードの文字コードと、最大子ノードの符号と、所属階層とを対応付けている。親ノードの符号については、階層情報及び伸張マップがあれば用いられないので、省略されている。
【０１７３】
さらに、図８２に本実施の形態に係る階層情報を示す。本実施の形態に係る階層情報は、第３の実施の形態と異なり、第１階層のデータが省略されている。第２階層以降の各階層について、階層内ノード数と、階層内先頭符号と、伸張文字列先頭オフセットとが登録されるようになっている。第１階層のデータが省略されているので、伸張文字列先頭オフセットの値が変更されている。
【０１７４】
また、図８３に本実施の形態に係る伸張マップを示す。本実施の形態に係る伸張マップは、第３の実施の形態と異なり、第１階層のデータが省略されている。伸張マップは、第２階層以降の符号の小さい順に、該当する文字列が格納されている連想配列である。
【０１７５】
本実施の形態に係る圧縮マップ生成処理３の処理フローを図８４に示す。第３の実施の形態に係る圧縮マップ生成処理２と異なる部分は、ステップＳ１８３及びＳ１８５が存在せず、エントリ追加処理３を実施するステップＳ１９９の代わりにエントリ追加処理４を実施するステップＳ１９９ｂを実施する点、設定処理を実施するステップＳ２０１の代わりに設定処理２を実施するステップＳ２０１ｂを実施する点が異なっている。
【０１７６】
次にエントリ追加処理４の処理フローを図８５に示す。第３の実施の形態に係るエントリ追加処理３と異なる点は、配列の終端の場合に実行するステップＳ１３５（エントリ追加処理２で説明した処理）を実施する点と、ステップＳ１３３ｂの代わりにステップＳ１３３ｃを実施する点である。
【０１７７】
ステップＳ１３３ｃでは、圧縮マップ生成部１２０は、圧縮マップに、文字出現番号の配列における処理対象の配列番号（子ノードの文字コード）と階層カウンタの値（所属階層）とを対応付ける対応付けデータを追加する（ステップＳ１３３ｃ）。ソート領域における処理対象の配列番号（親ノードの符号）を登録しなくなった点が異なる。
【０１７８】
また、圧縮マップ生成処理３に含まれる設定処理２は、図７７とは異なり、図８６に示すような処理フローとなる。但し、図７７との差は、ステップＳ２２０及びＳ２２２が追加され、ステップＳ２２３及びＳ２２５の代わりに、ステップＳ２２３ｂ及びＳ２２５ｂが実施されるようになっている。
【０１７９】
この設定処理２において、ステップＳ２１９においてカレントノードの符号＋１が次階層先頭符号である場合、すなわち当該階層の最終ノードである場合には、圧縮マップ生成部１２０は、現在の階層カウンタの値が１であるか判断する（ステップＳ２２０）。現在の階層カウンタの値が１である場合には、階層情報にデータを追加しないので、圧縮マップ生成部１２０は、階層情報における次の階層の伸張文字列先頭オフセットに「０」を設定する（ステップＳ２２２）。そして処理はステップＳ２２５ｂに移行する。
【０１８０】
一方、現在の階層カウンタの値が１でない場合には、圧縮マップ生成部１２０は、階層情報の階層内ノード数に、ノード数カウンタの値を設定する（ステップＳ２２１）。また、圧縮マップ生成部１２０は、階層情報における次の階層の伸張文字列先頭オフセットとして、現階層の伸張文字列オフセット＋ノード数カウンタ×階層数（階層カウンタの値）を設定する（ステップＳ２２３ｂ）。この処理はステップＳ２２５と同じである。さらに圧縮マップ生成部１２０は、階層情報において、次階層の階層内先頭符号としてカレントノードの符号＋１を設定する（ステップＳ２２５ｂ）。このステップはステップＳ２２３と同じである。以降の処理は図７７と同じである。
【０１８１】
次に、本実施の形態に係る圧縮処理４の処理フローを図８７に示す。第２の実施の形態に係る圧縮処理２との差は、ステップＳ１４９ｂとステップＳ１５１ｂが、ステップＳ１４９ｄとステップＳ１５１ｄとに変更された点である。
【０１８２】
具体的には、圧縮処理部１４０は、カレントノードの符号が「０ｘ００００」であるか否かを判断する（ステップＳ１４７ｂ）。これは、「０ｘ００００」のノードだけが、カレントノードより１つ前のノードの最大子ノードを取得できないためである。カレントノードの符号が「０ｘ００００」である場合には、圧縮処理部１４０は、文字コード＝取り出した文字となるノードについて、圧縮マップにおいて符号「０ｘ０１００」から最大子ノードの符号の範囲で二分探索を実施する（ステップＳ１４９ｄ）。親ノードについてのデータが圧縮マップから削除されているため、このような処理になる。
【０１８３】
一方、カレントノードが「０ｘ００００」でない場合には、圧縮処理部１４０は、文字コード＝取り出した文字となるノードについて、圧縮マップにおいて、カレントノードの１つ前のノードの最大子ノードの符号＋１から最大子ノードの符号の範囲で二分探索を実施する（ステップＳ１５１ｄ）。そして処理はステップＳ１５３に移行する。
【０１８４】
なお、伸張処理については、図７９の伸張処理２の代わりに図８８に示す伸張処理３を実施する。図８８と図７９の差については、ステップＳ２３７及びＳ２３９が追加されている点である。具体的には、伸張処理部１５０は、圧縮マップにおけるカレントノードの所属階層の値が「１」であるか判断する（ステップＳ２３７）。所属階層の値が「１」である場合には、伸張処理部１５０は、圧縮マップにおけるカレントノードにおける文字コードを出力し（ステップＳ２３９）、処理はステップＳ２３１に移行する。一方、所属階層の値が「２」以上であれば、処理はステップＳ２３５に移行する。このような処理を実施すれば、階層情報及び伸張マップのデータ量を削減しても伸張処理が高速化される。
【０１８５】
以上本実施の形態を説明したが、本技術はこれに限定されるものではない。
【０１８６】
例えば、上で述べた機能ブロック図は必ずしも実際のプログラムモジュール構成とは一致しない。また、処理フローについても処理結果が変わらない限り、処理順番を入れ替えたり、並列実行するようにできる。
【０１８７】
さらに上で述べた処理については１台のコンピュータで処理する例を示したが、複数のコンピュータで処理するようにしても良い。
【０１８８】
なお、上で述べた情報処理装置１００は、コンピュータ装置であって、図８９に示すように、メモリ２５０１とＣＰＵ（Central Processing Unit）２５０３とハードディスク・ドライブ（ＨＤＤ：Hard Disk Drive）２５０５と表示装置２５０９に接続される表示制御部２５０７とリムーバブル・ディスク２５１１用のドライブ装置２５１３と入力装置２５１５とネットワークに接続するための通信制御部２５１７とがバス２５１９で接続されている。オペレーティング・システム（ＯＳ：Operating System）及び本実施例における処理を実施するためのアプリケーション・プログラムは、ＨＤＤ２５０５に格納されており、ＣＰＵ２５０３により実行される際にはＨＤＤ２５０５からメモリ２５０１に読み出される。ＣＰＵ２５０３は、アプリケーション・プログラムの処理内容に応じて表示制御部２５０７、通信制御部２５１７、ドライブ装置２５１３を制御して、所定の動作を行わせる。また、処理途中のデータについては、主としてメモリ２５０１に格納されるが、ＨＤＤ２５０５に格納されるようにしてもよい。本技術の実施例では、上で述べた処理を実施するためのアプリケーション・プログラムはコンピュータ読み取り可能なリムーバブル・ディスク２５１１に格納されて頒布され、ドライブ装置２５１３からＨＤＤ２５０５にインストールされる。インターネットなどのネットワーク及び通信制御部２５１７を経由して、ＨＤＤ２５０５にインストールされる場合もある。このようなコンピュータ装置は、上で述べたＣＰＵ２５０３、メモリ２５０１などのハードウエアとＯＳ及びアプリケーション・プログラムなどのプログラムとが有機的に協働することにより、上で述べたような各種機能を実現する。
【０１８９】
以上述べた本実施の形態をまとめると、以下のようになる。
【０１９０】
本実施の形態に係るデータ構造生成方法は、（Ａ）文字又は文字列に対応する符号を保持するための第１の領域と当該文字又は文字列の次に出現する文字の出現順番を各文字について保持するための第２の領域と上記文字又は文字列の次に出現する文字の出現順番に応じて出現回数又は当該出現回数が閾値を超えた場合に当該文字又は文字列と今回出現した文字とからなる文字列に対応する符号を保持するための第３の領域とを含むデータブロックを、使用される可能性のある各文字について生成し、（Ｂ）入力文字列に含まれる複数の文字のうち着目する文字又は文字列についてのデータブロックの第２の領域において入力文字列において着目する文字又は文字列の次に出現した文字についての出現順番が保持されており且つ第３の領域において当該出現順番のデータとして出現回数が保持されており且つ当該出現回数が今回閾値を超えることになることを検出すると、第３の領域において当該出現順番のデータとして、着目する文字又は文字列と次に出現した文字とからなる第２の文字列に対応する符号を格納し、（Ｃ）第２の文字列についてのデータブロックを生成する処理を含む。
【０１９１】
このような処理を実施することによって得られる複数のデータブロックを用いれば、メモリ使用量が削減されている。
【０１９２】
なお、上で述べたデータ構造生成方法は、（Ｄ）入力文字列に含まれる複数の文字のうち着目する文字又は文字列についてのデータブロックの第２の領域において、入力文字列において着目する文字又は文字列の次に出現した文字についての出現順番が保持されており且つ第３の領域において当該出現順番のデータとして出現回数が保持されており且つ当該出現回数を増分しても閾値を超えないことを検出すると、次に出現した文字を、着目する文字に設定する処理をさらに含むようにしても良い。
【０１９３】
さらに、上で述べたデータ構造生成方法は、（Ｅ）入力文字列に含まれる複数の文字のうち着目する文字又は文字列についてのデータブロックの第２の領域において、入力文字列において着目する文字又は文字列の次に出現した文字についての出現順番が保持されており且つ第３の領域において当該出現順番のデータとして着目する文字又は文字列と次に出現した文字とからなる第２の文字列に対応する符号が保持されていることを検出すると、当該第２の文字列を、着目する文字列に設定する処理をさらに含むようにしても良い。
【０１９４】
さらに、上で述べた第３の領域が、所定出現順番までの領域に限定されている場合もある。この場合、上で述べたデータブロックが、第３の領域の拡張領域を示すデータを保持する第４の領域をさらに含むようにしても良い。これにより、下位のデータブロックの数が多い場合にも対処できるようになる。
【０１９５】
また、上で述べたデータ構造生成方法は、（Ｆ）入力文字列について生成された複数のデータブロックから、当該複数のデータブロックの各データブロックについて当該データブロックの第１の領域に保持されている符号及び第３の領域に保持されている符号を当該符号に対応する文字又は文字列のコードに基づき第２の符号に付与し直した状態における複数のデータブロックで表される木構造における第１階層の各データブロックについては最上位階層を表すデータと当該データブロックの第１の領域に保持されている第２の符号に対応する文字のコードとを対応付ける第１の対応付けデータと、上記状態における複数のデータブロックで表される木構造における第２階層以降の各データブロックについては当該データブロックの親データブロックの第１の領域に保持されている第２の符号と当該データブロックで追加された文字のコードとを対応付ける第２の対応付けデータとを含むデータを生成する生成処理をさらに含むようにしても良い。
【０１９６】
このようにすれば、ディスクに格納できる形式でさらに圧縮処理及び伸張処理に好適なデータ構造（例えば実施の形態に係る圧縮マップ）が生成される。
【０１９７】
また、第１の対応付けデータ及び第２の対応付けデータにおいて、当該データブロックについて第３の領域において保持されている最も大きい第２の符号をさらに対応付けられている場合もある。例えば圧縮処理における探索処理を高速化することができるようになる。
【０１９８】
なお、上で述べたデータ構造生成方法は、（Ｇ）入力文字列について生成された複数のデータブロックのうち使用される可能性がある文字についての第１のデータブロックの各々を、当該第１のデータブロックの符号の小さい順に処理対象に設定する処理と、（Ｈ）処理対象の第１のデータブロックの第２の領域において文字のコードの順番で出現順番を読み出し、当該処理対象の第１のデータブロックの第３の領域において当該出現順番のデータとして符号が保持されている場合には、当該出現順番のデータとして保持されている符号のデータブロックを第１のデータブロックの後に処理すべき第２のデータブロックに追加し、当該処理対象の第１のデータブロックの処理順番に相当する第２の符号と上記文字のコードとを対応付ける対応付けデータを順に格納する第１の格納処理と、（Ｉ）第１のデータブロックの後に処理すべき第２のデータブロックの各々を、追加された順番で処理対象に設定する処理と、（Ｊ）処理対象の第２のデータブロックの第２の領域において文字のコードの順番で出現順番を読み出し、当該処理対象の第２のデータブロックの第３の領域において当該出現順番のデータとして符号が保持されている場合には、当該出現順番のデータとして保持されている符号のデータブロックを上記後に処理すべき第２のデータブロックに追加し、当該処理対象の第２のデータブロックの処理順番に相当する第２の符号と上記文字のコードとを対応付ける対応付けデータを順に格納する第２の格納処理とをさらに含むようにしても良い。
【０１９９】
さらに、上で述べたデータ構造生成方法は、（Ｋ）入力文字列について生成された複数のデータブロックのうち使用される可能性がある文字についての第１のデータブロックの各々について、最上位のデータブロックを表すデータと当該第１のデータブロックについての文字のコードとを対応付ける対応付けデータを文字のコードの順に格納する処理をさらに含むようにしても良い。この場合、第１の格納処理又は第２の格納処理において、最後に上記対応付けデータを格納した際の第２の符号を、処理対象の第１のデータブロックについての文字のコード又は処理対象の第２のデータブロックについての文字列の最終文字のコードに対応付けて格納するようにしても良い。
【０２００】
本実施の形態の第２の態様に係るデータ構造生成方法は、（Ａ）文字又は文字列に対応する符号を保持するための第１の領域と当該文字又は文字列の次に出現する文字の出現順番を各文字について保持するための第２の領域と文字又は文字列の次に出現する文字の出現順番に応じて出現回数又は当該出現回数が閾値を超えた場合に文字又は文字列と今回出現した文字とからなる文字列に対応する符号を保持するための第３の領域とを含むデータブロックを、使用される可能性のある各文字と、既にデータブロックが生成されている、入力文字列内の文字又は文字列の次に所定の出現回数以上出現する文字とについて生成する第１生成処理と、（Ｂ）第１生成処理により生成された複数のデータブロックから、当該複数のデータブロックの各データブロックについて当該データブロックの第１の領域に保持されている符号及び第３の領域に保持されている符号を当該符号に対応する文字又は文字列のコードに基づき第２の符号に付与し直した状態における複数のデータブロックで表される木構造の第１階層の各データブロックについては最上位階層を表すデータ又は当該データブロックについて第３の領域に保持されている最も大きい第２の符号と当該データブロックの第１の領域に保持されている第２の符号に対応する文字のコードと階層番号とを対応付ける第１の対応付けデータと、上記状態における複数のデータブロックで表される木構造の第２階層以降の各データブロックについては当該データブロックの親データブロックの第１の領域に保持されている第２の符号又は当該データブロックについて第３の領域に保持されている最も大きい第２の符号と当該データブロックで追加された文字のコードと階層番号とを対応付ける第２の対応付けデータとを含むデータを生成する第２生成処理と、（Ｃ）上記状態における複数のデータブロックで表される木構造の第２階層以降の各階層に属する各データブロックの第１の領域に保持されている第２の符号に対応する文字列のコードを含む第１のデータを生成する第３生成処理と、（Ｄ）上記状態における複数のデータブロックで表される木構造の第２階層以降の各階層について当該階層内のデータブロック数と当該階層内のデータブロックの第１の領域に保持されている最小の第２の符号と第１のデータにおいて当該最小の第２の符号に対応する文字列の配置位置の、先頭からのオフセット値とを対応付ける階層情報を生成する第４生成処理とを含む。
【０２０１】
これによって生成されるデータを用いれば、圧縮処理及び伸張処理の処理速度を上げることができる。
【０２０２】
本実施の形態の第３の態様に係るデータ構造は、文字又は文字列に対応する符号を保持するための第１の領域と当該文字又は文字列の次に出現する文字の出現順番を各文字について保持するための第２の領域と上記文字又は文字列の次に出現する文字の出現順番に応じて出現回数又は当該出現回数が閾値を超えた場合に上記文字又は文字列と今回出現した文字とからなる文字列に対応する符号を保持するための第３の領域とを含むデータブロックを各ノードのデータとして含む文節木のデータ構造である。これによってメモリ使用量を大幅に削減できるようになる。
【０２０３】
本実施の形態の第４の態様に係るデータ構造は、文節木に対応するデータ構造であって、文節木の各ノードについて、当該ノードの親ノードの符号と、当該ノードで表される文字のコードとを対応付ける対応付けデータが、各ノードの符号の順番に並べられたものである。このようなデータであれば、そのままディスクに格納して後に使用することも可能である。
【０２０４】
本実施の形態の第４の態様に係るデータ構造において、上で述べた対応付けデータが、さらに当該ノードの子ノードの符号のうち最大の符号をさらに対応付けている場合もある。これによって、圧縮処理の処理効率を上げることができるようになる。
【０２０５】
また、本実施の形態の第５の態様に係るデータ構造は、文節木に対応する第１のデータと、文節木の各ノードに対応する文字又は文字列についての第２のデータと、文節木の階層についての第３のデータとを有する。そして、第１のデータにおいて、文節木の各ノードについて、当該ノードの親ノードの符号又は当該ノードの子ノードの符号のうち最大の符号と、当該ノードで表される文字のコードと、当該ノードが所属する階層とを対応付けるデータが、各ノードの符号の順番に並べられている。また、第２のデータは、文節木の第２階層以降の各階層の各ノードについて当該ノードに対応する文字又は文字列のコードを当該ノードの符号の順に含む。さらに、第３のデータは、文節木の第２階層以降の各階層について、当該階層に属するノードの数と、当該階層に属するノードの符号のうち最小の符号と、第２のデータにおいて当該最小の符号に対応する文字又は文字列の配置位置の、先頭からのオフセット値とを対応付けるデータを含む。
【０２０６】
このようにすれば圧縮処理及び伸張処理の処理速度を向上させることができる。
【０２０７】
さらに、本実施の形態の第６の態様に係る圧縮方法は、（Ａ）文節木に対応するデータ構造であって、文節木の各ノードについて、当該ノードの親ノードの符号と、当該ノードで表される文字のコードとを対応付ける対応付けデータが、各ノードの符号の順番に並べられたデータ構造において、入力文字列に含まれる第１の文字に対応する符号の対応付けデータを参照する処理と、（Ｂ）親ノードの符号が第１の文字に対応する符号となっており且つノードで表される文字のコードが入力文字列において次に現れる第２の文字のコードとなっている対応付けデータを、データ構造において探索する探索処理と、（Ｃ）対応付けデータが検出された場合には、当該対応付けデータを参照する第１参照処理と、（Ｄ）対応付けデータが検出されない場合には、参照している対応付けデータの符号を出力し、第２の文字に対応する符号の対応付けデータを参照する第２参照処理と、（Ｅ）探索処理と第１参照処理と第２参照処理とを、入力文字列の最後の文字を処理するまで、第２の文字を入力文字列の文字の順に移動させつつ実施し、入力文字列の最後の文字を処理した後に、参照している対応付けデータの符号を出力する処理とを含む。
【０２０８】
このように上で述べたデータ構造を用いて圧縮処理を実施できる。
【０２０９】
本実施の形態の第６の態様に係る圧縮方法の探索処理において、データ構造の第１階層についての対応付けデータを参照している場合には、第２階層以降の対応付けデータを探索し、データ構造の第２階層以降の階層についての対応付けデータを参照している場合には、参照している対応付けデータの符号より後ろの対応付けデータを探索するようにしても良い。
【０２１０】
また、上で述べた対応付けデータが、さらに上記ノードの子ノードの符号のうち最大の符号をさらに対応付けるようにしても良い。この場合、上で述べた探索処理において、データ構造の第１階層についての対応付けデータを参照している場合には、第２階層に属する最初の対応付けデータから、参照している対応付けデータに含まれる最大の符号の対応付けデータまでを探索し、データ構造の第２階層以降の階層についての対応付けデータを参照している場合には、参照している対応付けデータの１つ前の対応付けデータに含まれる最大の符号の対応付けデータから、参照している対応付けデータに含まれる最大の符号の対応付けデータまでを探索するようにしても良い。これによって、探索範囲が狭められ、圧縮処理の高速化が図られる。
【０２１１】
また、上で述べた対応付けデータが、さらに当該ノードの属する階層の階層番号をさらに対応付けるようにしても良い。この場合、上で述べた探索処理において、データ構造において参照している対応付けデータの階層番号の次の階層番号が対応付けられている対応付けデータを探索するようにしても良い。このようにしても、探索範囲が狭められ、圧縮処理の高速化が図られる。
【０２１２】
本実施の形態の第７の態様に係る圧縮方法は、文節木に対応する第１のデータと文節木の階層についての第２のデータとを有するデータ構造であって、第１のデータにおいて、文節木の各ノードについて、当該ノードの親ノードの符号と、当該ノードで表される文字のコードと、当該ノードが所属する階層とを対応付けるデータが、各ノードの符号の順番に並べられており、第２のデータは、文節木の各階層について、当該階層に属するノードの数と、当該階層に属するノードの符号のうち最小の符号とを対応付けるデータを含むデータ構造を用いる。そして、上記圧縮方法は、（Ａ）上記データ構造に含まれる第１のデータにおいて、入力文字列に含まれる第１の文字に対応する符号の対応付けデータを参照する処理と、（Ｂ）親ノードの符号が、参照している対応付けデータに対応するノードの符号となっており且つ上記ノードで表される文字のコードが入力文字列において次に現れる第２の文字のコードとなっている対応付けデータを、第２のデータにおいて、参照している対応付けデータに対応するノードの階層の１階層下の階層に属するノードの数及び最小の符号とから特定される範囲を第１のデータについて探索する探索処理と、（Ｃ）対応付けデータが検出された場合には、当該対応付けデータを参照する第１参照処理と、（Ｄ）対応付けデータが検出されない場合には、参照している対応付けデータの符号を出力し、第２の文字に対応する符号の対応付けデータを参照する第２参照処理と、（Ｅ）探索処理と第１参照処理と第２参照処理とを、入力文字列の最後の文字を処理するまで、第２の文字を入力文字列の文字の順に移動させつつ実施し、入力文字列の最後の文字を処理した後に、参照している対応付けデータの符号を出力する処理と含む。このような処理でも伸張処理を高速化できる。
【０２１３】
さらに、本実施の形態の第８の態様に係る伸張方法は、（Ａ）文節木に対応するデータ構造であって、文節木の各ノードについて、当該ノードの親ノードの符号と、当該ノードで表される文字のコードとを対応付ける対応付けデータが、各ノードの符号の順番に並べられたデータ構造において、入力符号のうち第１の符号の順番の対応付けデータを特定する処理と、（Ｂ）特定された対応付けデータに含まれる文字のコードをメモリに格納する格納処理と、（Ｃ）特定された対応付けデータに含まれる親ノードの符号が文節木の根ノード以外のノードの符号を示している場合には、当該親ノードの符号の対応付けデータを参照する参照処理と、（Ｄ）特定された対応付けデータに含まれる親ノードの符号が文節木の根ノードの符号を示している場合には、メモリに格納されている文字のコードを逆順に出力する出力処理と、（Ｅ）格納処理と参照処理と出力処理とを、入力符号のうち第１の符号より後ろの各符号について順番に実施する処理とを含む。
【０２１４】
このように上で述べたデータ構造を用いて伸張処理を行うことができる。
【０２１５】
本実施の形態の第９の態様に係る圧縮方法は、文節木に対応するデータ構造であって、文節木の各ノードについて、当該ノードの子ノードの符号のうち最大の符号と、当該ノードで表される文字のコードとを対応付ける対応付けデータが、各ノードの符号の順番に並べられたデータ構造を用いる。そして、本圧縮方法は、（Ａ）入力文字列に含まれる第１の文字に対応する符号の対応付けデータを参照する処理と、（Ｂ）上記ノードで表される文字のコードが入力文字列において次に現れる第２の文字のコードとなっている対応付けデータを、データ構造において探索する探索処理と、（Ｃ）対応付けデータが検出された場合には、当該対応付けデータを参照する第１参照処理と、（Ｄ）対応付けデータが検出されない場合には、参照している対応付けデータの符号を出力し、第２の文字に対応する符号の対応付けデータを参照する第２参照処理と、（Ｅ）探索処理と第１参照処理と第２参照処理とを、入力文字列の最後の文字を処理するまで、第２の文字を入力文字列の文字の順に移動させつつ実施し、入力文字列の最後の文字を処理した後に、参照している対応付けデータの符号を出力する処理と含む。そして、上記探索処理においては、データ構造の第１階層についての対応付けデータを参照している場合には、第２階層に属する最初の対応付けデータから、参照している対応付けデータに含まれる最大の符号の対応付けデータまでを探索する、また、データ構造の第２階層以降の階層についての対応付けデータを参照している場合には、参照している対応付けデータの１つ前の対応付けデータに含まれる最大の符号の対応付けデータから、参照している対応付けデータに含まれる最大の符号の対応付けデータまでを探索する。このようにすれば、探索範囲が狭められているので高速に圧縮できるようになる。
【０２１６】
また、本実施の形態の第１０の態様に係る伸張方法は、文節木に対応する第１のデータと、文節木の各ノードに対応する文字又は文字列についての第２のデータと、文節木の階層についての第３のデータとを有し且つデータ格納部に格納されているデータ構造を用いる。そして、第１のデータにおいて、文節木の各ノードについて、当該ノードが所属する階層の階層番号を含むエントリが、各ノードの符号の順番に並べられている。さらに、第２のデータは、文節木の各階層の各ノードについて当該ノードに対応する文字又は文字列を当該ノードの符号の順に含む。さらに、第３のデータは、文節木の各階層について、当該階層に属するノードの符号のうち最小の符号と、第２のデータにおいて当該最小の符号に対応する文字又は文字列の配置位置の、先頭からのオフセット値とを対応付けるデータを含む。そして、本伸張方法は、（Ａ）上記データ構造に含まれる第１のデータにおいて、入力符号のうち第１の符号の順番のエントリを特定する処理と、（Ｂ）特定されたエントリに含まれる階層番号に従って第３のデータにおいて上記最小の符号とオフセット値とを特定する特定処理と、（Ｃ）第２のデータから、特定されたオフセット値に対して、特定されたエントリの符号と特定された最小の符号との差に階層番号を乗じた値を加算することで得られる配置位置から階層番号分の文字又は文字列を読み出す読み出し処理と、（Ｄ）入力符号のうち第１の符号の後ろの第２の符号以降の各符号について、第１のデータにおけるエントリを特定し、特定処理と読み出し処理とを実施する処理とを含む。
【０２１７】
このようにすれば、伸張処理が高速化される。
【０２１８】
また、本実施の形態の第１１の態様に係る伸張方法は、文節木に対応する第１のデータと、文節木の各ノードに対応する文字又は文字列についての第２のデータと、文節木の階層についての第３のデータとを有し且つデータ格納部に格納されているデータ構造を用いる。そして、第１のデータにおいて、文節木の各ノードについて、当該ノードが所属する階層の階層番号を含むエントリが、各ノードの符号の順番に並べられている。また、第２のデータは、文節木の第２の階層以降の各階層の各ノードについて当該ノードに対応する文字列を当該ノードの符号の順に含む。さらに、第３のデータは、文節木の第２の階層以降の各階層について、当該階層に属するノードの符号のうち最小の符号と、第２のデータにおいて当該最小の符号に対応する文字又は文字列の配置位置の、先頭からのオフセット値とを対応付けるデータを含む。そして本伸張方法は、（Ａ）上記データ構造に含まれる第１のデータにおいて、入力符号のうち第１の符号の順番のエントリを特定する処理と、（Ｂ）特定されたエントリが第１の階層におけるエントリであれば、特定されたエントリの符号に対応する文字を出力する出力処理と、（Ｃ）特定されたエントリが第２の階層以降のエントリであれば、特定されたエントリに含まれる階層番号に従って第３のデータにおいて最小の符号とオフセット値とを特定する特定処理と、（Ｄ）第２のデータにおいて、特定されたオフセット値に対して、特定されたエントリの符号と特定された最小の符号との差に階層番号を乗じた値を加算することで得られる配置位置から階層番号分の文字又は文字列を読み出す読み出し処理と、（Ｅ）入力符号のうち第１の符号の後ろの第２の符号以降の各符号について、第１のデータにおけるエントリを特定し、出力処理と特定処理と読み出し処理とを実施する処理とを含む。
【０２１９】
このようにデータ構造のデータ量を削減しても伸張処理を高速化することができる。
【０２２０】
なお、上で述べたような処理をコンピュータに実施させるためのプログラムを作成することができ、当該プログラムは、例えばフレキシブル・ディスク、ＣＤ−ＲＯＭなどの光ディスク、光磁気ディスク、半導体メモリ（例えばＲＯＭ）、ハードディスク等のコンピュータ読み取り可能な記憶媒体又は記憶装置に格納される。
【０２２１】
以上の実施例を含む実施形態に関し、さらに以下の付記を開示する。
【０２２２】
（付記１）
文字又は文字列に対応する符号を保持するための第１の領域と当該文字又は文字列の次に出現する文字の出現順番を各文字について保持するための第２の領域と前記文字又は文字列の次に出現する文字の出現順番に応じて出現回数又は当該出現回数が閾値を超えた場合に前記文字又は文字列と今回出現した文字とからなる文字列に対応する符号を保持するための第３の領域とを含むデータブロックを、使用される可能性のある各文字について生成し、
入力文字列に含まれる複数の文字のうち着目する文字又は文字列についてのデータブロックの第２の領域において前記入力文字列において前記着目する文字又は文字列の次に出現した文字についての出現順番が保持されており且つ第３の領域において当該出現順番のデータとして出現回数が保持されており且つ当該出現回数が今回閾値を超えることになることを検出すると、前記第３の領域において当該出現順番のデータとして、前記着目する文字又は文字列と前記次に出現した文字とからなる第２の文字列に対応する符号を格納し、
前記第２の文字列についてのデータブロックを生成する
処理をコンピュータに実行させるためのプログラム。
【０２２３】
（付記２）
前記入力文字列に含まれる複数の文字のうち着目する文字又は文字列についてのデータブロックの第２の領域において前記入力文字列において前記着目する文字又は文字列の次に出現した文字についての出現順番が保持されており且つ第３の領域において当該出現順番のデータとして出現回数が保持されており且つ当該出現回数を増分しても閾値を超えないことを検出すると、前記次に出現した文字を、着目する文字に設定する
処理をさらに前記コンピュータに実行させるための付記１記載のプログラム。
【０２２４】
（付記３）
前記入力文字列に含まれる複数の文字のうち着目する文字又は文字列についてのデータブロックの第２の領域において前記入力文字列において前記着目する文字又は文字列の次に出現した文字についての出現順番が保持されており且つ前記第３の領域において当該出現順番のデータとして前記着目する文字又は文字列と前記次に出現した文字とからなる第２の文字列に対応する符号が保持されていることを検出すると、当該第２の文字列を、着目する文字列に設定する
処理をさらに前記コンピュータに実行させるための付記１又は２記載のプログラム。
【０２２５】
（付記４）
前記第３の領域が、所定出現順番までの領域に限定されており、
前記データブロックが、前記第３の領域の拡張領域を示すデータを保持する第４の領域をさらに含む、
付記１乃至３のいずれか１つ記載のプログラム。
【０２２６】
（付記５）
前記入力文字列について生成された複数のデータブロックから、当該複数のデータブロックの各データブロックについて当該データブロックの第１の領域に保持されている符号及び第３の領域に保持されている符号を当該符号に対応する文字又は文字列のコードに基づき第２の符号に付与し直した状態における複数のデータブロックで表される木構造における第１階層の各データブロックについては最上位階層を表すデータと当該データブロックの第１の領域に保持されている第２の符号に対応する文字のコードとを対応付ける第１の対応付けデータと、前記状態における複数のデータブロックで表される木構造における第２階層以降の各データブロックについては当該データブロックの第１の領域に保持されている第２の符号と当該データブロックの第３の領域に保持されている第２の符号に関連付けられている前記次に出現する文字のコードとを対応付ける第２の対応付けデータとを含むデータを生成する生成処理
をさらに前記コンピュータに実行させるための付記１乃至４のいずれか１つ記載のプログラム。
【０２２７】
（付記６）
前記第１の対応付けデータ及び前記第２の対応付けデータにおいて、
当該データブロックについて第３の領域において保持されている最も大きい第２の符号をさらに対応付けられている
付記５記載のプログラム。
【０２２８】
（付記７）
文字又は文字列に対応する符号を保持するための第１の領域と当該文字又は文字列の次に出現する文字の出現順番を各文字について保持するための第２の領域と前記文字又は文字列の次に出現する文字の出現順番に応じて出現回数又は当該出現回数が閾値を超えた場合に前記文字又は文字列と今回出現した文字とからなる文字列に対応する符号を保持するための第３の領域とを含むデータブロックを、使用される可能性のある各文字と、既にデータブロックが生成されている、入力文字列内の文字又は文字列の次に所定の出現回数以上出現する文字とについて生成する第１生成処理と、
前記第１生成処理により生成された複数のデータブロックから、当該複数のデータブロックの各データブロックについて当該データブロックの第１の領域に保持されている符号及び第３の領域に保持されている符号を当該符号に対応する文字又は文字列のコードに基づき第２の符号に付与し直した状態における複数のデータブロックで表される木構造の第１階層の各データブロックについては最上位階層を表すデータ又は当該データブロックについて第３の領域に保持されている最も大きい第２の符号と当該データブロックの第１の領域に保持されている第２の符号に対応する文字のコードと階層番号とを対応付ける第１の対応付けデータと、前記状態における複数のデータブロックで表される木構造の第２階層以降の各データブロックについては当該データブロックの第１の領域に保持されている第２の符号又は当該データブロックについて第３の領域に保持されている最も大きい第２の符号と当該データブロックの第３の領域に保持されている第２の符号に関連付けられている前記次に出現する文字のコードと階層番号とを対応付ける第２の対応付けデータとを含むデータを生成する第２生成処理と、
前記状態における複数のデータブロックで表される木構造の第２階層以降の各階層に属する各データブロックの第１の領域に保持されている第２の符号に対応する文字列のコードを含む第１のデータを生成する第３生成処理と、
前記状態における複数のデータブロックで表される木構造の第２階層以降の各階層について当該階層内のデータブロック数と当該階層内のデータブロックの第１の領域に保持されている最小の第２の符号と前記第１のデータにおいて当該最小の第２の符号に対応する文字又は文字列の配置位置の、先頭からのオフセット値とを対応付ける階層情報を生成する第４の生成処理と、
をコンピュータに実行させるためのプログラム。
【０２２９】
（付記８）
文字又は文字列に対応する符号を保持するための第１の領域と当該文字又は文字列の次に出現する文字の出現順番を各文字について保持するための第２の領域と前記文字又は文字列の次に出現する文字の出現順番に応じて出現回数又は当該出現回数が閾値を超えた場合に前記文字又は文字列と今回出現した文字とからなる文字列に対応する符号を保持するための第３の領域とを含むデータブロックを各ノードのデータとして含む文節木のデータ構造。
【０２３０】
（付記９）
文節木に対応するデータ構造であって、
前記文節木の各ノードについて、当該ノードの親ノードの符号と、当該ノードで表される文字のコードとを対応付ける対応付けデータが、各ノードの符号の順番に並べられた
データ構造。
【０２３１】
（付記１０）
前記対応付けデータが、さらに当該ノードの子ノードの符号のうち最大の符号をさらに対応付けている付記９記載のデータ構造。
【０２３２】
（付記１１）
文節木に対応する第１のデータと、
前記文節木の各ノードに対応する文字又は文字列についての第２のデータと、
前記文節木の階層についての第３のデータと、
を有するデータ構造であって、
前記第１のデータにおいて、
前記文節木の各ノードについて、当該ノードの親ノードの符号又は当該ノードの子ノードの符号のうち最大の符号と、当該ノードで表される文字のコードと、当該ノードが所属する階層とを対応付けるデータが、各ノードの符号の順番に並べられており、
前記第２のデータは、
前記文節木の第２階層以降の各階層の各ノードについて当該ノードに対応する文字又は文字列のコードを当該ノードの符号の順に含み、
前記第３のデータは、
前記文節木の第２階層以降の各階層について、当該階層に属するノードの数と、当該階層に属するノードの符号のうち最小の符号と、前記第２のデータにおいて当該最小の第２の符号に対応する文字又は文字列の配置位置の、先頭からのオフセット値とを対応付けるデータを含む
データ構造。
【０２３３】
（付記１２）
文節木に対応するデータ構造であって、前記文節木の各ノードについて、当該ノードの親ノードの符号と、当該ノードで表される文字のコードとを対応付ける対応付けデータが、各ノードの符号の順番に並べられたデータ構造において、入力文字列に含まれる第１の文字に対応する符号の対応付けデータを参照する処理と、
前記親ノードの符号が、参照している前記対応付けデータに対応するノードの符号となっており且つ前記ノードで表される文字のコードが前記入力文字列において次に現れる第２の文字のコードとなっている対応付けデータを、前記データ構造において探索する探索処理と、
対応付けデータが検出された場合には、当該対応付けデータを参照する第１参照処理と、
対応付けデータが検出されない場合には、参照している前記対応付けデータの符号を出力し、前記第２の文字に対応する符号の対応付けデータを参照する第２参照処理と、
前記探索処理と前記第１参照処理と前記第２参照処理とを、前記入力文字列の最後の文字を処理するまで、前記第２の文字を前記入力文字列の文字の順に移動させつつ実施し、前記入力文字の最後の文字を処理した後に、参照している前記対応付けデータの符号を出力する処理と、
を、コンピュータに実行させるための圧縮プログラム。
【０２３４】
（付記１３）
前記探索処理において、
前記データ構造の第１階層についての対応付けデータを参照している場合には、第２階層以降の対応付けデータを探索し、
前記データ構造の第２階層以降の階層についての対応付けデータを参照している場合には、参照している対応付けデータの符号より後ろの対応付けデータを探索する
付記１２記載の圧縮プログラム。
【０２３５】
（付記１４）
前記対応付けデータが、さらに前記ノードの子ノードの符号のうち最大の符号をさらに対応付けており、
前記探索処理において、
前記データ構造の第１階層についての対応付けデータを参照している場合には、第２階層に属する最初の対応付けデータから、参照している対応付けデータに含まれる最大の符号の対応付けデータまでを探索し、
前記データ構造の第２階層以降の階層についての対応付けデータを参照している場合には、参照している対応付けデータの１つ前の対応付けデータに含まれる最大の符号の対応付けデータから、参照している対応付けデータに含まれる最大の符号の対応付けデータまでを探索する
付記１２記載の圧縮プログラム。
【０２３６】
（付記１５）
前記対応付けデータが、さらに当該ノードの属する階層の階層番号をさらに対応付けており、
前記探索処理において、
前記データ構造において参照している対応データの階層番号の次の階層番号が対応付けられている対応付けデータを探索する
付記１２記載の圧縮プログラム。
【０２３７】
（付記１６）
文節木に対応する第１のデータと前記文節木の階層についての第２のデータとを有するデータ構造であって、前記第１のデータにおいて、前記文節木の各ノードについて、当該ノードの親ノードの符号と、当該ノードで表される文字のコードと、当該ノードが所属する階層とを対応付けデータが、各ノードの符号の順番に並べられており、前記第２のデータは、前記文節木の各階層について、当該階層に属するノードの数と、当該階層に属するノードの符号のうち最小の符号とを対応付けるデータを含む前記データ構造に含まれる前記第１のデータにおいて、入力文字列に含まれる第１の文字に対応する符号の対応付けデータを参照する処理と、
前記親ノードの符号が、参照している前記対応付けデータに対応するノードの符号となっており且つ前記ノードで表される文字のコードが前記入力文字列において次に現れる第２の文字のコードとなっている対応付けデータを、前記第２のデータにおいて、参照している対応付けデータに対応するノードの階層の１階層下の階層に属するノードの数及び前記最小の符号とから特定される範囲を前記第１のデータについて探索する探索処理と、
対応付けデータが検出された場合には、当該対応付けデータを参照する第１参照処理と、
対応付けデータが検出されない場合には、参照している前記対応付けデータの符号を出力し、前記第２の文字に対応する符号の対応付けデータを参照する第２参照処理と、
前記探索処理と前記第１参照処理と前記第２参照処理とを、前記入力文字列の最後の文字を処理するまで、前記第２の文字を前記入力文字列の文字の順に移動させつつ実施し、前記入力文字の最後の文字を処理した後に、参照している前記対応付けデータの符号を出力する処理と、
をコンピュータに実行させるための圧縮プログラム。
【０２３８】
（付記１７）
文節木に対応するデータ構造であって、前記文節木の各ノードについて、当該ノードの子ノードの符号のうち最大の符号と、当該ノードで表される文字のコードとを対応付ける対応付けデータが、各ノードの符号の順番に並べられたデータ構造において、入力文字列に含まれる第１の文字に対応する符号の対応付けデータを参照する処理と、
前記ノードで表される文字のコードが前記入力文字列において次に現れる第２の文字のコードとなっている対応付けデータを、前記データ構造において探索する探索処理と、
対応付けデータが検出された場合には、当該対応付けデータを参照する第１参照処理と、
対応付けデータが検出されない場合には、参照している前記対応付けデータの符号を出力し、前記第２の文字に対応する符号の対応付けデータを参照する第２参照処理と、
前記探索処理と前記第１参照処理と前記第２参照処理とを、前記入力文字列の最後の文字を処理するまで、前記第２の文字を前記入力文字列の文字の順に移動させつつ実施し、前記入力文字の最後の文字を処理した後に、参照している前記対応付けデータの符号を出力する処理と、
を、コンピュータに実行させ、
前記探索処理においては、
前記データ構造の第１階層についての対応付けデータを参照している場合には、第２階層に属する最初の対応付けデータから、参照している対応付けデータに含まれる最大の符号の対応付けデータまでを探索し、
前記データ構造の第２階層以降の階層についての対応付けデータを参照している場合には、参照している対応付けデータの１つ前の対応付けデータに含まれる最大の符号の対応付けデータから、参照している対応付けデータに含まれる最大の符号の対応付けデータまでを探索する
圧縮プログラム。
【０２３９】
（付記１８）
文節木に対応するデータ構造であって、前記文節木の各ノードについて、当該ノードの親ノードの符号と、当該ノードで表される文字のコードとを対応付ける対応付けデータが、各ノードの符号の順番に並べられたデータ構造において、入力符号のうち第１の符号の順番の対応付けデータを特定する処理と、
特定された前記対応付けデータに含まれる文字のコードをメモリに格納する格納処理と、
特定された前記対応付けデータに含まれる親ノードの符号が前記文節木の根ノード以外のノードの符号を示している場合には、当該親ノードの符号の対応付けデータを参照する参照処理と、
特定された前記対応付けデータに含まれる親ノードの符号が前記文節木の根ノードの符号を示している場合には、前記メモリに格納されている文字のコードを逆順に出力する出力処理と、
前記格納処理と前記参照処理と前記出力処理とを、前記入力符号のうち前記第１の符号より後ろの各符号について順番に実施する処理と、
を、コンピュータに実行させるための伸張プログラム。
【０２４０】
（付記１９）
文節木に対応する第１のデータと、
前記文節木の各ノードに対応する文字又は文字列についての第２のデータと、
前記文節木の階層についての第３のデータと、
を有し且つデータ格納部に格納されているデータ構造であって、
前記第１のデータにおいて、
前記文節木の各ノードについて、当該ノードが所属する階層の階層番号を含むエントリが、各ノードの符号の順番に並べられており、
前記第２のデータは、
前記文節木の各階層の各ノードについて当該ノードに対応する文字又は文字列を当該ノードの符号の順に含み、
前記第３のデータは、
前記文節木の各階層について、当該階層に属するノードの符号のうち最小の符号と、前記第２のデータにおいて当該最小の第２の符号に対応する文字又は文字列の配置位置の、先頭からのオフセット値とを対応付けるデータを含む
前記データ構造に含まれる前記第１のデータにおいて、入力符号のうち第１の符号の順番のエントリを特定する処理と、
特定された前記エントリに含まれる階層番号に従って前記第３のデータにおいて前記最小の符号と前記オフセット値とを特定する特定処理と、
前記第２のデータから、特定された前記オフセット値に対して、特定された前記エントリの符号と特定された前記最小の符号との差に前記階層番号を乗じた値を加算することで得られる配置位置から前記階層番号分の文字又は文字列を読み出す読み出し処理と、
前記入力符号のうち前記第１の符号の後ろの第２の符号以降の各符号について、前記第１のデータにおけるエントリを特定し、前記特定処理と前記読み出し処理とを実施する処理と、
を、コンピュータに実行させるための伸張プログラム。
【０２４１】
（付記２０）
文節木に対応する第１のデータと、
前記文節木の各ノードに対応する文字又は文字列についての第２のデータと、
前記文節木の階層についての第３のデータと、
を有し且つデータ格納部に格納されているデータ構造であって、
前記第１のデータにおいて、
前記文節木の各ノードについて、当該ノードが所属する階層の階層番号を含むエントリが、各ノードの符号の順番に並べられており、
前記第２のデータは、
前記文節木の第２の階層以降の各階層の各ノードについて当該ノードに対応する文字列を当該ノードの符号の順に含み、
前記第３のデータは、
前記文節木の第２の階層以降の各階層について、当該階層に属するノードの符号のうち最小の符号と、前記第２のデータにおいて当該最小の第２の符号に対応する文字又は文字列の配置位置の、先頭からのオフセット値とを対応付けるデータを含む
前記データ構造に含まれる前記第１のデータにおいて、入力符号のうち第１の符号の順番のエントリを特定する処理と、
特定された前記エントリが第１の階層におけるエントリであれば、特定された前記エントリの符号に対応する文字を出力する出力処理と、
特定された前記エントリが第２の階層以降のエントリであれば、特定された前記エントリに含まれる階層番号に従って前記第３のデータにおいて前記最小の符号と前記オフセット値とを特定する特定処理と、
前記第２のデータにおいて、特定された前記オフセット値に対して、特定された前記エントリの符号と特定された前記最小の符号との差に前記階層番号を乗じた値を加算することで得られる配置位置から前記階層番号分の文字又は文字列を読み出す読み出し処理と、
前記入力符号のうち前記第１の符号の後ろの第２の符号以降の各符号について、前記第１のデータにおけるエントリを特定し、前記出力処理と前記特定処理と前記読み出し処理とを実施する処理と、
を、コンピュータに実行させるためのプログラム。
【０２４２】
（付記２１）
文字又は文字列に対応する符号を保持するための第１の領域と当該文字又は文字列の次に出現する文字の出現順番を各文字について保持するための第２の領域と前記文字又は文字列の次に出現する文字の出現順番に応じて出現回数又は当該出現回数が閾値を超えた場合に前記文字又は文字列と今回出現した文字とからなる文字列に対応する符号を保持するための第３の領域とを含むデータブロックを、使用される可能性のある各文字について生成し、
入力文字列に含まれる複数の文字のうち着目する文字又は文字列についてのデータブロックの第２の領域において前記入力文字列において前記着目する文字又は文字列の次に出現した文字についての出現順番が保持されており且つ第３の領域において当該出現順番のデータとして出現回数が保持されており且つ当該出現回数が今回閾値を超えることになることを検出すると、前記第３の領域において当該出現順番のデータとして、前記着目する文字又は文字列と前記次に出現した文字とからなる第２の文字列に対応する符号を格納し、
前記第２の文字列についてのデータブロックを生成する
処理がコンピュータにより実行される情報処理方法。
【０２４３】
（付記２２）
文字又は文字列に対応する符号を保持するための第１の領域と当該文字又は文字列の次に出現する文字の出現順番を各文字について保持するための第２の領域と前記文字又は文字列の次に出現する文字の出現順番に応じて出現回数又は当該出現回数が閾値を超えた場合に前記文字又は文字列と今回出現した文字とからなる文字列に対応する符号を保持するための第３の領域とを含むデータブロックを、使用される可能性のある各文字について生成する手段と、
入力文字列に含まれる複数の文字のうち着目する文字又は文字列についてのデータブロックの第２の領域において前記入力文字列において前記着目する文字又は文字列の次に出現した文字についての出現順番が保持されており且つ第３の領域において当該出現順番のデータとして出現回数が保持されており且つ当該出現回数が今回閾値を超えることになることを検出すると、前記第３の領域において当該出現順番のデータとして、前記着目する文字又は文字列と前記次に出現した文字とからなる第２の文字列に対応する符号を格納する手段と、
前記第２の文字列についてのデータブロックを生成する手段と、
を有する情報処理装置。
【０２４４】
（付記２３）
文字又は文字列に対応する符号を保持するための第１の領域と当該文字又は文字列の次に出現する文字の出現順番を各文字について保持するための第２の領域と前記文字又は文字列の次に出現する文字の出現順番に応じて出現回数又は当該出現回数が閾値を超えた場合に前記文字又は文字列と今回出現した文字とからなる文字列に対応する符号を保持するための第３の領域とを含むデータブロックを、使用される可能性のある各文字と、既にデータブロックが生成されている、入力文字列内の文字又は文字列の次に所定の出現回数以上出現する文字とについて生成する第１生成処理と、
前記第１生成処理により生成された複数のデータブロックから、当該複数のデータブロックの各データブロックについて当該データブロックの第１の領域に保持されている符号及び第３の領域に保持されている符号を当該符号に対応する文字又は文字列のコードに基づき第２の符号に付与し直した状態における複数のデータブロックで表される木構造の第１階層の各データブロックについては最上位階層を表すデータ又は当該データブロックについて第３の領域に保持されている最も大きい第２の符号と当該データブロックの第１の領域に保持されている第２の符号に対応する文字のコードと階層番号とを対応付ける第１の対応付けデータと、前記状態における複数のデータブロックで表される木構造の第２階層以降の各データブロックについては当該データブロックの第１の領域に保持されている第２の符号又は当該データブロックについて第３の領域に保持されている最も大きい第２の符号と当該データブロックの第３の領域に保持されている第２の符号に関連付けられている前記次に出現する文字のコードと階層番号とを対応付ける第２の対応付けデータとを含むデータを生成する第２生成処理と、
前記状態における複数のデータブロックで表される木構造の第２階層以降の各階層に属する各データブロックの第１の領域に保持されている第２の符号に対応する文字列のコードを含む第１のデータを生成する第３生成処理と、
前記状態における複数のデータブロックで表される木構造の第２階層以降の各階層について当該階層内のデータブロック数と当該階層内のデータブロックの第１の領域に保持されている最小の第２の符号と前記第１のデータにおいて当該最小の第２の符号に対応する文字又は文字列の配置位置の、先頭からのオフセット値とを対応付ける階層情報を生成する第４の生成処理と、
がコンピュータにより実行される情報処理方法。
【０２４５】
（付記２４）
文字又は文字列に対応する符号を保持するための第１の領域と当該文字又は文字列の次に出現する文字の出現順番を各文字について保持するための第２の領域と前記文字又は文字列の次に出現する文字の出現順番に応じて出現回数又は当該出現回数が閾値を超えた場合に前記文字又は文字列と今回出現した文字とからなる文字列に対応する符号を保持するための第３の領域とを含むデータブロックを、使用される可能性のある各文字と、既にデータブロックが生成されている、入力文字列内の文字又は文字列の次に所定の出現回数以上出現する文字とについて生成する手段と、
前記第１生成手段により生成された複数のデータブロックから、当該複数のデータブロックの各データブロックについて当該データブロックの第１の領域に保持されている符号及び第３の領域に保持されている符号を当該符号に対応する文字又は文字列のコードに基づき第２の符号に付与し直した状態における複数のデータブロックで表される木構造の第１階層の各データブロックについては最上位階層を表すデータ又は当該データブロックについて第３の領域に保持されている最も大きい第２の符号と当該データブロックの第１の領域に保持されている第２の符号に対応する文字のコードと階層番号とを対応付ける第１の対応付けデータと、前記状態における複数のデータブロックで表される木構造の第２階層以降の各データブロックについては当該データブロックの第１の領域に保持されている第２の符号又は当該データブロックについて第３の領域に保持されている最も大きい第２の符号と当該データブロックの第３の領域に保持されている第２の符号に関連付けられている前記次に出現する文字のコードと階層番号とを対応付ける第２の対応付けデータとを含むデータを生成する手段と、
前記状態における複数のデータブロックで表される木構造の第２階層以降の各階層に属する各データブロックの第１の領域に保持されている第２の符号に対応する文字列のコードを含む第１のデータを生成する手段と、
前記状態における複数のデータブロックで表される木構造の第２階層以降の各階層について当該階層内のデータブロック数と当該階層内のデータブロックの第１の領域に保持されている最小の第２の符号と前記第１のデータにおいて当該最小の第２の符号に対応する文字又は文字列の配置位置の、先頭からのオフセット値とを対応付ける階層情報を生成する手段と、
を有する情報処理装置。
【０２４６】
（付記２５）
文節木に対応するデータ構造であって、前記文節木の各ノードについて、当該ノードの親ノードの符号と、当該ノードで表される文字のコードとを対応付ける対応付けデータが、各ノードの符号の順番に並べられたデータ構造において、入力文字列に含まれる第１の文字に対応する符号の対応付けデータを参照する処理と、
前記親ノードの符号が、参照している前記対応付けデータに対応するノードの符号となっており且つ前記ノードで表される文字のコードが前記入力文字列において次に現れる第２の文字のコードとなっている対応付けデータを、前記データ構造において探索する探索処理と、
対応付けデータが検出された場合には、当該対応付けデータを参照する第１参照処理と、
対応付けデータが検出されない場合には、参照している前記対応付けデータの符号を出力し、前記第２の文字に対応する符号の対応付けデータを参照する第２参照処理と、
前記探索処理と前記第１参照処理と前記第２参照処理とを、前記入力文字列の最後の文字を処理するまで、前記第２の文字を前記入力文字列の文字の順に移動させつつ実施し、前記入力文字の最後の文字を処理した後に、参照している前記対応付けデータの符号を出力する処理と、
が、コンピュータにより実行される圧縮方法。
【０２４７】
（付記２６）
文節木に対応するデータ構造であって、前記文節木の各ノードについて、当該ノードの親ノードの符号と、当該ノードで表される文字のコードとを対応付ける対応付けデータが、各ノードの符号の順番に並べられたデータ構造において、入力文字列に含まれる第１の文字に対応する符号の対応付けデータを参照する手段と、
前記親ノードの符号が、参照している前記対応付けデータに対応するノードの符号となっており且つ前記ノードで表される文字のコードが前記入力文字列において次に現れる第２の文字のコードとなっている対応付けデータを、前記データ構造において探索する探索手段と、
対応付けデータが検出された場合には、当該対応付けデータを参照する第１参照手段と、
対応付けデータが検出されない場合には、参照している前記対応付けデータの符号を出力し、前記第２の文字に対応する符号の対応付けデータを参照する第２参照手段と、
前記探索手段と前記第１参照手段と前記第２参照手段とを、前記入力文字列の最後の文字を処理するまで、前記第２の文字を前記入力文字列の文字の順に移動させつつ動作させ、前記入力文字の最後の文字を処理した後に、参照している前記対応付けデータの符号を出力する手段と、
を有する情報処理装置。
【０２４８】
（付記２７）
文節木に対応する第１のデータと前記文節木の階層についての第２のデータとを有するデータ構造であって、前記第１のデータにおいて、前記文節木の各ノードについて、当該ノードの親ノードの符号と、当該ノードで表される文字のコードと、当該ノードが所属する階層とを対応付けデータが、各ノードの符号の順番に並べられており、前記第２のデータは、前記文節木の各階層について、当該階層に属するノードの数と、当該階層に属するノードの符号のうち最小の符号とを対応付けるデータを含む前記データ構造に含まれる前記第１のデータにおいて、入力文字列に含まれる第１の文字に対応する符号の対応付けデータを参照する処理と、
前記親ノードの符号が、参照している前記対応付けデータに対応するノードの符号となっており且つ前記ノードで表される文字のコードが前記入力文字列において次に現れる第２の文字のコードとなっている対応付けデータを、前記第２のデータにおいて、参照している対応付けデータに対応するノードの階層の１階層下の階層に属するノードの数及び前記最小の符号とから特定される範囲を前記第１のデータについて探索する探索処理と、
対応付けデータが検出された場合には、当該対応付けデータを参照する第１参照処理と、
対応付けデータが検出されない場合には、参照している前記対応付けデータの符号を出力し、前記第２の文字に対応する符号の対応付けデータを参照する第２参照処理と、
前記探索処理と前記第１参照処理と前記第２参照処理とを、前記入力文字列の最後の文字を処理するまで、前記第２の文字を前記入力文字列の文字の順に移動させつつ実施し、前記入力文字の最後の文字を処理した後に、参照している前記対応付けデータの符号を出力する処理と、
が、コンピュータにより実行される圧縮方法。
【０２４９】
（付記２８）
文節木に対応する第１のデータと前記文節木の階層についての第２のデータとを有するデータ構造であって、前記第１のデータにおいて、前記文節木の各ノードについて、当該ノードの親ノードの符号と、当該ノードで表される文字のコードと、当該ノードが所属する階層とを対応付けデータが、各ノードの符号の順番に並べられており、前記第２のデータは、前記文節木の各階層について、当該階層に属するノードの数と、当該階層に属するノードの符号のうち最小の符号とを対応付けるデータを含む前記データ構造に含まれる前記第１のデータにおいて、入力文字列に含まれる第１の文字に対応する符号の対応付けデータを参照する手段と、
前記親ノードの符号が、参照している前記対応付けデータに対応するノードの符号となっており且つ前記ノードで表される文字のコードが前記入力文字列において次に現れる第２の文字のコードとなっている対応付けデータを、前記第２のデータにおいて、参照している対応付けデータに対応するノードの階層の１階層下の階層に属するノードの数及び前記最小の符号とから特定される範囲を前記第１のデータについて探索する探索手段と、
対応付けデータが検出された場合には、当該対応付けデータを参照する第１参照手段と、
対応付けデータが検出されない場合には、参照している前記対応付けデータの符号を出力し、前記第２の文字に対応する符号の対応付けデータを参照する第２参照手段と、
前記探索手段と前記第１参照手段と前記第２参照手段とを、前記入力文字列の最後の文字を処理するまで、前記第２の文字を前記入力文字列の文字の順に移動させつつ動作させ、前記入力文字の最後の文字を処理した後に、参照している前記対応付けデータの符号を出力する手段と、
を有する情報処理装置。
【０２５０】
（付記２９）
文節木に対応するデータ構造であって、前記文節木の各ノードについて、当該ノードの子ノードの符号のうち最大の符号と、当該ノードで表される文字のコードとを対応付ける対応付けデータが、各ノードの符号の順番に並べられたデータ構造において、入力文字列に含まれる第１の文字に対応する符号の対応付けデータを参照する処理と、
前記ノードで表される文字のコードが前記入力文字列において次に現れる第２の文字のコードとなっている対応付けデータを、前記データ構造において探索する探索処理と、
対応付けデータが検出された場合には、当該対応付けデータを参照する第１参照処理と、
対応付けデータが検出されない場合には、参照している前記対応付けデータの符号を出力し、前記第２の文字に対応する符号の対応付けデータを参照する第２参照処理と、
前記探索処理と前記第１参照処理と前記第２参照処理とを、前記入力文字列の最後の文字を処理するまで、前記第２の文字を前記入力文字列の文字の順に移動させつつ実施し、前記入力文字の最後の文字を処理した後に、参照している前記対応付けデータの符号を出力する処理と、
が、コンピュータにより実行され、
前記探索処理においては、
前記データ構造の第１階層についての対応付けデータを参照している場合には、第２階層に属する最初の対応付けデータから、参照している対応付けデータに含まれる最大の符号の対応付けデータまでを探索し、
前記データ構造の第２階層以降の階層についての対応付けデータを参照している場合には、参照している対応付けデータの１つ前の対応付けデータに含まれる最大の符号の対応付けデータから、参照している対応付けデータに含まれる最大の符号の対応付けデータまでを探索する
圧縮方法。
【０２５１】
（付記３０）
文節木に対応するデータ構造であって、前記文節木の各ノードについて、当該ノードの子ノードの符号のうち最大の符号と、当該ノードで表される文字のコードとを対応付ける対応付けデータが、各ノードの符号の順番に並べられたデータ構造において、入力文字列に含まれる第１の文字に対応する符号の対応付けデータを参照する手段と、
前記ノードで表される文字のコードが前記入力文字列において次に現れる第２の文字のコードとなっている対応付けデータを、前記データ構造において探索する探索手段と、
対応付けデータが検出された場合には、当該対応付けデータを参照する第１参照手段と、
対応付けデータが検出されない場合には、参照している前記対応付けデータの符号を出力し、前記第２の文字に対応する符号の対応付けデータを参照する第２参照手段と、
前記探索手段と前記第１参照手段と前記第２参照手段とを、前記入力文字列の最後の文字を処理するまで、前記第２の文字を前記入力文字列の文字の順に移動させつつ動作させ、前記入力文字の最後の文字を処理した後に、参照している前記対応付けデータの符号を出力する手段と、
を有し、
前記探索手段が、
前記データ構造の第１階層についての対応付けデータを参照している場合には、第２階層に属する最初の対応付けデータから、参照している対応付けデータに含まれる最大の符号の対応付けデータまでを探索し、
前記データ構造の第２階層以降の階層についての対応付けデータを参照している場合には、参照している対応付けデータの１つ前の対応付けデータに含まれる最大の符号の対応付けデータから、参照している対応付けデータに含まれる最大の符号の対応付けデータまでを探索する
情報処理装置。
【０２５２】
（付記３１）
文節木に対応するデータ構造であって、前記文節木の各ノードについて、当該ノードの親ノードの符号と、当該ノードで表される文字のコードとを対応付ける対応付けデータが、各ノードの符号の順番に並べられたデータ構造において、入力符号のうち第１の符号の順番の対応付けデータを特定する処理と、
特定された前記対応付けデータに含まれる文字のコードをメモリに格納する格納処理と、
特定された前記対応付けデータに含まれる親ノードの符号が前記文節木の根ノード以外のノードの符号を示している場合には、当該親ノードの符号の対応付けデータを参照する参照処理と、
特定された前記対応付けデータに含まれる親ノードの符号が前記文節木の根ノードの符号を示している場合には、前記メモリに格納されている文字のコードを逆順に出力する出力処理と、
前記格納処理と前記参照処理と前記出力処理とを、前記入力符号のうち前記第１の符号より後ろの各符号について順番に実施する処理と、
が、コンピュータにより実行される伸張方法。
【０２５３】
（付記３２）
文節木に対応するデータ構造であって、前記文節木の各ノードについて、当該ノードの親ノードの符号と、当該ノードで表される文字のコードとを対応付ける対応付けデータが、各ノードの符号の順番に並べられたデータ構造において、入力符号のうち第１の符号の順番の対応付けデータを特定する手段と、
特定された前記対応付けデータに含まれる文字のコードをメモリに格納する格納処理手段と、
特定された前記対応付けデータに含まれる親ノードの符号が前記文節木の根ノード以外のノードの符号を示している場合には、当該親ノードの符号の対応付けデータを参照する参照手段と、
特定された前記対応付けデータに含まれる親ノードの符号が前記文節木の根ノードの符号を示している場合には、前記メモリに格納されている文字のコードを逆順に出力する出力手段と、
前記格納処理手段と前記参照手段と前記出力手段とを、前記入力符号のうち前記第１の符号より後ろの各符号について順番に動作させる手段と、
を有する情報処理装置。
【０２５４】
（付記３３）
文節木に対応する第１のデータと、
前記文節木の各ノードに対応する文字又は文字列についての第２のデータと、
前記文節木の階層についての第３のデータと、
を有し且つデータ格納部に格納されているデータ構造であって、
前記第１のデータにおいて、
前記文節木の各ノードについて、当該ノードが所属する階層の階層番号を含むエントリが、各ノードの符号の順番に並べられており、
前記第２のデータは、
前記文節木の各階層の各ノードについて当該ノードに対応する文字又は文字列を当該ノードの符号の順に含み、
前記第３のデータは、
前記文節木の各階層について、当該階層に属するノードの符号のうち最小の符号と、前記第２のデータにおいて当該最小の第２の符号に対応する文字又は文字列の配置位置の、先頭からのオフセット値とを対応付けるデータを含む
前記データ構造に含まれる前記第１のデータにおいて、入力符号のうち第１の符号の順番のエントリを特定する処理と、
特定された前記エントリに含まれる階層番号に従って前記第３のデータにおいて前記最小の符号と前記オフセット値とを特定する特定処理と、
前記第２のデータから、特定された前記オフセット値に対して、特定された前記エントリの符号と特定された前記最小の符号との差に前記階層番号を乗じた値を加算することで得られる配置位置から前記階層番号分の文字又は文字列を読み出す読み出し処理と、
前記入力符号のうち前記第１の符号の後ろの第２の符号以降の各符号について、前記第１のデータにおけるエントリを特定し、前記特定処理と前記読み出し処理とを実施する処理と、
が、コンピュータにより実行される伸張方法。
【０２５５】
（付記３４）
文節木に対応する第１のデータと、
前記文節木の各ノードに対応する文字又は文字列についての第２のデータと、
前記文節木の階層についての第３のデータと、
を有し且つデータ格納部に格納されているデータ構造であって、
前記第１のデータにおいて、
前記文節木の各ノードについて、当該ノードが所属する階層の階層番号を含むエントリが、各ノードの符号の順番に並べられており、
前記第２のデータは、
前記文節木の各階層の各ノードについて当該ノードに対応する文字又は文字列を当該ノードの符号の順に含み、
前記第３のデータは、
前記文節木の各階層について、当該階層に属するノードの符号のうち最小の符号と、前記第２のデータにおいて当該最小の第２の符号に対応する文字又は文字列の配置位置の、先頭からのオフセット値とを対応付けるデータを含む
前記データ構造に含まれる前記第１のデータにおいて、入力符号のうち第１の符号の順番のエントリを特定する手段と、
特定された前記エントリに含まれる階層番号に従って前記第３のデータにおいて前記最小の符号と前記オフセット値とを特定する特定手段と、
前記第２のデータから、特定された前記オフセット値に対して、特定された前記エントリの符号と特定された前記最小の符号との差に前記階層番号を乗じた値を加算することで得られる配置位置から前記階層番号分の文字又は文字列を読み出す読み出し手段と、
前記入力符号のうち前記第１の符号の後ろの第２の符号以降の各符号について、前記第１のデータにおけるエントリを特定し、前記特定手段と前記読み出し手段とを動作させる手段と、
を有する情報処理装置。
【０２５６】
（付記３５）
文節木に対応する第１のデータと、
前記文節木の各ノードに対応する文字又は文字列についての第２のデータと、
前記文節木の階層についての第３のデータと、
を有し且つデータ格納部に格納されているデータ構造であって、
前記第１のデータにおいて、
前記文節木の各ノードについて、当該ノードが所属する階層の階層番号を含むエントリが、各ノードの符号の順番に並べられており、
前記第２のデータは、
前記文節木の第２の階層以降の各階層の各ノードについて当該ノードに対応する文字列を当該ノードの符号の順に含み、
前記第３のデータは、
前記文節木の第２の階層以降の各階層について、当該階層に属するノードの符号のうち最小の符号と、前記第２のデータにおいて当該最小の第２の符号に対応する文字又は文字列の配置位置の、先頭からのオフセット値とを対応付けるデータを含む
前記データ構造に含まれる前記第１のデータにおいて、入力符号のうち第１の符号の順番のエントリを特定する処理と、
特定された前記エントリが第１の階層におけるエントリであれば、特定された前記エントリの符号に対応する文字を出力する出力処理と、
特定された前記エントリが第２の階層以降のエントリであれば、特定された前記エントリに含まれる階層番号に従って前記第３のデータにおいて前記最小の符号と前記オフセット値とを特定する特定処理と、
前記第２のデータにおいて、特定された前記オフセット値に対して、特定された前記エントリの符号と特定された前記最小の符号との差に前記階層番号を乗じた値を加算することで得られる配置位置から前記階層番号分の文字又は文字列を読み出す読み出し処理と、
前記入力符号のうち前記第１の符号の後ろの第２の符号以降の各符号について、前記第１のデータにおけるエントリを特定し、前記出力処理と前記特定処理と前記読み出し処理とを実施する処理と、
が、コンピュータにより実行される伸張方法。
【０２５７】
（付記３６）
文節木に対応する第１のデータと、
前記文節木の各ノードに対応する文字又は文字列についての第２のデータと、
前記文節木の階層についての第３のデータと、
を有し且つデータ格納部に格納されているデータ構造であって、
前記第１のデータにおいて、
前記文節木の各ノードについて、当該ノードが所属する階層の階層番号を含むエントリが、各ノードの符号の順番に並べられており、
前記第２のデータは、
前記文節木の第２の階層以降の各階層の各ノードについて当該ノードに対応する文字列を当該ノードの符号の順に含み、
前記第３のデータは、
前記文節木の第２の階層以降の各階層について、当該階層に属するノードの符号のうち最小の符号と、前記第２のデータにおいて当該最小の第２の符号に対応する文字又は文字列の配置位置の、先頭からのオフセット値とを対応付けるデータを含む
前記データ構造に含まれる前記第１のデータにおいて、入力符号のうち第１の符号の順番のエントリを特定する手段と、
特定された前記エントリが第１の階層におけるエントリであれば、特定された前記エントリの符号に対応する文字を出力する出力手段と、
特定された前記エントリが第２の階層以降のエントリであれば、特定された前記エントリに含まれる階層番号に従って前記第３のデータにおいて前記最小の符号と前記オフセット値とを特定する特定手段と、
前記第２のデータにおいて、特定された前記オフセット値に対して、特定された前記エントリの符号と特定された前記最小の符号との差に前記階層番号を乗じた値を加算することで得られる配置位置から前記階層番号分の文字又は文字列を読み出す読み出し手段と、
前記入力符号のうち前記第１の符号の後ろの第２の符号以降の各符号について、前記第１のデータにおけるエントリを特定し、前記出力手段と前記特定手段と前記読み出し手段とを動作させる処理と、
を有する情報処理装置。
【符号の説明】
【０２５８】
１００  情報処理装置
１１０  文節木生成部
１２０  圧縮マップ生成部
１３０  データ格納部
１４０  圧縮処理部
１５０  伸張処理部
１６０  入出力部
【図１】
0005966673.tif 000002
【図２】
0005966673.tif 000003
【図３】
0005966673.tif 000004
【図４】
0005966673.tif 000005
【図５】
0005966673.tif 000006
【図６】
0005966673.tif 000007
【図７】
0005966673.tif 000008
【図８】
0005966673.tif 000009
【図９】
0005966673.tif 000010
【図１０】
0005966673.tif 000011
【図１１】
0005966673.tif 000012
【図１２】
0005966673.tif 000013
【図１３】
0005966673.tif 000014
【図１４】
0005966673.tif 000015
【図１５】
0005966673.tif 000016
【図１６】
0005966673.tif 000017
【図１７】
0005966673.tif 000018
【図１８】
0005966673.tif 000019
【図１９】
0005966673.tif 000020
【図２０Ａ】
0005966673.tif 000021
【図２０Ｂ】
0005966673.tif 000022
【図２０Ｃ】
0005966673.tif 000023
【図２０Ｄ】
0005966673.tif 000024
【図２０Ｅ】
0005966673.tif 000025
【図２０Ｆ】
0005966673.tif 000026
【図２１】
0005966673.tif 000027
【図２２Ａ】
0005966673.tif 000028
【図２２Ｂ】
0005966673.tif 000029
【図２３】
0005966673.tif 000030
【図２４Ａ】
0005966673.tif 000031
【図２４Ｂ】
0005966673.tif 000032
【図２４Ｃ】
0005966673.tif 000033
【図２４Ｄ】
0005966673.tif 000034
【図２４Ｅ】
0005966673.tif 000035
【図２４Ｆ】
0005966673.tif 000036
【図２５】
0005966673.tif 000037
【図２６Ａ】
0005966673.tif 000038
【図２６Ｂ】
0005966673.tif 000039
【図２７】
0005966673.tif 000040
【図２８】
0005966673.tif 000041
【図２９】
0005966673.tif 000042
【図３０】
0005966673.tif 000043
【図３１】
0005966673.tif 000044
【図３２】
0005966673.tif 000045
【図３３】
0005966673.tif 000046
【図３４】
0005966673.tif 000047
【図３５】
0005966673.tif 000048
【図３６】
0005966673.tif 000049
【図３７】
0005966673.tif 000050
【図３８】
0005966673.tif 000051
【図３９】
0005966673.tif 000052
【図４０】
0005966673.tif 000053
【図４１】
0005966673.tif 000054
【図４２】
0005966673.tif 000055
【図４３】
0005966673.tif 000056
【図４４】
0005966673.tif 000057
【図４５】
0005966673.tif 000058
【図４６】
0005966673.tif 000059
【図４７】
0005966673.tif 000060
【図４８】
0005966673.tif 000061
【図４９】
0005966673.tif 000062
【図５０】
0005966673.tif 000063
【図５１】
0005966673.tif 000064
【図５２】
0005966673.tif 000065
【図５３】
0005966673.tif 000066
【図５４】
0005966673.tif 000067
【図５５】
0005966673.tif 000068
【図５６】
0005966673.tif 000069
【図５７】
0005966673.tif 000070
【図５８】
0005966673.tif 000071
【図５９】
0005966673.tif 000072
【図６０】
0005966673.tif 000073
【図６１】
0005966673.tif 000074
【図６２】
0005966673.tif 000075
【図６３】
0005966673.tif 000076
【図６４】
0005966673.tif 000077
【図６５】
0005966673.tif 000078
【図６６】
0005966673.tif 000079
【図６７】
0005966673.tif 000080
【図６８】
0005966673.tif 000081
【図６９】
0005966673.tif 000082
【図７０】
0005966673.tif 000083
【図７１】
0005966673.tif 000084
【図７２】
0005966673.tif 000085
【図７３】
0005966673.tif 000086
【図７４】
0005966673.tif 000087
【図７５】
0005966673.tif 000088
【図７６】
0005966673.tif 000089
【図７７】
0005966673.tif 000090
【図７８】
0005966673.tif 000091
【図７９】
0005966673.tif 000092
【図８０】
0005966673.tif 000093
【図８１】
0005966673.tif 000094
【図８２】
0005966673.tif 000095
【図８３】
0005966673.tif 000096
【図８４】
0005966673.tif 000097
【図８５】
0005966673.tif 000098
【図８６】
0005966673.tif 000099
【図８７】
0005966673.tif 000100
【図８８】
0005966673.tif 000101
【図８９】
0005966673.tif 000102