(57)【要約】  RRRの実用的な実装のために、ブロック圧縮に対する効率良い符号化法と復号化法の提供を目的とし、高速で省領域な符号化法と復号化法を与え、密なビット列に対しても高速に動作するRRR 実装を提供する。ブロック符号化装置は、入力ビット列を第１のブロック長の複数のブロックに分割して処理対象ブロックを生成し、処理対象ブロックのビット列に含まれる１の値の数から処理対象ブロックの第１の重みを決定し、前記処理対象ブロックを第２のブロック長の小ブロックに分割し、小ブロック毎の重みと値とに基づき前記第１のブロック長と前記第１の重みとを有する所定のビット列を所定の順序で配列した集合における前記処理対象ブロックの第１の順序を決定し、前記処理対象ブロックのビット列を、前記決定された第１の重みと第１の順序との値に変換してブロック符号化データを生成する。
2017145317.tif 000002
【特許請求の範囲】
【請求項１】
１以上のプロセッサと、
プログラムを記憶した１以上のメモリと
を備えるブロック符号化装置であって、
前記プログラムは、前記１以上のプロセッサにより実行された場合に、前記１以上のプロセッサに
入力ビット列を第１のブロック長の複数のブロックに分割して処理対象ブロックを生成し、
処理対象ブロックのビット列に含まれる１の値の数から、処理対象ブロックの第１の重みを決定し、
前記処理対象ブロックを第２のブロック長の小ブロックに分割し、小ブロック毎の重みと値とに基づき、前記第１のブロック長と前記第１の重みとを有する所定のビット列を所定の順序で配列した集合における前記処理対象ブロックの第１の順序を決定し、
前記処理対象ブロックのビット列を、前記決定された第１の重みと第１の順序との値に変換してブロック符号化データを生成する
動作を実行させることを特徴とするブロック符号化装置。
【請求項２】
前記所定の順序は、前記集合に含まれる前記所定のビット列を前記第２のブロック長の小ブロックに分割した場合に、最上位ビットを含む第１の小ブロック側から順に小ブロック毎の重み及び値がより小さいビット列がより先頭側に位置するように決定されていることを特徴とする請求項１に記載のブロック符号化装置。
【請求項３】
前記プログラムは、前記１以上のプロセッサにより実行され、前記１以上のプロセッサに前記第１の順序を決定させる場合に、
前記第１のブロック長、前記第１の重みを有するビット列が前記第２のブロック長の小ブロック内で取り得る重みの大きさごとに、前記集合において、ビット列の前記第１の小ブロックについてより小さい重みを有するビット列の数を登録する第１のテーブルを参照させ、
前記集合において、ビット列の前記第１の小ブロックにつき前記処理対象ブロックの前記第１の小ブロックのビット列が有する重みよりも小さい重みを有し、かつ、前記所定の順序において前記処理対象ブロックよりも前に位置するビット列の第１の数を算出させる
動作を実行させることを特徴とする請求項２に記載のブロック符号化装置。
【請求項４】
前記プログラムは、前記１以上のプロセッサにより実行され、前記１以上のプロセッサに前記第１の順序を決定させる場合に、
前記第２のブロック長の小ブロックが取り得る重みの大きさごとに前記小ブロックが取り得るビット列のパターン数を登録する第２のテーブルと、前記第２のブロック長の小ブロックが取り得る重みの大きさごとに前記小ブロックが取り得るビット列のパターン同士の間で定められる順序を登録する第３のテーブルとを参照させ、
前記集合において、前記処理対象ブロックの前記第１の小ブロックのビット列と重みが同一で値の異なるビット列の第１の小ブロックを有し、かつ、前記所定の順序において前記処理対象ブロックよりも前に位置するビット列の第２の数を算出させる
動作を実行させることを特徴とする請求項３に記載のブロック符号化装置。
【請求項５】
前記プログラムは、前記１以上のプロセッサにより実行され、前記１以上のプロセッサに前記第１の順序を決定させる場合に、
前記第３のテーブルを参照させ、前記集合において、前記処理対象ブロックの前記第１の小ブロックと同一の値のビット列の第１の小ブロックを有し、かつ、前記所定の順序において前記処理対象ブロックよりも前に位置するビット列の第３の数を算出させ、
前記第１の数、前記第２の数、前記第３の数を加算して前記第１の順序を決定する
動作を実行させることを特徴とする請求項４に記載のブロック符号化装置。
【請求項６】
１以上のプロセッサと、
プログラムを記憶した１以上のメモリと、
を備えるブロック復号化装置であって、
前記プログラムは、前記１以上のプロセッサにより実行された場合に、前記１以上のプロセッサに、第１の重みを有する第１のブロック長の処理対象ブロックのビット列をブロック符号化して生成されたブロック符号化データから前記処理対象ブロックのビット列を復号する動作を実行させ、
前記ブロック符号化データは、前記第１の重みと、前記第１のブロック長と前記第１の重みとを有する所定のビット列を所定の順序で配列した集合における前記処理対象ブロックの第１の順序とを含み、
前記復号する動作には、
前記処理対象ブロックを第２のブロック長の小ブロックで分割した場合の、前記処理対象ブロックの最上位ビットを含む第１の小ブロックが有する第２の重みを決定し、
前記集合において、ビット列の第１の小ブロックにつき前記第２の重みよりも小さい重みを有し、かつ、前記所定の順序において前記処理対象ブロックよりも前に位置するビット列の第１の数を決定し、
前記集合において、前記第１の順序と前記第１の数との差分に基づき、前記処理対象ブロックの前記第１の小ブロックが有するビット列と、前記処理対象ブロックの前記第１の小ブロックと重みが同じで値の異なる第１の小ブロックを有するビット列の第２の数とを決定し、
前記第１の重みと前記第２の重みとの差分と、前記集合において、前記第１の順序と前記第１の数及び前記第２の数との差分とに基づいて、前記処理対象ブロックの第２の小ブロックが有するビット列を決定する
動作が含まれる、ことを特徴とするブロック復号化装置。
【請求項７】
前記所定の順序は、前記集合に含まれる前記所定のビット列を前記第２のブロック長の小ブロックに分割した場合に、最上位ビットを含む第１の小ブロック側から順に小ブロック毎の重み及び値がより小さいビット列がより先頭側に位置するように決定されていることを特徴とする請求項６に記載のブロック復号化装置。
【請求項８】
前記プログラムは、前記１以上のプロセッサにより実行され、前記１以上のプロセッサに前記処理対象ブロックの前記第１の小ブロックの第２の重みを決定させる場合に、
前記第１のブロック長、前記第１の重みのビット列が前記第２のブロック長の小ブロック内で取り得る重みの大きさごとに、前記集合において、ビット列の前記第１の小ブロックについてより小さい重みを有するビット列の数を登録する第１のテーブルを参照させ、
前記第１のテーブルに登録されている重みのうち、前記第１の重みよりも値が小さく、かつ、該登録されている重みと関連づけられているビット列の数が前記第１の順序の数を超えない重みを選択し、
前記１以上のプロセッサに前記所定の順序において前記処理対象ブロックよりも前に位置するビット列の前記第１の数を決定させる場合に、
前記第１のテーブルにおいて前記第２の重みと関連づけられているビット列の数を選択する
動作を実行させることを特徴とする請求項７に記載のブロック復号化装置。
【請求項９】
前記プログラムは、前記１以上のプロセッサにより実行され、前記１以上のプロセッサに前記処理対象ブロックの前記第１の小ブロックが有するビット列を決定させる場合に、
前記第２のブロック長の小ブロックが取り得る重みの大きさごとに前記小ブロックが取り得るビット列のパターン数を登録する第２のテーブルと、前記第２のブロック長の小ブロックが取り得る重みの大きさと、前記小ブロックが取り得るビット列のパターン同士の間で定められる順序との組み合わせに対応するビット列を登録する第３のテーブルとを参照させ、
前記第１の順序と前記第１の数との差分と、前記第２のテーブルにおいて前記第２の重みと関連づけて登録されたパターン数とに基づき、前記第３のテーブルにおいてビット列を選択するための第２の順序を算出し、前記第３のテーブルにおいて前記第２の重みと前記第２の順序との組み合わせに対応するビット列を前記第１の小ブロックが有するビット列に決定する
動作を実行させることを特徴とする請求項８に記載のブロック復号化装置。
【請求項１０】
前記プログラムは、前記１以上のプロセッサにより実行され、前記１以上のプロセッサに前記第２の数を決定させる場合に、
前記第１の順序と前記第１の数との差分と、前記第２のテーブルにおいて前記第２の重みと関連づけて登録されたパターン数とに基づき、前記集合において、前記処理対象ブロックの前記第１の小ブロックと重みが同じで値の異なる第１の小ブロックを有し、かつ、前記所定の順序において前記処理対象ブロックよりも前に位置するビット列の数を算出させる
動作を実行させることを特徴とする請求項９に記載のブロック復号化装置。
【請求項１１】
前記プログラムは、前記１以上のプロセッサにより実行され、前記１以上のプロセッサに前記処理対象ブロックの第２の小ブロックが有するビット列を決定させる場合に、
前記第１の順序と前記第１の数及び前記第２の数との差分に基づき、前記第３のテーブルにおいてビット列を選択するための第３の順序を算出し、前記第３のテーブルにおいて前記第１の重みと前記第２の重みとの差分が表す重みと、前記第３の順序との組み合わせに対応するビット列を前記第２の小ブロックが有するビット列に決定する
動作を実行させることを特徴とする請求項１０に記載のブロック復号化装置。
【請求項１２】
請求項１乃至５のいずれか１項に記載のブロック符号化装置と、
請求項６乃至１１のいずれか１項に記載のブロック復号化装置と
を備えることを特徴とする情報処理装置。
【請求項１３】
コンピュータに、請求項１乃至５のいずれか１項に記載のブロック符号化装置の１以上のプロセッサの動作を実行させるためのプログラム。
【請求項１４】
コンピュータに、請求項６乃至１１のいずれか１項に記載のブロック復号化装置の１以上のプロセッサの動作を実行させるためのプログラム。
【請求項１５】
１以上のプロセッサと、プログラムを記憶した１以上のメモリとを備えるブロック符号化装置が、前記１以上のプロセッサが前記プログラムを実行することにより実行するブロック符号化方法であって、
入力ビット列を第１のブロック長の複数のブロックに分割して処理対象ブロックを生成することと、
処理対象ブロックのビット列に含まれる１の値の数から、処理対象ブロックの第１の重みを決定することと、
前記処理対象ブロックを第２のブロック長の小ブロックに分割し、小ブロック毎の重みと値とに基づき、前記第１のブロック長と前記第１の重みとを有する所定のビット列を所定の順序で配列した集合における前記処理対象ブロックの第１の順序を決定することと、
前記処理対象ブロックのビット列を、前記決定された第１の重みと第１の順序との値に変換してブロック符号化データを生成することと
を含む、ことを特徴とするブロック符号化方法。
【請求項１６】
１以上のプロセッサと、プログラムを記憶した１以上のメモリとを備えるブロック復号化装置が、前記１以上のプロセッサが前記プログラムを実行することにより、第１の重みを有する第１のブロック長の処理対象ブロックのビット列をブロック符号化して生成されたブロック符号化データから前記処理対象ブロックのビット列を復号するブロック復号化方法であって、
前記ブロック符号化データは、前記第１の重みと、前記第１のブロック長と前記第１の重みとを有する所定のビット列を所定の順序で配列した集合における前記処理対象ブロックの第１の順序とを含み、
前記方法は、
前記処理対象ブロックを第２のブロック長の小ブロックで分割した場合の、前記処理対象ブロックの最上位ビットを含む第１の小ブロックが有する第２の重みを決定することと、
前記集合において、ビット列の第１の小ブロックにつき前記第２の重みよりも小さい重みを有し、かつ、前記所定の順序において前記処理対象ブロックよりも前に位置するビット列の第１の数を決定することと、
前記集合において、前記第１の順序と前記第１の数との差分に基づき、前記処理対象ブロックの前記第１の小ブロックが有するビット列と、前記処理対象ブロックの前記第１の小ブロックと重みが同じで値の異なる第１の小ブロックを有するビット列の第２の数とを決定することと、
前記第１の重みと前記第２の重みとの差分と、前記集合において、前記第１の順序と前記第１の数及び前記第２の数との差分とに基づいて、前記処理対象ブロックの第２の小ブロックが有するビット列を決定することと
を含む、ことを特徴とするブロック復号化方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本願発明は、ブロック符号化装置、ブロック復号化装置、情報処理装置、プログラム、ブロック符号化方法及びブロック復号化方法に関する。
【背景技術】
【０００２】
大規模なデータを扱うアプリケーションでは、速度とともに作業領域の大きさも問題となる。作業領域が主記憶に収まらない場合、スワッピングが発生し、大幅な速度低下を招くこととなる。そのためデータ構造には、高速に検索を可能とするだけでなく、作業領域量が小さいことが求められている。【０００３】
そこで近年、二次記憶装置（ハードディスク等）を参照することなく主記憶上での高速な大規模データ処理を目的に，データを情報理論的下限に近いサイズで表現したまま高速な操作を実現する簡潔データ構造，および，データをエントロピーに近いサイズに圧縮したまま高速な操作を実現する圧縮データ構造が理論・実用の両面から研究されている。【０００４】
Rank/Select 辞書は，入力ビット列B[0..n-1] 上のrankb(x,B) (B[0..x] 中のb∈{0,1}の個数を求める操作) とselectb(i,B) (Bの先頭からi番目のb∈{0,1}の位置を求める操作) を実現するデータ構造である。Ramanらは，入力ビット列を圧縮したまま上述の操作を定数時間で実現するデータ構造（RRR）を提案した(非特許文献１)。このデータ構造は，入力ビット列を長さlog(n)/2の固定長ブロックに分割し，各ブロックを重み（ブロック中の１の個数を表す固定長整数）と順序（同じ重みのブロック群に一意に割り振られた可変長整数）の組として符号化する。【０００５】
このブロック符号化とその逆操作であるブロック復号化は，理論的には漸近的にnより小さい補助領域を用いて定数時間で実現できる。一方，実用的にはこの補助領域は無視できないほど大きい。したがって，効率良いブロック符号化・ブロック復号化の実現は，上述のデータ構造を実装する上で重要な課題である。【０００６】
また、RRR の実用的な実装方法として、Navarro とProvidel の実装方法（以降、RRR-NP という）が提案されている（非特許文献２）。非特許文献２の提案手法では、RRR の実性能はブロック圧縮の実現方法に大きく依存している。
【先行技術文献】
【非特許文献】
【０００７】
【非特許文献１】R. Raman, V. Raman, S. R. Satti: Succinct indexable dictionaries with applications to encoding k-ary trees, prefix sums and multisets. ACM Transactions on Algorithms, Volume 3, Number 4,
【非特許文献２】G. Navarro, E. Providel: Fast, small, simple rank/select on bitmaps, In Proc. 11th SEA, pp. 295{306, 2012.
【発明の概要】
【発明が解決しようとする課題】
【０００８】
RRRの実用的な実装のために、ブロック圧縮に対する効率良い符号化法と復号化法の提供を目的とし、高速で省領域な符号化法と復号化法を与え、密なビット列に対しても高速に動作するRRR 実装を提供する。
【課題を解決するための手段】
【０００９】
上記課題を解決するための発明の実施形態の一つに対応するブロック符号化装置は、
１以上のプロセッサと、
プログラムを記憶した１以上のメモリと
を備え、
前記プログラムは、前記１以上のプロセッサにより実行された場合に、前記１以上のプロセッサに
入力ビット列を第１のブロック長の複数のブロックに分割して処理対象ブロックを生成し、
処理対象ブロックのビット列に含まれる１の値の数から、処理対象ブロックの第１の重みを決定し、
前記処理対象ブロックを第２のブロック長の小ブロックに分割し、小ブロック毎の重みと値とに基づき、前記第１のブロック長と前記第１の重みとを有する所定のビット列を所定の順序で配列した集合における前記処理対象ブロックの第１の順序を決定し、
前記処理対象ブロックのビット列を、前記決定された第１の重みと第１の順序との値に変換してブロック符号化データを生成する動作を実行させる。【００１０】
上記課題を解決するための発明の実施形態の一つに対応するブロック復号化装置は、
１以上のプロセッサと、
プログラムを記憶した１以上のメモリと、
を備え、
前記プログラムは、前記１以上のプロセッサにより実行された場合に、前記１以上のプロセッサに、第１の重みを有する第１のブロック長の処理対象ブロックのビット列をブロック符号化して生成されたブロック符号化データから前記処理対象ブロックのビット列を復号する動作を実行させ、
前記ブロック符号化データは、前記第１の重みと、前記第１のブロック長と前記第１の重みとを有する所定のビット列を所定の順序で配列した集合における前記処理対象ブロックの第１の順序とを含み、
前記復号する動作には、
前記処理対象ブロックを第２のブロック長の小ブロックで分割した場合の、前記処理対象ブロックの最上位ビットを含む第１の小ブロックが有する第２の重みを決定し、
前記集合において、ビット列の第１の小ブロックにつき前記第２の重みよりも小さい重みを有し、かつ、前記所定の順序において前記処理対象ブロックよりも前に位置するビット列の第１の数を決定し、
前記集合において、前記第１の順序と前記第１の数との差分に基づき、前記処理対象ブロックの前記第１の小ブロックが有するビット列と、前記処理対象ブロックの前記第１の小ブロックと重みが同じで値の異なる第１の小ブロックを有するビット列の第２の数とを決定し、
前記第１の重みと前記第２の重みとの差分と、前記集合において、前記第１の順序と前記第１の数及び前記第２の数との差分とに基づいて、前記処理対象ブロックの第２の小ブロックが有するビット列を決定する動作が含まれる。
【発明の効果】
【００１１】
本発明によれば、高速で省領域な符号化法と復号化法を与え、密なビット列に対しても高速に動作するRRR 実装を提供することができる。これにより、主記憶内に収容するデータ量を増やして速度低下を防止し、データ処理の高速化を実現することができる。
【図面の簡単な説明】
【００１２】
【図１】発明の実施形態に対応する、システム全体の構成例を示す図。
【図２Ａ】発明の実施形態に対応する、クライアント１０１のハードウェア構成の一例を示すブロック図。
【図２Ｂ】発明の実施形態に対応する、サーバ１０３のハードウェア構成の一例を示すブロック図。
【図３】発明の実施形態に対応する、サーバ１０３の機能構成の一例を示すブロック図。
【図４Ａ】発明の実施形態に対応する、圧縮データ構造を適用可能な木構造で表現される情報を説明するための図。
【図４Ｂ】発明の実施形態に対応する、圧縮データ構造を適用可能な木構造で表現される情報を説明するための図。
【図４Ｃ】発明の実施形態に対応する、圧縮データ構造を適用可能な木構造で表現される情報を説明するための図。
【図５】発明の実施形態に対応する、ブロック符号化処理の一例を示すフローチャート。
【図６】発明の実施形態に対応する、ブロック符号化処理の対象のビット列の配列順序を説明するための図。
【図７】発明の実施形態に対応する、ブロック符号化処理及びブロック復号化処理において参照する各テーブルを説明するための図。
【図８】発明の実施形態に対応する、順序ＯＤ（Ｘ）の決定処理の一例を示すフローチャート。
【図９】発明の実施形態に対応する、ブロック復号化処理の一例を示すフローチャート。
【発明を実施するための形態】
【００１３】
以下、図面を用いて、本願発明に係る実施形態について説明する。なお、以下に示す実施形態は一例であり、これに限定するものではない。そのため、本願発明の特徴的構成を適用できれば他の構成であってもよい。説明する構成要素のうち同一機能を有するものには同じ符号を付し、その説明を省略する。以下では主に、ＸＭＬなどの半構造テキストフォーマットのデータとそのインデックスを配信し、受信側でそのデータを処理するシステムを説明する。
【００１４】
＜システム構成＞
図１は、本実施形態に対応する情報処理システムの全体構成を示すブロック図である。当該情報処理システムは、ユーザ端末であるクライアント１０１ａ、１０１ｂ、１０１ｃ（以下、これらを総称して「クライアント１０１」という。）及びサーバ１０３がインターネット１０２に接続され相互通信が可能に構成されている。サーバ１０３には、データベース１０４が接続されている。
【００１５】
クライアント１０１は、ユーザが操作するユーザ端末、或いは、情報処理装置である。クライアント１０１は、ユーザ操作に応じてサーバ１０３が提供するサイトにアクセス可能である。クライアント１０１はサイト情報（ウェブページ情報）をサーバ１０３に要求する（「アクセス要求」ともいう）ことができる。当該要求に応じてサーバ１０３から送信されたサイト情報を受信すると、クライアント１０１は受信したサイト情報をディスプレイに表示する。
【００１６】
クライアント１０１は、例えば、ノートパソコン、デスクトップパソコン、携帯情報端末、携帯電話、スマートフォン、タブレット端末等を含む。クライアント１０１には、所謂インターネット・ブラウザのソフトウェア（プラグインでストリーミング・コンテンツを再生可能）がインストールされているものとする。
【００１７】
クライアント１０１は、無線ＬＡＮ、ＬＴＥ等の無線データ通信手段によってインターネット１０２に接続されている。尚、イーサネット（登録商標）等のネットワークケーブルを含むＬＡＮにより、ネットワーク１０２へアクセス可能に更に構成されていてもよい。インターネット１０２は、世界中のネットワークが互いに接続されたネットワークであるが、例えば、イントラネットのように特定の組織内においてのみ接続可能なネットワークであってもよい。
【００１８】
サーバ１０３はオンラインショッピングサイトのようなポータルサイトでＸＭＬファイルを提供する情報処理装置であってもよい。クライアント１０１のユーザは当該ポータルサイトの登録ユーザであってもよい（以下、登録ユーザのことを単にユーザともいう。）。サーバ１０３は、各種サイト情報が登録されたデータベース１０４を管理し、クライアント１０１からのアクセスを受け付ける。
【００１９】
データベース１０４は、それぞれ所定のデータベース・ソフトウェアがインストールされた情報処理装置であり、各種データの管理を行う。データベース１０４は、所定のウェブサイトをインターネット１０２に公開するための文書ファイルの情報を管理する。文書ファイルには、ＨＴＭＬファイル、ＰＤＦファイルの他、特定アプリケーションで利用されるファイル（例えば、ＭＳワードなど）が含まれる。データベース１０４は、随時更新され最新の情報が格納される。
【００２０】
尚、本明細書では、便宜上、サーバ１０３及びデータベース１０４は、それぞれ物理的に独立した情報処理装置によって実現されるものとして説明するが、本発明の実施形態はこれに限られるものではない。例えば、これらが単一の情報処理装置によって実現されてもよい。その一方で、認証サーバ１０３等の各装置が複数台の情報処理装置により冗長構成、或いは分散構成されても良い。また、データベース１０４は、サーバ１０３とＬＡＮ等によって接続されているものとして説明するが、例えば、インターネット１０２や非図示のイントラネット経由でサーバ１０３と通信可能な形態をとってもよい。
【００２１】
＜装置のハードウェア構成＞
次に、本実施形態に対応する情報処理システムを構成する各装置のハードウェア構成について説明する。図２Ａは、クライアント１０１のハードウェア構成の一例を示すブロック図である。上述した情報処理装置としての、データベース１０４も、同様或いは同等のハードウェア構成として構成しても良い。
【００２２】
図２Ｂは、発明の実施形態に対応する情報処理装置としてのサーバ１０３のハードウェア構成の一例を示すブロック図である。ＣＰＵ、ＲＯＭ、ＲＡＭ、外部記憶ドライブ、メディア、ＨＤ、指示入力装置、出力装置、Ｉ／Ｆ、システムバスの機能及び用途、更には、これらの関係は、図２Ａを用いて説明するものと同様或いは同等である。図２Ｂでは、データベース２１０がシステムバス２０９Ｂに接続されていることに留意する。ここで、データベース２１０は、データベース１０４に相当する。以下、図２Ａ及び図２Ｂの各構成要素についてまとめて説明する。
【００２３】
図２Ａ及び図２Ｂにおいて、ＣＰＵ２００Ａ（２００Ｂ）は、ハードディスク装置（以下、ＨＤと呼ぶ）２０５Ａ（２０５Ｂ）に格納されているアプリケーションプログラム、オペレーティングシステム（ＯＳ）や制御プログラム等を実行し、ＲＡＭ２０２Ａ（２０２Ｂ）にプログラムの実行に必要な情報、ファイル等を一時的に格納する制御を行う。ＣＰＵ２００Ａ（２００Ｂ）は、単一のプロセッサであっても良いし、複数のプロセッサから構成されても良い。サーバ１０３から受信し、ＲＡＭ２０２Ａに記憶されたサイト情報（ＸＭＬファイル）を展開し、出力装置２０７Ａのディスプレイに表示可能な形式のデータに変換する。さらには、インターフェイス２０８Ａ（２０８Ｂ）を介した外部装置とのデータ送受信を制御するとともに、外部装置から受信したデータの分析・処理を実行し、また外部装置へ送信するデータ（処理要求やデータ要求を含む）の生成を行う。なお、後述する図３から図８を参照して説明する処理もＣＰＵ２００Ａ（２００Ｂ）が対応する処理プログラムを実行することにより装置全体を制御して実現される。
【００２４】
ＲＯＭ２０１Ａ（２０１Ｂ）は、内部に基本Ｉ／Ｏプログラム、種々のアプリケーションプログラム等の各種データを記憶する。ＲＡＭ２０２Ａ（２０２Ｂ）は各種データを一時記憶し、ＣＰＵ２００Ａ（２００Ｂ）の主メモリ、ワークエリア等として機能する。
【００２５】
外部記憶ドライブ２０３Ａ（２０３Ｂ）は、記録媒体へのアクセスを実現するための外部記憶ドライブであり、メディア（記録媒体）２０４Ａ（２０４Ｂ）に記憶されたプログラム等を本コンピュータシステムにロードすることができる。尚、メディア２０４Ａ（２０４Ｂ）は、例えば、フロッピー（登録商標）ディスク（ＦＤ）、ＣＤ−ＲＯＭ、ＣＤ−Ｒ、ＣＤ−ＲＷ、ＰＣカード、ＤＶＤ、Ｂｌｕ−ｒａｙ（登録商標）、ＩＣメモリカード、ＭＯ、メモリスティック等を利用することができる。
【００２６】
外部記憶装置２０５Ａ（２０５Ｂ）は、本実施形態では大容量メモリとして機能するＨＤ（ハードディスク）を用いている。ＨＤ２０５Ａ（２０５Ｂ）には、アプリケーションプログラム、ＯＳ、制御プログラム、関連プログラム等が格納される。なお、ハードディスクの代わりに、フラッシュ（登録商標）メモリ等の不揮発性記憶装置を用いても良い。
【００２７】
指示入力装置２０６Ａ（２０６Ｂ）は、キーボードやポインティングデバイス（マウス等）、タッチパネル等がこれに相当する。指示入力装置２０６Ａ（２０６Ｂ）を用いて、ユーザは、クライアント１０１に対して、装置を制御するコマンド等を入力指示する。出力装置２０７Ａ（２０７Ｂ）は、指示入力装置２０６Ａ（２０６Ｂ）から入力したコマンドや、それに対するクライアント１０１やサーバ１０３の応答出力等を出力する。出力装置２０７Ａ（２０７Ｂ）にはディスプレイ、スピーカ、ヘッドフォン端子等が含まれる。システムバス２０９Ａ（２０９Ｂ）は、情報処理装置内のデータの流れを司る。
【００２８】
インターフェイス（以下、Ｉ／Ｆという）２０８Ａ（２０８Ｂ）は、外部装置とのデータのやり取りを仲介する役割を果たす。例えば、クライアント１０１にとって、外部装置はサーバ１０３等であり、サーバ１０３にとって、外部装置はクライアント１０１等となる。具体的に、Ｉ／Ｆ２０８Ａ（２０８Ｂ）は、無線通信モジュールを含むことができ、当該モジュールはアンテナシステム、ＲＦ送受信器、１つ以上の増幅器、同調器、１つ以上の発振器、デジタル信号プロセッサ、ＣＯＤＥＣチップセット、加入者識別モジュールカード、メモリなどを含む、周知の回路機構を含むことができる。また、有線接続のための有線通信モジュールを含むことができる。有線通信モジュールは１つ以上の外部ポートを介して他のデバイスとの通信を可能とする。また、データを処理する様々なソフトウェアコンポーネントを含むことができる。外部ポートは、イーサーネット、ＵＳＢやＩＥＥＥ１３９４等を介して、直接的に、又はネットワークを介して間接的に他のデバイスと結合する。尚、以上の各装置と同等の機能を実現するソフトウェアにより、ハードウェア装置の代替として構成することもできる。
【００２９】
本実施形態に対応する処理を実行するために対応するプログラムを動作させる度に、既にプログラムがインストールされているＨＤ２０５Ａ（２０５Ｂ）からＲＡＭ２０２Ａ（２０２Ｂ）にロードするようにしてもよい。また、本実施形態に係るプログラムをＲＯＭ２０１Ａ（２０１Ｂ）に記録しておき、これをメモリマップの一部をなすように構成し、直接ＣＰＵ２００Ａ（２００Ｂ）で実行することも可能である。さらに、メディア２０４Ａ（２０４Ｂ）から対応プログラム及び関連データを直接ＲＡＭ２０２Ａ（２０２Ｂ）にロードして実行させることもできる。
【００３０】
図３は、本実施形態に係るサーバ１０３の機能ブロック図である。ここに示す各ブロックは、サーバ１０３が備えるＲＯＭ２０１Ａ、ＲＡＭ２０２Ｂ、ＨＤ２０５Ｂに保持された所定のプログラムがサーバ１０３のＣＰＵ２００Ｂにより実行されることで実現される各種の制御及び処理機能を表している。
【００３１】
ブロック符号化部３０１は、入力ビット列をブロック長ｎのビット列からなるブロックに分割し、各ブロックを重みｗと順序Ｏとの値に変換するブロック符号化処理を行う。ブロック符号化データはＲＡＭ２０２Ｂのワークエリアに格納される。ブロック符号化処理の詳細は図５から図７を参照して後述する。
【００３２】
ブロック復号化部３０２は、ブロック符号化部３０１におけるブロック符号化処理により得られ、ＲＡＭ２０２Ｂのワークエリアに格納されているブロック符号化データを復号し、元のビット列を復元するブロック復号化処理を行う。ブロック復号化処理の詳細は図７から図８を参照して後述する。
【００３３】
テーブル生成部３０３は、ブロック符号化部３０１及びブロック復号化部３０２において実行されるブロック符号化処理及びブロック復号化処理において参照されるテーブルの情報を生成する。テーブル情報の生成については図５を参照して後述する。
【００３４】
テーブル保持部３０４は、ブロック符号化部３０１及びブロック復号化部３０２において実行されるブロック符号化処理及びブロック復号化処理において参照されるテーブルの情報を保持する。テーブル情報及びその利用方法の詳細については図５から図８を参照して後述する。
【００３５】
次に発明の実施形態に対応する圧縮データ構造を適用可能な木構造で表現される情報について説明する。図４Ａから図４ＣはＸＭＬやＪＳＯＮ等の木構造で表現されるデータの一例を示す図である。図４Ａは、半構造テキストデータの一例を示す図である。図４Ａに示す半構造テキストデータは、ＪＳＯＮ形式のデータを例示している。半構造テキストデータは、一般的に複数のノードを含む木構造と対応することが知られている。半構造テキストデータでは、複数のノードのそれぞれは半構造テキストデータのうちそれぞれの始点から終点までの文字列により表される。例えば、この始点や終点がシンボル（図４Ａの例ではそれぞれ「｛」と「｝」）により表されてもよいし、ほかの何らかの構文上の規則によって始点と終点が示されていてもよい。また、あるノードの文字列の中に、そのノードの子ノードの文字列が入れ子構造で含まれていてもよい。また子ノードの文字列に孫ノードなどのさらに下位のノードの文字列が含まれていてもよい。図４Ａにおける丸付き数字および破線は半構造テキストデータを説明するための符号および線であり、丸付き数字は破線を介して接続される括弧の位置に対応するノードの番号を示している。
【００３６】
図４Ｂは図４Ａの半構造テキストデータに対応する木構造を示す図である。番号０のノードは最上位のノードであり、その子ノードは番号１および４のノードである。また番号１のノードの子ノードは番号２であり、番号２の子ノードは番号３のノードである。番号４のノードの子ノードは番号５および６のノードであり、番号６の子ノードは番号７のノードである。
【００３７】
図４Ｃは図４Ｂに示した木構造を括弧木表現（ＢＰ表現）及びビット列として示したテーブルである。このビット列は本実施形態における処理対象のデータであり、ノード位置、ビット位置、ＢＰ表現はそのビット列を説明するためのものである。
【００３８】
図４Ｃに示すビット列は、ＸＭＬやＪＳＯＮ等の木構造で表現されるテキストデータに基づいて生成することができる。ＢＰ表現の行の「（」「）」（以下では単に「括弧」と記載した場合、この括弧木表現の括弧を示す）はそれぞれテキストデータの各ノードの始点と終点を示す。したがって、ビット列の「１」「０」はそれぞれ対応するノードの始点、終点を表す。なお図４Ｃではビット位置は０から始まる番号としている。一方、本実施形態では入力ビット列を固定長ｎの処理対象ブロックに分割するが、図４Ｃでは１ブロックを８ビットとし、ブロック番号は０から始まる番号としている。１ブロックに含まれるビット数は８以外の２のべき乗の数であってもよいし、それ以外の任意の数であっても良い。以下では、ブロックのビット数のことをブロック長と呼ぶ。
【００３９】
図４ＣのＢＰ表現における開き括弧とその開き括弧に対応する閉じ括弧とはノードを示している。図４Ｃのノード位置はそのビット位置を始点とするするノードの番号を示し、このノード位置は図４Ｂの木構造のノード番号に対応する。ここで、図４Ｃに示すビット列では左から右にビット位置が大きくなっているが、ＲＡＭやＣＰＵのレジスタに格納される物理的なブロックのデータでは、ビット位置の番号が大きくなるにつれてＲＡＭやレジスタの上位の桁のビットに順に配置されるようにビットが配置されている。図４Ｃに示すビット列では、右になるほどＲＡＭやレジスタの上位の桁に格納される。
【００４０】
＜ブロック符号化処理＞
以下、本実施形態に対応するバイナリデータのブロック符号化処理について説明する。ブロック符号化処理は、本実施形態においてはブロック長ｎの任意のビット列で構成される処理対象ブロックＸを、当該ブロックＸに含まれる重みｗと、処理対象ブロックの順序ＯＤとの値に変換する処理を言う。数式では以下のように表現する。
ENCODE（Ｘ）＝ (ｗ, ＯＤ)      （式１）
ここで、重みとはビット列内に含まれる「１」の個数をいう。また、順序とは重みｗ、ブロック長ｎのビット列の集合（ＢＩＴＳ（ｎ、ｗ））において処理対象ブロックＸが位置する順番を示す値をいう。
【００４１】
図５は、ブロック符号化処理の一例を示すフローチャートである。当該フローチャートに対応する処理は、ブロック符号化部３０１、テーブル生成部３０３及びテーブル保持部３０４により実行される。
【００４２】
まず、Ｓ５０１では、テーブル生成部３０３が処理対象ブロックのブロック長ｎ、処理対象ブロックを構成する各小ブロックのブロック長ｋ、及び処理対象ブロックの重みｗを設定する。本実施形態では、ブロック長ｎの処理対象ブロックは、ブロック長ｋの小ブロックにより等分される。重みｗは、ブロック長ｎのバイナリデータの全体についての重みであって、小ブロック毎の重みは限定しない。重みｗの範囲は０≦ｗ≦ｎとなる。例えば重みｗが２の場合、処理対象ブロック内には「１」が２個含まれることになる。
【００４３】
次に、Ｓ５０２では、テーブル生成部３０３がＳ５０１で決定されたブロック長ｎ、重みｗのバイナリデータにつき、存在し得るビット列の集合ＢＩＴＳ(ｎ,ｗ)を決定する。このときＢＩＴＳ(ｎ,ｗ)に含まれるビット列の個数をＩとする。Ｉは以下の式により求めることができる。
Ｉ＝Ｃ（ｎ、ｗ）      （式２）
ここで、Ｃ（ｎ、ｗ）は、ｎ個の中からｗ個を選択する組み合わせｎＣｗを表す。
【００４４】
続くＳ５０３では、テーブル生成部３０３がＳ５０２で決定したＢＩＴＳ（ｎ,ｗ）におけるバイナリデータの順序ＯＤ（Ｙi）を決定する。ここで、Ｙiは、ＢＩＴＳ（ｎ,ｗ）に含まれる任意のビット列を示し、iは０以上Ｉ未満の整数で表される（０≦i＜Ｉ）。このとき同時に０≦ＯＤ（Ｙi）＜Ｉも成立する。次にＳ５０４では、テーブル生成部３０３が、Ｓ５０３で決定された順序のＢＩＴＳ（ｎ,ｗ）ビット列について、ブロック符号化処理において参照すべきテーブルを作成し、テーブル保持部３０４に保持する。
【００４５】
次に、Ｓ５０５では、ブロック符号化部３０１が入力ビット列をＳ５０１で設定されたブロック長ｎのブロックに分割し処理対象ブロックＸを生成する。続くＳ５０６では、ブロック符号化部３０１が処理対象ブロックＸをブロック長ｋの小ブロックに分割する。
【００４６】
続くＳ５０７では、ブロック符号化部３０１が、処理対象ブロックＸのビット列に含まれる「１」の数に基づき重みｗを決定する。続くＳ５０８では、ブロック符号化部３０１が、テーブル保持部３０４が保持するテーブルを参照して処理対象ブロックＸの順序ＯＤ（Ｘ）を決定する。ＯＤ（Ｘ）は、Ｓ５０３で決定されたＢＩＴＳ（ｎ,ｗ）におけるバイナリデータの順序ＯＤ（Ｙi）のうち、Ｘ＝Ｙiとなる順序ＯＤ（Ｙi）を特定すればよい。またＸの順序ＯＤ（Ｘ）は、ＯＤ（Ｘ）＞ＯＤ（Ｙi）を満たすＢＩＴＳ（ｎ、ｗ）内のＹi個数に相当する。Ｓ５０９では、ブロック符号化部３０１がＯＤ（Ｘ）と重みｗに基づき、処理対象ブロックＸのブロック符号化結果（ＥＮＣＯＤＥ（Ｘ）＝（ｗ、ＯＤ））を出力する。
【００４７】
上記ステップのうちＳ５０１からＳ５０４までの処理は、入力ビット列が入力される以前に想定されるｎ、ｋ、ｗの任意の組み合わせについて予め実行されていてもよい。
【００４８】
以下、図５のフローチャートに従ったブロック符号化処理の具体例につき、図６及び図７を参照して説明する。図６は、ブロック符号化処理の対象となるビット列の配列順序を説明するための図であり、図７は、ブロック符号化処理及びブロック復号化処理において参照する各テーブルを説明するための図である。
【００４９】
まず、Ｓ５０１における処理につき、以下の具体例ではブロック長ｎ＝６、小ブロックのブロック長ｋ＝３、重みｗ＝２とする。なお、これらの数値はあくまで例示のために用いるものであって、より大きな値を用いても良い。
【００５０】
Ｓ５０２における処理につき、ブロック長ｎを６とした場合に存在し得るビット列ＹiのパターンＢＩＴＳ(６,２)は図６の左表６０１に示すとおりである。６ビットの処理対象ブロックに「１」が２個含まれるようなビット列の個数Ｉは、Ｉ＝Ｃ（６，２）＝１５となる。ビット列Ｙiは、Ｙ０からＹ１４までが存在し、図６の左表６０１では「１」が最下位ビット側から存在する順序でデータを昇順で示している。当該順序はビット列Ｙiの大きさ順に相当する。表の左脇に示す０から１４までの数字は、表に示す各バイナリデータに対して割り当てられる順序を示している。ここでは、「１」の位置は６ビットのブロック全体について判定されている。
【００５１】
これに対し、本実施形態では、Ｓ５０３における処理にて１５個のビット列Ｙiの並びをブロック長ｋ＝３の小ブロック（Ｙｉ−０、Ｙｉ−１）毎の値に基づいて入れ替え、順序ＯＤ（Ｙi）を決定する。図６の右表６０２はブロックの順序を入れ替えた結果を示している。ここでは０番目から８番目までの順序は不変であるが、９から１２番目の順序が入れ替わっている。右表６０２では処理対象ブロックの順序は、最上位ビット側から小ブロック単位のビットが有する重み及び値に基づき昇順で決定されている。ここでは重みｗに基づく順序はｗ＝０、１、２の順となる。また、値に基づく順序は例えば重み１ならば「００１」、「０１０」、「１００」であり、重み２であれば「０１１」、「１０１」、「１１０」となる。図６の例では、「０００」という重み０のグループと、「００１」、「０１０」及び「１００」という重み１のグループと、「０１１」、「１０１」、「１１０」という重み２のグループとが生成されるので、これらの順に順序が決定される。
【００５２】
図６では、処理対象ブロックのブロック長ｎが６ビットの場合を示したが、上述の順序決定方法は、ブロック長ｎ、小ブロック長ｋ、重みｗが変った場合も同様に適用可能である。例えば、ブロック長ｎがより長くなった場合であっても、最上位ビット側に位置する小ブロックから順に重みが小さく、値の小さい順序で昇順に配列される。
【００５３】
続くＳ５０４では、Ｓ５０３で決定された順序のビット列について、ブロック符号化処理にて参照されるテーブルをテーブル生成部３０３が生成する。テーブル生成部３０３は図７に示すような５種類のテーブルを生成することができる。
【００５４】
図７に示す第１のテーブル（Ｔ１）７０１は、最上位ビット側の小ブロックＹｉ−０につき、より小さい重みを有するＹiの個数をブロックＹｉ−０の重みｗごとに登録する。まず、重み０よりも小さい重みはないため、Ｔ１０の先頭のエントリの値は０となる。次に重み１より小さい重み０を有するビット列Ｙiは３個あるため、重み１のためのＴ１０のエントリの値は３となる。同様に重み２より小さい重み０及び重み１を有するビット列Ｙiは１２個あるため、重み２のためのＴ１０のエントリの値は１２となる。また、図７の例では重み３は存在しないので値として無効であるが、仮に重み３が存在する場合には、対応する値が登録される。
【００５５】
図７では、ブロック長ｎ＝６、小ブロック長ｋ＝３の場合について記載したが、これよりも長いブロック長についてＴ１を生成する場合は、最上位ビット側からｎ／ｋ−１個分の小ブロックのそれぞれについて、より小さい重みを有するＹiの個数を重みｗごとに登録する。各値は以下の式より求めることができる。
Ｔ１[x][y][z] = Σv in [0..z] C(k,v) × C(k×x, y-v)、x in [0..n/k)、y in [0..ｗ]、z in [0..k]       （式３）
【００５６】
次に、第２のテーブル（Ｔ２）７０２は、重みｗの値に基づく小ブロック（小ブロック長ｋ）内での組み合わせ数を登録する。ここでは、重みｗ＝２であるので、小ブロック内に存在し得る「１」の数は、「０」、「１」、「２」のいずれかである。また、小ブロック長ｋ＝３である。これに基づきＴ２の先頭のエントリはＣ（３，０）であり、小ブロックを構成する３ビットのブロックにおいて「１」が存在しないことを示す。このような組み合わせの数は「０００」の１通りしか存在しないので、登録される値は「Ｃ（３，０）＝１」となる。次に、小ブロックを構成する３ビットのブロックにおいて「１」が１つ存在する場合、「００１」、「０１０」、「１００」の３通りがあるので、登録される値は「Ｃ（３，１）＝３」となる。同様に、小ブロックを構成する３ビットのブロックにおいて「１」が２つ存在する場合、「０１１」、「１０１」、「１１０」の３通りがあるので「Ｃ（３，２）＝３」となる。
【００５７】
また、発明の実施形態はこの例に限定されることなく、Ｔ２には、ブロック長ｎ、小ブロック長ｋ及び重みｗの大きさに合わせた値が登録される。各値は以下の式より求めることができる。
Ｃ（ｋ×ｘ、ｙ）（x in [0..n/k]、y in [0..ｗ]）      （式４）
【００５８】
次に第３のテーブル（Ｔ３）７０３は、小ブロック長ｋについて、重みによって異なるビットパターンに割り当てられる順序の値を登録する。Ｔ３に登録される同一重みにおける順序としてビット列Ｘの順序をＯＤｓｗ（Ｘ）で表す。ここではｋ＝３の場合を説明するが、例えば、重み０と重み３の場合は「０００」、「１１１」しか存在しないため値を登録する必要はない、或いはＯＤｓｗ（０００）＝０、ＯＤｓｗ（１１１）＝０を登録しておく。また、重み１及び重み２の場合は３ビットのブロック内で「１」を取り得る位置に応じてビットパターンが異なる。重み１の場合「００１」、「０１０」、「１００」の３パターンが存在し、重み２の場合「０１１」、「１０１」、「１１０」の３パターンがやはり存在する。これらはその順序で「０」、「１」、「２」の値が割り当てられる。例えば、ＯＤｓｗ（００１）＝０、ＯＤｓｗ（０１０）＝１、ＯＤｓｗ（１００）＝２となる。また、ＯＤｓｗ（０１１）＝０、ＯＤｓｗ（１０１）＝１、ＯＤｓｗ（１１０）＝２となる。
【００５９】
この順序ＯＤｓｗ（Ｘ）の値は、当該順序が割り当てられたビット列の小ブロックよりも前に存在し、かつ、重みが同じ小ブロックの数を示している。例えば、「００１」に割り当てられる順序は「０」であるが、これは「００１」の小ブロックの前には同一重みの小ブロックが存在しないことを意味する。また、「１００」に割り当てられる順序は「２」であるが、これは「１００」の小ブロックの前には同一重みの小ブロックが２つ（「００１」と「０１０１」のこと）存在することを意味する。また、発明の実施形態はこの例に限定されることなく、Ｔ３には、小ブロック長ｋ及び重みｗの大きさに合わせた値が登録され、同一の重みの場合、順序は値の大きさに基づき昇順で決定される。
【００６０】
次に第４のテーブルＴ４（７０４）は、小ブロック長ｋのビット列につき、同一重み内で与えられる順位と重みの値との組み合わせに対応するビット列を登録する。図７ではｋ＝３のビット列Ｘについての組み合わせに対応するビット列と、その登録順序が関連づけて登録されており、本実施形態ではこのビット列をＢＩＴｓk=3（ｗ、ＯＤｓｗ）で表すこととする。この場合、重みｗは０から３の値を取ることができ、存在し得るビット列のパターンは８通りである。各ビット列は、重みの値（０から３）と、同一重み内で割り当てられた順序ＯＤｓｗ（０から２）とで一意に特定可能となっている。例えば、重み０の場合、ＢＩＴｓk=3（０、０）＝０００となる。また、重み１の場合、取り得るビット列は「００１」、「０１０」、「１００」のいずれかとなるが、このうちから１つのビット列を順序の値に基づいて特定する。例えば順序ＯＤｓｗ＝１の場合、ＢＩＴｓk=3（１、１）＝０１０となる。ここで同一重みごとにビット列Ｘに与えられる順序ＯＤｓｗは、テーブルＴ３と同様にビット列の値の大きさの順になる。
【００６１】
また、図７には示していないが、重みｗの値に基づき同一重みで順序ＯＤｓｗが先頭のビット列をテーブルＴ４内で特定するためのテーブルＴ４における登録順序を示す値が、テーブルＴ４に予め登録されているか、又はテーブル保持部３０４により保持されていても良い。当該値は、ＢＩＴｓk=3（ｗ、ＯＤｓｗ）につきＯＤｗ＝Σ(３，ｗ−１)で求めることができる（但し、ｗ＝０の場合は０）。例えば、ｋ＝３の場合、取り得る重みは０から３であるので、重み０の場合は、ＯＤｗ＝０＝０、重み１の場合ＯＤｗ＝１＝Ｃ（３、０）＝１、重み２の場合ＯＤｗ＝２＝Ｃ（３、０）＋Ｃ（３、１）＝４、重み３の場合ＯＤｗ＝３＝Ｃ（３、０）＋Ｃ（３、１）＋Ｃ（３、２）＝７となる。このうち、重みｗが２の場合はＯＤｗ＝２＝４だから、テーブルＴ４の登録順序が「４」の位置から重み２に対応するビット列が登録されていることが分かる。図７では、登録順序が４から６の「０１１」から「１１０」までが重み２に対応する。そして、当該同一重みにおける先頭エントリ「０１１」から順序ＯＤｓｗの値に従ってビット列を特定することができる。例えば、順序ＯＤｓｗ＝２であれば、先頭から２番目のエントリ（１１０）が特定すべきビット列となる。
【００６２】
以上をまとめると、例えば（ｗ、ＯＤｓｗ）＝（２、１）の場合、テーブルＴ４の登録順序をＯＤｗ＝２＋ＯＤｓｗ＝４＋１＝５と求めることで、ＢＩＴｓk=3（２、１）＝１０１を選択することができる。
【００６３】
次に、第５のテーブルＴ５（７０５）は、小ブロック長ｋのビット列が有する重みの値を登録する。図７ではｋ＝３のビット列Ｘについて示しており、本実施形態では順序をＷk=3（Ｘ）で表すとする。例えば、重み０のビット列「０００」はＷk=3（０００）＝０であり、重み２のビット列「１０１」はＷk=3（１０１）＝２となる。このようにして生成したテーブルＴ１からＴ５は、テーブル保持部３０４が保持する。
【００６４】
次に、ブロック符号化部３０１が処理対象ブロックＸのＢＩＴＳ(６,２)における順序ＯＤ（Ｘ）を決定するＳ５０８における処理を、まず概念的に説明する。具体的に、ブロック符号化部３０１は、ＢＩＴＳ(６,２)においてＳ５０３で決定した順序で処理対象ブロックＸよりも前に位置するビット列Ｙiの個数を計算する。このとき、処理対象ブロックＸを構成する小ブロックをＸ０及びＸ１で表し、ＢＩＴＳ(６,２)に含まれる処理対象ブロックＸ以外の任意のビット列Ｙiの小ブロックをＹｉ-０とＹｉ-１とで表すこととする。
【００６５】
まず、小ブロックＸ０でＯＤ（Ｘ０）＞ＯＤ（Ｙｉ―０）を満たすＹiの個数を計算する。例えば図６右表６０２に示されるビット列のうち、処理対象ブロックＸを順序「１２」の「０１１０００」とすると、Ｘ０は「０１１」であり、図６右表の例でＯＤ（Ｘ０）＞ＯＤ（Ｙｉ−０）を満たすＹiの個数は１２個になる。そして、Ｘ０＝Ｙｉ−０を満たす他のＹiは存在しないため「１２」がそのまま処理対象ブロックＸの順序となる。
【００６６】
また、処理対象ブロックＸを順序「１０」の「１０００１０」とすると、Ｘ０は「１００」であり、図６右表６０２の例でＯＤ（Ｘ０）＞ＯＤ（Ｙｉ−０）を満たすＹiの個数は９個になる。そして、Ｘ０＝Ｙｉ−０を満たすＹ０は３つ存在し、そのうちＯＤ（Ｘ１）＞ＯＤ（Ｙｉ−１）を満たすＹiの個数を求めるとＹiの個数は１であるから、９＋１により、ＢＩＴＳ(６,２)において処理対象ブロックＸよりも小さいビット列Ｙiの個数は１０となる。よって、ブロック符号化部３０１は処理対象ブロックＸの順序ＯＤ（Ｘ）を「１０」と求めることができる。
【００６７】
このように、本実施形態における処理対象ブロックＸの順序ＯＤ（Ｘ）は、最上位ビット側から小ブロック毎に重み、及び値の順で決定される。次に、上記の概念に基づいて実行される、図７の５つのテーブルＴ１からＴ５のいずれかを参照したＳ５０８における順序ＯＤ（Ｘ）の決定処理の一例を図８のフローチャートを参照して更に説明する。
【００６８】
以下では、順序「１０」が割り当てられたＹ１０＝１０００１０を処理対象ブロックＸとして処理する場合を説明する。まず、Ｓ８０１では、ブロック符号化部３０１は処理対象ブロックＸの各小ブロックの位置を表すパラメータｈを０に初期化する。ｈは、０≦ｈ＜ｎ／ｋ-１の範囲を取る整数値である。図６のビット列６０２の例では、ｈは０、１の値をとる。また、Ｓ５０７で決定した処理対象ブロックＸの重みｗの値で、パラメータｗ'を初期化する。図６の例では、重みｗ＝２であるから、パラメータｗ'は２に初期化される。
【００６９】
次にＳ８０２にて、ブロック符号化部３０１は小ブロックＸｈの値から重みｗｈを算出する。ここでＸ０＝Ｙ１０−０は「１００」であるから重みｗｈ＝１となる。このとき図７のテーブルＴ５を参照しても良い。続くＳ８０３では、重みｗｈが０であるか否かを判定する。もし、重みｗｈが０の場合（Ｓ８０３で「ＹＥＳ」）、Ｓ８０４に移行してｈを１つ更新して次の小ブロックついてＳ８０２の処理を行う。一方、重みｗｈが０でなかった場合（Ｓ８０３で「ＮＯ」）、Ｓ８０５に移行する。図６の例では、ｗｈ＝１で、０ではないからＳ８０５に移行する。
【００７０】
Ｓ８０５では、パラメータｗ'の値をｗ'−ｗｈの値で更新する。これにより処理対象ブロックＸに対して割り当てられた重みの値が、各小ブロックが有する重みにより減算されていく。図６の例では、２−１＝１でｗ'の値が１に更新される。続くＳ８０６では、ｗ'が０と一致するか否かを判定する。もし、ｗ'が０と一致する場合（Ｓ８０６で「ＹＥＳ」）、Ｓ８１４に移行する。Ｓ８１４では、テーブルＴ３より重みｗｈと同一重みを有する値の内でＸｈの順序ＯＤｈ（Ｘｈ）を決定し、Ｓ８１５に移行する。一方、ｗ'が０と一致しない場合（Ｓ８０６で「ＮＯ」）、Ｓ８０７に移行する。図６では、ｗ'＝１で０ではないから、Ｓ８０７に移行する。
【００７１】
Ｓ８０７では、ブロック符号化部３０１が、小ブロックＸｈが有する重みｗｈよりも小さい重みの小ブロックＹｉ−ｈを有するＹｉの数（Ｎｈ）を、テーブルＴ１ｈから取得する。ここでテーブルＴ１ｈは、小ブロックの位置ｈ毎に用意されているものとし（０≦ｈ＜ｎ／ｋ-１）、図７のテーブル７０１はｈ＝０の場合を示している。但し、図７では添え字ｈを省略している。図６のビット列６０２の例では、Ｘ０＝Ｙ１０−０は重みｗｈ＝１であり、重み１よりも小さい重み、即ち重み０を有するビット列Ｙiの個数として、ｈ＝０のテーブルＴ１０から「３」を得る。続くＳ８０８では、小ブロックＸｈの値と、重みｗｈとに基づき、テーブルＴ３より、同一重み内でのＸｈの順序ＯＤsw（Ｘｈ）を決定する。図６の例では、「１００」の順序ＯＤsw（１００）＝２と分かる。その後Ｓ８０９にて、重みがｗｈで処理対象ブロックの順序ＯＤ（Ｘ）よりも小さい順序ＯＤ（Ｙi）であるＹiの数（Ｎｈ'）を以下の式で算出する。
Ｎｈ'＝ＯＤsw（Ｘｈ）×Ｃ（ｋ(ｎ／ｋ―ｈ―１)、ｗ'）          （式５）
【００７２】
図６の例では、ＯＤsw（１００）＝２、ｋ（ｎ／ｋ−ｈ−１）＝３（６／３−０−１）＝３、ｗ'＝１であるから、Ｎｈ'＝２×Ｃ（３、１）＝２×３＝６となる。なお、Ｃ（ｋ(ｎ／ｋ―ｈ―１)、ｗ'）の値は、テーブルＴ２に予め登録されている値を用いることができる。
この計算により図６の例では、Ｙ１０−０＝「１００」より前に存在する重み１でＹｉ−０が「００１」、「０１０」であるビット列Ｙiの個数が判明した。
【００７３】
次に、Ｓ８１０で小ブロックＸｈの順序ＯＤｈ（Ｘｈ）を以下の式に基づき算出する。
ＯＤｈ（Ｘｈ）＝Ｎｈ＋Ｎｈ'          （式６）
図６の例では、Ｎｈ＝３、Ｎｈ'＝６であったから、ＯＤ0（Ｘ0）＝９と求めることができる。続くＳ８１１ではｈを１つ更新し、次のＳ８１２にて次の小ブロックが処理対象ブロックにおける未処理の最後の小ブロックであるか否かを判定する。最後の小ブロックで無かった場合（Ｓ８１２で「ＮＯ」）、Ｓ８０２に戻って以上の処理を繰り返す。最後の小ブロックであった場合（Ｓ８１２で「ＹＥＳ」）、Ｓ８１３に移行する。図６の例では、ｈ＝１となり、最後の小ブロックとなるので、Ｓ８１３に移行する。
【００７４】
Ｓ８１３では、Ｓ８０５で計算された最新の重みｗ'の値に基づき、テーブルＴ３より、同一重み内でＸｈの順序ＯＤｈ（Ｘｈ）を決定しＳ８１５に移行する。図６の例では、ビット列「０１０」の小ブロックＸ１の順序ＯＤ１（０１０）は、テーブルＴ３より「１」と特定される。次に、Ｓ８１５では、Ｓ８１０と、Ｓ８１３又はＳ８１４とで各小ブロックＸｈについて計算された順序ＯＤｈ（Ｘｈ）を合計して、処理対象ブロックＸの順序ＯＤ（Ｘ）を算出する。図６の例では、ＯＤ０（Ｘ０）＋ＯＤ１（Ｘ１）＝９＋１＝１０であるから、処理対象ブロックＸ（１０００１０）の順序ＯＤ（Ｘ）＝１０と求めることができる。ブロック符号化の場合にはこの順序の値の他に重みｗの値を付随する。上述の例ではｗ＝２である。よって、Ｓ５０９にてブロック符号化部３０１は、ENCODE（Ｘ）＝ (２,１０)とブロック符号化を行うことができる。
【００７５】
なお、ブロック長ｎ及び小ブロック長ｋは、符号側と復号側との間において既知の値であれば符号化する必要がないが、既知でない場合はそれらの値も同時に符号化される。本実施形態ではｎ、ｋの値が既知であるとして説明している。
【００７６】
＜ブロック復号化処理＞
以下、本実施形態に対応するブロック復号化部３０２による、ブロック符号化データを復号するブロック復号化処理について説明する。ブロック復号化処理は、本実施形態においてはブロック符号化結果の重みｗと処理対象ブロックＸの順序ＯＤとの値から、元のブロック長ｎのビット列で構成される処理対象ブロックＸを復号する処理をいう。数式では以下のように表現する。
DECODE（ｗ、ＯＤ）＝ Ｘ      （式７）
【００７７】
以下、本実施形態におけるブロック復号化処理の具体例を、図６及び図７を参照しながら図９のフローチャートに基づきより詳細に説明する。当該フローチャートに対応する処理は、ブロック復号化部３０２、テーブル生成部３０３及びテーブル保持部３０４により実行される。
【００７８】
まず、Ｓ９０１にて、ブロック復号化部３０２は小ブロックの位置を表すパラメータｈを０に初期化する。ｈは、０≦ｈ＜ｎ／ｋ-１の範囲を取る整数値である。
【００７９】
次にＳ９０２にて、ブロック復号化部３０２は小ブロックＸｈの重みｗｈを算出する。ここでの算出式は以下の通りである。
wｈ = MAX{v in [0..k]|Ｔ１[n/k-ｈ-1][w][v] ≦ ＯＤ}      （式８）
【００８０】
より具体的に、例えばｈを初期化した直後（ｈ＝０）であれば、ここでは復号対象の先頭の小ブロックＸ０の重みｗ０を算出する。図６のようにブロック長が６ビット、小ブロック長が３ビットの場合、小ブロックはＸ０とＸ１の２つがあるが、まず、Ｘ０の重みｗ0=weight(Ｘ0)を計算する。その場合（式８）の計算式は以下のように示される。
ｗ0 = ＭＡＸ{ j in [0..k] | Ｔ１[j] ≦ １０ } = 1  （ｋは小ブロックのブロック長を表す）      （式８−１）
【００８１】
図７の例では、テーブルＴ１に登録されている重みのうち、重み０の場合Ｔ１［０］＝０、重み１の場合Ｔ１［１］＝３、重み２の場合Ｐ[２]＝１２で、順序ＯＤ（Ｘ）＝１０以下の値を有するのはＴ１［１］であるから、重みは１と決定される。
【００８２】
また、発明の実施形態はこの例に限定されることなく、重みの算出処理は、ブロック長ｎ、小ブロック長ｋ及び重みｗの大きさに応じて実行することができる。
【００８３】
次に、Ｓ９０３では、算出した重みｗｈが０であるか否かを判定する。重みが０の場合（Ｓ９０３で「ＹＥＳ」）には次の小ブロックを処理対象とすべくＳ９０４にてｈの値を１つ更新してＳ９０２に戻って、再度重みの計算を行う。重みが０でない場合（Ｓ９０３で「ＮＯ」）、Ｓ９０５に移行する。
【００８４】
Ｓ９０５では小ブロックＸｈの順序ＯＤｈ=ＯＤ(Ｘｈ)を計算する。ここでの算出式は以下の通りである。
ＯＤｈ=(ＯＤ-Ｔ１[n/k-ｈ-1][w][wｈ])／Ｔ２[n/k-ｈ-1][w-wｈ]      （式９）
【００８５】
より具体的に、ここでは小ブロックＸ０は重み１であるから、取り得る値は「００１」、「０１０」、「１００」のいずれかであり、このいずれであるかを順序ＯＤ（Ｘ）に基づき決定する。小ブロックＸ０の順序ＯＤ０は、復号対象のブロックが有する順序ＯＤ（Ｘ）＝１０から重み０のビット列の数（３）を除いた数に含まれる、重み１のビットパターンの組み合わせ数（Ｃ（３，１）＝３）で求められる。このとき計算結果の小数点以下は切り捨てる。その場合、式９は以下のように示される。
ＯＤ０ = (ＯＤ（Ｘ）-Ｔ１[ｗ０])／Ｃ（３，１） ＝ （１０−３）／３＝２      （式９−１）
【００８６】
次に、Ｓ９０６では、Ｓ９０２及びＳ９０６で算出された重みｗｈ、ＯＤｈとに基づき、小ブロックＸｈのビット列を決定する。Ｓ９０５の計算から、小ブロックＸ０は、重さ１のビット列において順序２のパターンであることが分かっている。よって、図７のテーブルＴ４との関連で（ｗ、ＯＤｓｗ）＝（１、２）につき、テーブルＴ４の登録順序はＯＤｗ＝１＋ＯＤｓｗ＝１＋２＝３と分かるから、テーブルＴ４からＢＩＴｓk=3（１、２）＝１００が選択され、小ブロックＸ０のビットパターンを１００と決定することできる。
【００８７】
次に、Ｓ９０７にて、次の小ブロックを処理対象とすべくｈの値を１つ更新し、Ｓ９０８でｈがｎ／ｋ−１と一致したかどうか、即ち、最下位ビットを含む小ブロックが処理対象となったか否かを判定する。最下位ビットを含む小ブロックが処理対象となった場合（Ｓ９０８で「ＹＥＳ」）はＳ９０９に移行し、それ以外の場合（Ｓ９０８で「ＮＯ」）はＳ９０２に戻って処理を継続する。
【００８８】
Ｓ９０９では、それまでの小ブロックに割り当てられた重みをブロック符号化データに含まれるブロックＸ全体の重みｗから減算して重みｗｈ（ｈ＝ｎ／ｋ−１）を求める。また、それまでの小ブロックに割り当てられた順序をブロック符号化データに含まれるブロックＸ全体の順序ＯＤ（Ｘ）から減算して順序ＯＤｈ（ｈ＝ｎ／ｋ−１）を求める。
【００８９】
例えば図６のビット列６０２の例では、小ブロックＸ１の重みｗ１を算出する。重みｗ１は、ｗ１＝ｗ−ｗ０＝１で算出することができる。また、小ブロックＸ１の順位ＯＤ１=ＯＤ(Ｘ１)を計算する。小ブロックＸ１も重み１であるから、取り得る値は「００１」、「０１０」、「１００」のいずれかであり、このいずれであるかを順序ＯＤ（Ｘ）に基づき決定する。小ブロックＸ1の順序ＯＤ１は、復号対象のブロックが有する順位１０から重み０のビット列の数（３）と、順序２よりも前のビットパターン「００１」、「０１０」を有するビット列の数（ＯＤ０×C(3,1)）とを引いた数で求められる。これを式で表すと以下のようになる。
ＯＤ1 = (ＯＤ-Ｔ１[ｗ０]-ＯＤ０×C(3,1)) = １０−３−２×３＝１      （式１０）
【００９０】
よって、重さ１のビットパターンにおいて順序１のパターンであるから、（ｗ、ＯＤｓｗ）＝（１、１）につき、テーブルＴ４の登録順序はＯＤｗ＝１＋ＯＤｓｗ＝１＋１＝２と分かるから、テーブルＴ４からＢＩＴｓk=3（１、１）＝０１０が選択され、Ｘ１のビットパターンを０１０と決定することできる。
【００９１】
以上により、復号結果として得られるブロックＸ＝「１０００１０」と決定することができる。
【００９２】
以上により、所定のブロック長ｎ、小ブロック長ｋ、重さｗの処理対象ブロックについて、ブロック符号化及びブロック復号化を行うことができる。このような演算はk=lg(n)と設定した場合、n3+o(n3)ビット領域の表を用いて、符号化：O(n/lg(n))時間、復号化：O(n lglg(n)/lg(n))時間 で計算が可能である。具体的に、ブロック長n=64、ｋを８の場合と１６の場合とで長さ２２８のランダムなビット列につき、１の個数を０．５×２２８とした密な入力ビット列と、１の個数を０．０１×２２８とした疎な入力ビット列とについて処理した場合、小ブロックに分割しない既存の手法に比べてRANK／SELECT操作について２０％程度高速化することができる。これにより、密な入力ビット列に対するクエリ性能の高速化が可能であり、より安定したクエリ性能を提供することができる。
【００９３】
［その他の実施形態］
本発明は上記実施の形態に制限されるものではなく、本発明の精神及び範囲から離脱することなく、様々な変更及び変形が可能である。従って、本発明の範囲を公にするために、以下の請求項を添付する。また本発明に係る情報処理装置は、１以上のコンピュータを該情報処理装置として機能させるプログラムによっても実現可能である。該プログラムは、コンピュータが読み取り可能な（非一時的）記録媒体に記録されることにより、あるいは電気通信回線を通じて、提供／配布することができる。
【図１】
2017145317.tif 000003
【図２Ａ】
2017145317.tif 000004
【図２Ｂ】
2017145317.tif 000005
【図３】
2017145317.tif 000006
【図４Ａ】
2017145317.tif 000007
【図４Ｂ】
2017145317.tif 000008
【図４Ｃ】
2017145317.tif 000009
【図５】
2017145317.tif 000010
【図６】
2017145317.tif 000011
【図７】
2017145317.tif 000012
【図８】
2017145317.tif 000013
【図９】
2017145317.tif 000014
【国際調査報告】
2017145317.tif 000015
2017145317.tif 000016
2017145317.tif 000017
2017145317.tif 000018