(57)【要約】  情報処理装置１００は、多次元空間上の点の集合を表現するデータ構造を対象とし、クエリ領域として特定の多次元の領域が指定された場合に、点の集合から得られた点の列上にあり、且つ１つの次元を除いた残りの各次元の座標がクエリ領域に含まれている点のみで構成された区間を特定する区間検索部１０と、区間内に出現する点がクエリ領域に含まれるための条件として、除かれた１つの次元での座標値の範囲を特定する集計部２０と、特定された区間及び座標値の範囲を入力として、各点の除かれた１つの次元での座標を取り出して得られる座標列に関して、入力区間に出現し且つ値が入力範囲に含まれる全座標について、全座標が対応する点の集合に関する統計量を計算する座標列集計部３０とを備えている。
2016072249.tif 000002
【特許請求の範囲】
【請求項１】
多次元空間上の点の集合を表現するデータ構造を処理対象とする情報処理装置であって、
クエリ領域として、特定の多次元の領域が指定された場合に、
前記点の集合を一列に並べて得られた点の列上にあり、且つ、前記多次元空間を構成する全次元のうち１つの次元を除いた残りの各次元の座標がクエリ領域に含まれている点のみによって構成されている、区間を特定する、区間検索部と、
前記区間検索部で特定された区間について、当該区間に出現する点が前記クエリ領域に含まれるための条件として、除かれた前記１つの次元における座標の値の範囲を特定する、集計部と、
前記区間検索部で特定された区間、及び前記集計部で特定された前記座標の値の範囲を入力として、
前記点の列の並び順と同じ順序で、前記点の集合の各点における、除かれた前記１つの次元での座標を取り出すことで得られる、座標列に関して、当該座標列において入力された前記区間に出現し、且つ、値が入力された前記範囲に含まれる、全ての座標について、
前記全ての座標が対応する点の集合に関する統計量を計算する、座標列集計部と、
を備えている、ことを特徴とする情報処理装置。
【請求項２】
前記座標列集計部が、前記多次元空間を構成する全次元それぞれ毎に備えられており、それぞれ、対応する次元と前記集計部が座標の値の範囲を特定した次元とが一致する場合に、前記点の集合に関する統計量を計算する、
請求項１に記載の情報処理装置。
【請求項３】
前記集計部が、前記区間検索部によって特定された区間が複数である場合に、前記座標列集計部によって計算された区間毎の前記点の集合に関する統計量を、更に集計し、集計によって得られた統計量を、前記クエリ領域に含まれる点の集合に関する全体的な統計量として、出力する、
請求項１または２に記載の情報処理装置。
【請求項４】
前記データ構造が、前記区間検索部による前記区間の特定に用いられる第１のデータ構造と、前記座標列集計部による前記統計量の計算に用いられる第２のデータ構造とを有している、
請求項１〜３のいずれかに記載の情報処理装置。
【請求項５】
前記第１のデータ構造が、
前記多次元空間に設定された複数のカバー領域のいずれかと、前記点の列上において当該カバー領域に含まれる点が出現する区間とに関連付けられている、ノードを有する木構造によって表現されており、
前記区間検索部が、
前記ノードのうち、
関連付けられた前記カバー領域に含まれる点における、前記１つの次元を除いた残りの各次元の座標がクエリ領域に含まれている、ノードを特定し、
特定した１又は２以上のノードが関連付けられている区間を前記区間として特定する、
請求項４に記載の情報処理装置。
【請求項６】
前記点の列は、
前記ノードに関連付けられたカバー領域それぞれに含まれる点が、ひとつながりで連続して出現するように、前記点の集合に含まれる点を一列に並べて得られている、
請求項５に記載の情報処理装置。
【請求項７】
前記座標列集計部は、前記第２のデータ構造を用いて、
前記座標列から得られる複数の部分列のうち、入力された前記範囲に含まれる座標のみが出現する部分列を特定し、そして、特定した部分列上の区間であって、前記座標列において入力された前記区間に出現する座標が出現している、第二の区間を特定し、
更に、特定した前記第二の区間に出現する座標が対応する点の集合に関する統計量を計算する、
請求項４〜６のいずれかに記載の情報処理装置。
【請求項８】
前記部分列が、座標のビット表現が同じ接頭辞で始まる座標を、座標同士の位置関係を保ったまま抽出することで得られるものであり、
前記第２のデータ構造が、
前記部分列に関連付けられた複数のノードを有し、
前記複数のノードそれぞれは、前記部分列において出現する各座標のビット表現における、一つ以上の特定の桁のビットを取り出し、取り出した前記ビットを前記部分列と同じ順序で並べることによって得られる、ビットの列を用いて表現され、
前記座標列集計部は、前記複数ノードそれぞれを表現するビットの列を用いて、前記第二の区間を特定する、
請求項７に記載の情報処理装置。
【請求項９】
前記座標列集計部が、前記全ての座標が対応する点の集合に関する統計量として、前記全ての座標が対応する点の個数を計算する、
請求項１〜８のいずれかに記載の情報処理装置。
【請求項１０】
前記座標列集計部が、前記全ての座標が対応する点の集合に関する統計量として、前記全ての座標が対応する点それぞれの各次元の座標を計算する、
請求項１〜８のいずれかに記載の情報処理装置。
【請求項１１】
多次元空間上の点の集合を表現するデータ構造を処理対象とする情報処理方法であって、
（ａ）クエリ領域として、特定の多次元の領域が指定された場合に、
前記点の集合を一列に並べて得られた点の列上にあり、且つ、前記多次元空間を構成する全次元のうち１つの次元を除いた残りの各次元の座標がクエリ領域に含まれている点のみによって構成されている、区間を特定する、ステップと、
（ｂ）前記（ａ）のステップで特定された区間について、当該区間に出現する点が前記クエリ領域に含まれるための条件として、除かれた前記１つの次元における座標の値の範囲を特定する、ステップと、
（ｃ）前記（ａ）のステップで特定された区間、及び前記（ｂ）のステップで特定された前記座標の値の範囲を入力として、
前記点の列の並び順と同じ順序で、前記点の集合の各点における、除かれた前記１つの次元での座標を取り出すことで得られる、座標列に関して、当該座標列において入力された前記区間に出現し、且つ、値が入力された前記範囲に含まれる、全ての座標について、
前記全ての座標が対応する点の集合に関する統計量を計算する、ステップと、
を有する、ことを特徴とする情報処理方法。
【請求項１２】
（ｄ）前記（ａ）のステップによって特定された区間が複数である場合に、前記（ｂ）のステップによって計算された区間毎の前記点の集合に関する統計量を、更に集計し、集計によって得られた統計量を、前記クエリ領域に含まれる点の集合に関する全体的な統計量として、出力する、ステップを更に有する、
請求項１１に記載の情報処理方法。
【請求項１３】
前記データ構造が、前記（ａ）のステップによる前記区間の特定に用いられる第１のデータ構造と、前記（ｃ）のステップによる前記統計量の計算に用いられる第２のデータ構造とを有している、
請求項１１または１２に記載の情報処理方法。
【請求項１４】
前記第１のデータ構造が、
前記多次元空間に設定された複数のカバー領域のいずれかと、前記点の列上において当該カバー領域に含まれる点が出現する区間とに関連付けられている、ノードを有する木構造によって表現されており、
前記（ａ）のステップにおいて、
前記ノードのうち、
関連付けられた前記カバー領域に存在する点における、前記１つの次元を除いた残りの各次元の座標がクエリ領域に含まれている、ノードを特定し、
特定した１又は２以上のノードが関連付けられている区間を前記区間として特定する、
請求項１３に記載の情報処理方法。
【請求項１５】
前記点の列は、
前記ノードに関連付けられたカバー領域それぞれに存在する点が、ひとつながりで連続して出現するように、前記点の集合に含まれる点を一列に並べて得られている、
請求項１４に記載の情報処理方法。
【請求項１６】
前記（ｃ）のステップにおいて、前記第２のデータ構造を用いて、
前記座標列から得られる複数の部分列のうち、入力された前記範囲に含まれる座標のみが出現する部分列を特定し、そして、特定した部分列上の区間であって、前記座標列において入力された前記区間に出現する座標が出現している、第二の区間を特定し、
更に、特定した前記第二の区間に出現する座標が対応する点の集合に関する統計量を計算する、
請求項１３に記載の情報処理方法。
【請求項１７】
前記部分列が、座標のビット表現が同じ接頭辞で始まる座標を、座標同士の位置関係を保ったまま抽出することで得られるものであり、
前記第２のデータ構造が、
前記部分列に関連付けられた複数のノードを有し、
前記複数のノードそれぞれは、前記部分列において出現する各座標のビット表現における、一つ以上の特定の桁のビットを取り出し、取り出した前記ビットを前記部分列と同じ順序で並べることによって得られる、ビットの列を用いて表現され、
前記（ｃ）のステップにおいて、前記複数ノードそれぞれを表現するビットの列を用いて、前記第二の区間を特定する、
請求項１６に記載の情報処理方法。
【請求項１８】
前記（ｃ）のステップにおいて、前記全ての座標が対応する点の集合に関する統計量として、前記全ての座標が対応する点の個数を計算する、
請求項１１〜１７のいずれかに記載の情報処理方法。
【請求項１９】
前記（ｃ）のステップにおいて、前記全ての座標が対応する点の集合に関する統計量として、前記全ての座標が対応する点それぞれの各次元の座標を計算する、
請求項１１〜１７に記載の情報処理方法。
【請求項２０】
多次元空間上の点の集合を表現するデータ構造を処理対象とする情報処理をコンピュータによって行なうためのプログラムを記録したコンピュータ読み取り可能な記録媒体であって、
前記コンピュータに、
（ａ）クエリ領域として、特定の多次元の領域が指定された場合に、
前記点の集合を一列に並べて得られた点の列上にあり、且つ、前記多次元空間を構成する全次元のうち１つの次元を除いた残りの各次元の座標がクエリ領域に含まれている点のみによって構成されている、区間を特定する、ステップと、
（ｂ）前記（ａ）のステップで特定された区間について、当該区間に出現する点が前記クエリ領域に含まれるための条件として、除かれた前記１つの次元における座標の値の範囲を特定する、ステップと、
（ｃ）前記（ａ）のステップで特定された区間、及び前記（ｂ）のステップで特定された前記座標の値の範囲を入力として、
前記点の列の並び順と同じ順序で、前記点の集合の各点における、除かれた前記１つの次元での座標を取り出すことで得られる、座標列に関して、当該座標列において入力された前記区間に出現し、且つ、値が入力された前記範囲に含まれる、全ての座標について、
前記全ての座標が対応する点の集合に関する統計量を計算する、ステップと、
を実行させる命令を含む、プログラムを記録しているコンピュータ読み取り可能な記録媒体。
【請求項２１】
前記プログラムが、前記コンピュータに、
（ｄ）前記（ａ）のステップによって特定された区間が複数である場合に、前記（ｂ）のステップによって計算された区間毎の前記点の集合に関する統計量を、更に集計し、集計によって得られた統計量を、前記クエリ領域に含まれる点の集合に関する全体的な統計量として、出力する、ステップを実行させる命令を更に含む、
請求項２０に記載のコンピュータ読み取り可能な記録媒体。
【請求項２２】
前記データ構造が、前記（ａ）のステップによる前記区間の特定に用いられる第１のデータ構造と、前記（ｃ）のステップによる前記統計量の計算に用いられる第２のデータ構造とを有している、
請求項２０または２１に記載のコンピュータ読み取り可能な記録媒体。
【請求項２３】
前記第１のデータ構造が、
前記多次元空間に設定された複数のカバー領域のいずれかと、前記点の列上において当該カバー領域に含まれる点が出現する区間とに関連付けられている、ノードを有する木構造によって表現されており、
前記（ａ）のステップにおいて、
前記ノードのうち、
関連付けられた前記カバー領域に存在する点における、前記１つの次元を除いた残りの各次元の座標がクエリ領域に含まれている、ノードを特定し、
特定した１又は２以上のノードが関連付けられている区間を前記区間として特定する、
請求項２２に記載のコンピュータ読み取り可能な記録媒体。
【請求項２４】
前記点の列は、
前記ノードに関連付けられたカバー領域それぞれに存在する点が、ひとつながりで連続して出現するように、前記点の集合に含まれる点を一列に並べて得られている、
請求項２３に記載のコンピュータ読み取り可能な記録媒体。
【請求項２５】
前記（ｃ）のステップにおいて、前記第２のデータ構造を用いて、
前記座標列から得られる複数の部分列のうち、入力された前記範囲に含まれる座標のみが出現する部分列を特定し、そして、特定した部分列上の区間であって、前記座標列において入力された前記区間に出現する座標が出現している、第二の区間を特定し、
更に、特定した前記第二の区間に出現する座標が対応する点の集合に関する統計量を計算する、
請求項２２に記載のコンピュータ読み取り可能な記録媒体。
【請求項２６】
前記部分列が、座標のビット表現が同じ接頭辞で始まる座標を、座標同士の位置関係を保ったまま抽出することで得られるものであり、
前記第２のデータ構造が、
前記部分列に関連付けられた複数のノードを有し、
前記複数のノードそれぞれは、前記部分列において出現する各座標のビット表現における、一つ以上の特定の桁のビットを取り出し、取り出した前記ビットを前記部分列と同じ順序で並べることによって得られる、ビットの列を用いて表現され、
前記（ｃ）のステップにおいて、前記複数ノードそれぞれを表現するビットの列を用いて、前記第二の区間を特定する、
請求項２５に記載のコンピュータ読み取り可能な記録媒体。
【請求項２７】
前記（ｃ）のステップにおいて、前記全ての座標が対応する点の集合に関する統計量として、前記全ての座標が対応する点の個数を計算する、
請求項２０〜２６のいずれかに記載のコンピュータ読み取り可能な記録媒体。
【請求項２８】
前記（ｃ）のステップにおいて、前記全ての座標が対応する点の集合に関する統計量として、前記全ての座標が対応する点それぞれの各次元の座標を計算する、
請求項２０〜２６に記載のコンピュータ読み取り可能な記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置、情報処理方法、及びこれらを実現するためのプログラムを記録したコンピュータ読み取り可能な記録媒体に関し、特には、多次元データ上での効率的な検索を行うための、情報処理装置、情報処理方法、及びコンピュータ読み取り可能な記録媒体に関する。【０００２】
多次元空間上に点が大量に存在するときに、指定した矩形の範囲に包含される点を見つけることは、矩形範囲検索（orthogonal range search）と呼ばれている。たとえば、次元数をdとおくと、d次元の多次元空間上の点は、d個の座標の組み合わせによりp=(p1, p2, …, pd)という形で表現できる。このような多次元空間上の点の集合が予め与えられているとする。さらに、個々の点pが重みw(p)を付与されているとする。【０００３】
このとき、各次元kの範囲を[lqk, uqk]で表すとして、Q=[lq1, uq1]×[lq2, uq2]×…×[lqd, uqd]というd次元の矩形の範囲を考える。この矩形の範囲をクエリ領域と呼ぶこととすると、矩形範囲検索の目標は、このクエリ領域Qに包含される点p、すなわち∀k∈{1,…,d}: lqk ≦ pk≦ uqkを満たす点pの集合を求め、その集合に関する情報を計算することである。このとき、点pがクエリ領域Qに含まれるためのd個の条件∀k∈{1,…,d}: lqk≦ pk≦ uqkをクエリの範囲条件と呼ぶこととする。【０００４】
このような矩形範囲検索は、地理情報を扱うアプリケーション、更には多次元データ分析において、重要な役目を果たす。以下に具体例を示す。【０００５】
たとえば、地図上でのレストランの位置は（緯度, 経度）という２つの値の組み合わせである２次元データで表すことができる。このとき、矩形範囲検索を用いると、経度が138度から139度、緯度が35度から36度の範囲に収まるような全てのレストランを検索できる。【０００６】
また、たとえば、ある会社の社員に関する統計データを（年齢, 身長, 年収）という３次元データで表すことができる。このとき、矩形範囲検索を用いると、年齢が30歳から40歳で、身長が170cmから180cm、年収が500万円から600万円の範囲に収まる全ての社員を検索できる。【０００７】
更に、矩形範囲検索には、検索結果として何を返すかによって様々なバリエーションが存在する。バリエーションの一例として、レポート・クエリ（report query）と集計クエリ（aggregate query）とが挙げられる。【０００８】
まず、レポート・クエリは、クエリ領域に包含される全ての点のリストを返す矩形範囲検索である。レポート・クエリは、クエリ領域に包含される点の数をヒット数と呼ぶことにすると、ヒット数に比例する大きさのリストを返してしまうため、ヒット数が大きくなるような大規模データの分析には向かない。たとえば、数千万個の点が包含されるとき、数千万個の点を全て出力することになってしまう。【０００９】
そこで、大規模データの分析においては、クエリ領域に包含される全ての点のリストを返すよりも、それらの点について集計した結果を返す集計クエリが重要となる。様々な集計クエリの中でも最も代表的なクエリはカウント・クエリ（count query）である。【００１０】
このカウント・クエリは、クエリ領域に包含される点の数を返す矩形範囲検索である。この他にも、点にそれぞれ重みが付与されている場合に、クエリ領域に包含される点の重みの合計を返す合計（sum）クエリ、及び最大値を返す最大値（max）クエリなどが存在する。【００１１】
本明細書では、これらのクエリが返す情報を、統計量と総称する。たとえば、統計量としては、カウント及び合計などが挙げられる。さらに、クエリに含まれる点の部分集合に関する統計量を「部分的な統計量」と呼び、クエリに含まれる全ての点の集合に関する統計量を「全体的な統計量」と呼ぶ。【００１２】
さて、矩形範囲検索に使うことができる代表的なデータ構造として、kd木が知られている（例えば、非特許文献１参照。）。kd木のサイズは、O(n)、つまり線形サイズで表現できる。また、kd木における矩形範囲検索の最悪時間計算量は、O(n(d-1)/d)であることが知られている。なお、nはデータ数、dは次元数である。kd木が達成している最悪時間計算量O(n(d-1)/d)は、これまで知られている実用的な線形サイズのデータ構造の時間計算量の中では、最良のものである。【００１３】
また、サイズがO(n)を超えてしまうような超線形サイズのデータ構造に、矩形範囲検索を適用した場合は、計算時間（計算量）を改善することができる。このような超線形サイズのデータ構造としては、たとえば、range treeと呼ばれるデータ構造が挙げられる。【００１４】
さらに、矩形範囲検索は、ウェーブレット木（wavelet tree）という２次元のデータ構造でも実現できる（例えば、非特許文献１参照）。この場合、２次元空間において探索が行なわれ、時間計算量は、O(log n)時間となる。【００１５】
なお、上述したkd木およびウェーブレット木を用いた矩形範囲検索については、非特許文献１に詳しく記載されている。また、ウェーブレット木を用いて２次元空間上の統計量を計算する手法については、非特許文献２に詳しく記載されている。
【先行技術文献】
【非特許文献】
【００１６】
【非特許文献１】Meng He, ”Succinct and Implicit Data Structures for Computational Geometry”, Lecture Notes in Computer Science Volume 8066 “Space-Efficient Data Structures, Streams, and Algorithms”, pp 216-235, 2013, Springer Berlin Heidelberg, ISBN 978-3-642-40272-2
【非特許文献２】Gonzalo Navarro and Luis M. S. Russo. “Space-efficient data-analysis queries on grids”, In Proceedings of the 22nd International Conference on Algorithms and Computation, ISAAC'11, pp. 323-332, Berlin, Heidelberg, 2011. Springer-Verlag.
【発明の概要】
【発明が解決しようとする課題】
【００１７】
このように、矩形範囲検索は種々のデータ構造で実現することができるが、実際には、以下に示す問題がある。まず、矩形範囲検索をkd木で実現した場合においては、達成される最悪時間計算量O(n(d-1)/d)が、データ数n及び次元数dのいずれか又は両方が大きくなる程、大きくなってしまうという問題がある。【００１８】
また、矩形範囲検索を超線形サイズのデータ構造で実現した場合は、kd木で実現した場合に比べ、計算時間の改善は図られるが、超線形サイズのデータ構造のサイズが大きすぎるため、実際のアプリケーションに用いることが難しく、実用的でないという問題がある。【００１９】
更に、矩形範囲検索をウェーブレット木で実現した場合は、ウェーブレット木が２次元のデータにしか用いることができないため、３次元以上の任意の次元のデータ構造に対する検索ができないという問題がある。【００２０】
本発明の目的の一例は、上記問題を解消し、任意の次元について、線形サイズで、kd木よりも高速な矩形範囲検索を実現し得る、情報処理装置、情報処理方法、及びコンピュータ読み取り可能な記録媒体を提供することにある。
【課題を解決するための手段】
【００２１】
上記目的を達成するため、本発明の一側面における情報処理装置は、多次元空間上の点の集合を表現するデータ構造を処理対象とする情報処理装置であって、
クエリ領域として、特定の多次元の領域が指定された場合に、
前記点の集合を一列に並べて得られた点の列上にあり、且つ、前記多次元空間を構成する全次元のうち１つの次元を除いた残りの各次元の座標がクエリ領域に含まれている点のみによって構成されている、区間を特定する、区間検索部と、
前記区間検索部で特定された区間について、当該区間に出現する点が前記クエリ領域に含まれるための条件として、除かれた前記１つの次元における座標の値の範囲を特定する、集計部と、
前記区間検索部で特定された区間、及び前記集計部で特定された前記座標の値の範囲を入力として、
前記点の列の並び順と同じ順序で、前記点の集合の各点における、除かれた前記１つの次元での座標を取り出すことで得られる、座標列に関して、当該座標列において入力された前記区間に出現し、且つ、値が入力された前記範囲に含まれる、全ての座標について、
前記全ての座標が対応する点の集合に関する統計量を計算する、座標列集計部と、
を備えている、ことを特徴とする。【００２２】
また、上記目的を達成するため、本発明の一側面における情報処理方法は、多次元空間上の点の集合を表現するデータ構造を処理対象とする情報処理方法であって、
（ａ）クエリ領域として、特定の多次元の領域が指定された場合に、
前記点の集合を一列に並べて得られた点の列上にあり、且つ、前記多次元空間を構成する全次元のうち１つの次元を除いた残りの各次元の座標がクエリ領域に含まれている点のみによって構成されている、区間を特定する、ステップと、
（ｂ）前記（ａ）のステップで特定された区間について、当該区間に出現する点が前記クエリ領域に含まれるための条件として、除かれた前記１つの次元における座標の値の範囲を特定する、ステップと、
（ｃ）前記（ａ）のステップで特定された区間、及び前記（ｂ）のステップで特定された前記座標の値の範囲を入力として、
前記点の列の並び順と同じ順序で、前記点の集合の各点における、除かれた前記１つの次元での座標を取り出すことで得られる、座標列に関して、当該座標列において入力された前記区間に出現し、且つ、値が入力された前記範囲に含まれる、全ての座標について、
前記全ての座標が対応する点の集合に関する統計量を計算する、ステップと、
を有する、を特徴とする。【００２３】
更に、上記目的を達成するため、本発明の一側面におけるコンピュータ読み取り可能な記録媒体は、多次元空間上の点の集合を表現するデータ構造を処理対象とする情報処理をコンピュータによって行なうためのプログラムを記録したコンピュータ読み取り可能な記録媒体であって、
前記コンピュータに、
（ａ）クエリ領域として、特定の多次元の領域が指定された場合に、
前記点の集合を一列に並べて得られた点の列上にあり、且つ、前記多次元空間を構成する全次元のうち１つの次元を除いた残りの各次元の座標がクエリ領域に含まれている点のみによって構成されている、区間を特定する、ステップと、
（ｂ）前記（ａ）のステップで特定された区間について、当該区間に出現する点が前記クエリ領域に含まれるための条件として、除かれた前記１つの次元における座標の値の範囲を特定する、ステップと、
（ｃ）前記（ａ）のステップで特定された区間、及び前記（ｂ）のステップで特定された前記座標の値の範囲を入力として、
前記点の列の並び順と同じ順序で、前記点の集合の各点における、除かれた前記１つの次元での座標を取り出すことで得られる、座標列に関して、当該座標列において入力された前記区間に出現し、且つ、値が入力された前記範囲に含まれる、全ての座標について、
前記全ての座標が対応する点の集合に関する統計量を計算する、ステップと、
を実行させる命令を含む、プログラムを記録していることを特徴とする。
【発明の効果】
【００２４】
以上のように、本発明によれば、任意の次元について、線形サイズで、kd木よりも高速な矩形範囲検索を実現することができる。
【図面の簡単な説明】
【００２５】
【図１】図１は、本発明の実施の形態における情報処理装置の概略構成を示すブロック図である。
【図２】図２は、本発明の実施の形態における情報処理装置の具体構成を示すブロック図である。
【図３】図３は、kd木の元になる２次元平面の一例を示している。
【図４】図４（ａ）は、２次元空間から得られるkd木の一例を示し、図４（ｂ）は、kd木から得られる点の列Pの一例を示している。
【図５】図５は、本発明の実施の形態で用いられるウェーブレット木の一例を示す図であり、図５（ａ）及び（ｂ）はそれぞれ次元が異なるウェーブレット木を示している。
【図６】図６は、本発明の実施の形態における情報処理装置の動作を示すフロー図である。
【図７】図７は、再帰的に区間を検索する関数find_intervals(v, Q)の動作を示すフロー図である。
【図８】図８は、座標列に基づき集計する関数aggregate_interval(v , s , e , lqf, uqf)の動作を示すフロー図である。
【図９】図９は、２次元の場合の探索ノード数と包含次元数との変化を示す図である。
【図１０】図１０は、本発明と従来手法との計算量の比較を示す図である。
【図１１】図１１は、本発明の実施の形態における情報処理装置を実現するコンピュータの一例を示すブロック図である。
【発明を実施するための形態】
【００２６】
（発明の原理）
最初に、本発明の基本的な原理について、一般的なkd木を例に挙げて以下に説明する。
【００２７】
まず、kd木は、多次元データを扱うための二分探索木である。kd木の特徴は、空間全体を、次元1から次元dまでの各次元で順番に２分割していくことである。kd木では、木構造が空間の再帰的な分割を表しており、二分探索木の各ノードが部分領域に関連付けられている。各ノードvが関連付けられている部分領域R(v)を、本明細書では、ノードの「カバー領域」と呼ぶことにする。カバー領域R(v)は、R(v)=[lv1, uv1]×[lv2, uv2]×…×[lvd, uvd]というd次元の矩形の範囲として表すことができる。kd木においては、ノードvをルートとする部分木に存在する点は、vのカバー領域R(v)に含まれる。
【００２８】
さらに、kd木は、各ノードに、そのノードをルートとする部分木に含まれる点の集合の統計量を保持しておくことができる。たとえば、カウント・クエリを高速に計算したい場合は、各ノードをルートとする部分木に含まれる点の数を、そのノードに保存する。
【００２９】
kd木における矩形範囲検索は以下のように実現される。まず、木全体のルートノードを出発点として、各内部ノードにおいて子ノードが関連付けられているカバー領域がクエリ領域と重なるかどうかが判定され、重なる場合にだけ、その子ノードに移動することが繰り返される。子ノードへの移動は、特定の次元でカバー領域を二分割することに相当する。そして、ノードが関連付けられているカバー領域が、クエリ領域に完全に包含された場合は、そのノードに保存されている、部分木に含まれる点の統計量を、部分的な統計量として記憶する。何故なら、部分木に含まれる点はカバー領域に含まれ、当該点は、このときクエリ領域にも含まれるからである。この統計量は、クエリ領域に含まれる点の部分集合に関する統計量であるため、部分的な統計量である。
【００３０】
カバー領域がクエリ領域に完全に包含されるノードの統計量を全て見つけたとき、ノードの探索は終了する。このとき、これらの部分的な統計量を全て集計することにより、クエリ領域に含まれる全ての点に関する全体的な統計量を計算して出力する。
【００３１】
より厳密に説明するため、以下のように用語を定義する。次元kにおいて、[lvk , uvk] ⊆ [lqk , uqk]という範囲条件が成り立つとき、「カバー領域R(v)がクエリ領域Qに次元kで包含されている」と呼ぶ。次元kにおいてカバー領域R(v)がこの範囲条件[lvk , uvk] ⊆ [lqk , uqk]を満たすとき、カバー領域に含まれる点も同様に次元kの範囲条件pk⊆ [lqk , uqk]を満たす。何故なら、pk⊆[lvk , uvk] ⊆ [lqk , uqk]が成り立つからである。すなわち、カバー領域に関して次元kの範囲条件が成り立つとき、カバー領域に含まれる点に関しても次元kの範囲条件が成り立つ。
【００３２】
さらに、d個の次元のうちh個の次元において包含されているとき、「カバー領域の包含次元数はhである」、と定義する。また、包含次元数がdであるとき、すなわち、全ての次元が包含されているとき、カバー領域は完全に包含されていると呼ぶ。包含次元数は、d個の範囲条件のうち、満たされている条件の数である。
【００３３】
kd木は、包含次元数がdに達するまで、すなわち、この範囲条件がd個全て満たされるまで空間を分割する手法である。
【００３４】
kd木の探索では、以上のように、与えられたクエリ領域にカバー領域が完全に含まれるノードの統計量を合わせることによって、探索結果が得られている。このとき、kd木はカバー領域がクエリ領域に一部包含されているが、完全に包含されていないノードを全てたどる必要があるが、このようなノードの数はO(n(d-1)/d)になることが知られている。このため、kd木の最悪時間計算量はO(n(d-1)/d)になる。
【００３５】
これに対して、本発明は、カバー領域がクエリ領域に完全に包含される前にkd木での探索をやめ、ウェーブレット木での探索に移行することを特徴とする。
【００３６】
より厳密に言えば、本発明では、包含次元数がdに達するまで空間を分割するのではなく、包含次元数がd-1に達するまで空間を分割する。このとき、まだ範囲条件が満たされていない最後の次元f（1≦f≦d）について、次元fに関するウェーブレット木を用いて、次元fの範囲条件を満たす座標を見つけることで、高速な検索を実現する。
【００３７】
これにより、本発明によれば、kd木を最後までたどる従来の手法と異なり、たどるノードの数が削減され、kd木より高速な矩形範囲検索が実現される。
【００３８】
（本明細書で用いられる概念）
ここで、本明細書で用いられる種々の概念について以下に説明する。本明細書では、全ての点の座標piが[0,n-1]の整数で表されるものとする。さらに、これらの整数は、二進表現で長さl=ceil(log n)のビットで表されるとする。なお、ceil()は天井関数を表す。logは底を２とする対数関数を表す。
【００３９】
たとえば、n=8のとき、全ての座標は[0,7]の整数で表され、二進表現では長さl=ceil(log n) =3ビットで表される。すなわち、0=”000”, 1=”001”, 2=”010”, 3=”011”, 4=”100”, 5=”101”, 6=”110”, 7=”111”で表すことができる。
【００４０】
ただし、本発明は、座標が整数で表されていない一般の多次元空間に対しても適用できる。たとえば、順位空間(rank space)への変換という手法を用いれば、任意の実数で表されるn個の点を、[0,n-1]の範囲の整数の座標に変換でき、その座標を用いることで、矩形範囲検索を実現できる。従って、この順位空間への変換を用いることにより、本発明を、実数で表される一般の多次元空間に適用することが可能である。なお、順位空間への変換については、たとえば上述の非特許文献１に記載されている。
【００４１】
また、本発明は、値を１と０の二進表現で表現できていれば、順位空間への変換が行なわれていなくても適用できる。すなわち、データ数がnであるとき、座標の値の範囲が[0,n-1]の範囲から外れているデータであっても、本発明は適用できる。本明細書では、計算量の理論的な分析を行うために[0,n-1]の範囲に限定して説明しているだけであり、実用上は[0,n-1]の範囲に限らなくても問題なく本発明を適用できる。
【００４２】
また、本明細書では、「接頭辞」という概念を用いる。接頭辞とは、整数を二進表現で表したときに、その上位ビットだけを取り出したものである。本明細書では、整数の上位hビットの接頭辞を、h個の1と0、および(l-h)個の＊の組み合わせで表記する。＊はワイルドカードであり、1および0のどちらでもよいことを表している。ある整数が特定の接頭辞から始まることは、その整数が、特定の連続範囲に含まれることに対応する。
【００４３】
たとえば、整数が長さl=3のビット列であらわされているとする。このとき長さ1の接頭辞”0**”は、”000”, “001”, ”010”, ”011”という４つの値に対応する。すなわち、この接頭辞は、整数上の値の範囲である[“000”,”011”]=[0,3]に対応する。同様に、長さ2の接頭辞”01*”は、”010”と”011”という２つの値に対応しており、値の範囲で表すと[“010”,”011”]=[2,3]に対応する。長さlの接頭辞は、ひとつの整数だけに対応する。
【００４４】
また、本明細書では、列(sequence)に関して、以下の表記が用いられる。たとえば、長さnの列Aが存在するとき、Aの最初の要素をA[0]、Aの最後の要素をA[n-1]とする。さらに、A上の添字sの要素A[s]から添字eの要素A[e]までの(e-s+1)個の要素で構成される列をA[s,e]で表し、終端A[e]を含まない場合はA[s,e)で表すものとする。また、A[s,e]に含まれる要素を、A上で区間I=[s,e]に含まれる要素、と呼ぶ。
【００４５】
さらに、本明細書では、座標の値の範囲(range)と、列上の添字の区間(interval)とが、厳密に区別される。座標の値の範囲も、列上の添字の区間も、２つの数字のペアで表されるが、この明細書では、[l,u]を「範囲」と呼ぶとき、lとuは座標の値である。一方、[s,e]を「区間」と呼ぶとき、sとeは列に関する添字である。
【００４６】
（実施の形態）
続いて、本発明の実施の形態における、情報処理装置、情報処理方法、及びプログラムについて、図１〜図１０を参照しながら説明する。
【００４７】
［装置構成］
最初に、本実施の形態における情報処理装置の概略構成について図１を用いて説明する。図１は、本発明の実施の形態における情報処理装置の概略構成を示すブロック図である。図１に示す本実施の形態における情報処理装置１００は、多次元空間上の点の集合を表現するデータ構造４０を処理対象とする装置である。そして、図１に示すように、情報処理装置１００は、区間検索部１０と、集計部２０と、座標列集計部３０とを備えている。
【００４８】
このうち、区間検索部１０は、クエリ領域として、特定の多次元の領域が指定された場合に機能する。クエリ領域は、上述したように、例えば、各次元に対応するd個の範囲の組み合わせで表現される。
【００４９】
区間検索部１０は、点の集合を一列に並べて得られる点の列P上にあり、且つ、多次元空間を構成する全次元のうち１つの次元を除いた残りの各次元の座標がクエリ領域に含まれている点のみによって構成されている、区間を特定する。言い換えると、区間検索部１０は、点がクエリ領域に含まれるためのd個の条件のうち(d-1)個の条件を満たす、点を含む、列P上の添字の区間を０個以上特定する。また、区間検索部１０は、特定した区間を集計部２０に出力する。
【００５０】
集計部２０は、区間検索部１０で特定された区間について、クエリ領域に含まれるための条件として、除かれた１つの次元における座標の値の範囲を特定し、特定した座標の値の範囲と区間検索部１０で特定された区間とを座標列集計部３０に出力する。
【００５１】
言い換えると、集計部２０は、区間検索部１０で特定された点の列Pの各区間に含まれる点が満たしていない最後の範囲条件が対応する次元fについて、これらの点がクエリ領域に含まれるために必要な範囲条件となる座標の値の範囲を特定する。そして、集計部２０は、次元fに対応する座標列集計部３０に、区間検索部１０が特定した列P上の添字の区間と、次元fの座標の値に関する範囲条件となる座標の値の範囲とを与えて、問い合わせを行う。
【００５２】
座標列集計部３０は、区間検索部１０で特定された区間（添字の区間）と、次元fにおける座標の値の範囲とが入力されると、機能する。座標列集計部３０は、入力がなされると、点の列Pの並び順と同じ順序で、点の集合の各点における次元fでの座標を取り出すことで得られる、座標列に関して、入力された区間に出現し、且つ、値が入力された範囲に含まれる、全ての座標について、これらの座標が対応する点の集合に関する統計量を計算する。また、座標列集計部３０は、計算した統計量を集計部２０に出力する。
【００５３】
このように、情報処理装置１０では、クエリ領域を表すd個の条件のうち(d-1)個の条件を満たされるまでだけ、多次元空間が分割されるので、kd木を探索する場合に比べて、クエリ領域の分割に要する計算量が削減される。このため、情報処理装置１０によれば、任意の次元dについて、線形サイズで、kd木よりも高速な矩形範囲検索を実現することができる。
【００５４】
次に、図２を用いて、本実施の形態における情報処理装置１００の構成について更に具体的に説明する。図２は、本発明の実施の形態における情報処理装置の具体構成を示すブロック図である。
【００５５】
図２に示すように、本実施の形態では、情報処理装置１００は、上述した区間検索部１０と、集計部２０と、座標列集計部３０と、に加えて、記憶部４３と、入力受付部５０と、出力部６０と、を備えている。
【００５６】
また、本実施の形態では、次元毎に設けられたｄ個の座標列集計部３０−１〜３０―ｄが備えられている。そして、座標列集計部３０−１〜３０―ｄそれぞれは、対応する次元と区間検索部１０で特定された区間の次元とが一致する場合に、点の集合に関する統計量を計算する。なお、以降の説明において、座標列集計部を個別に特定しない場合は、「座標列集計部３０」と表記する。
【００５７】
また、入力受付部５０は、外部からのクエリ領域の入力を受け付け、これを区間検索部１０に出力する。記憶部４３は、データ構造４０を記憶している。本実施の形態では、データ構造４０は、区間検索部１０による区間の特定に用いられる区間検索用データ構造４１と、座標列集計部３０による統計量の計算に用いられる座標列集計用データ構造４２とを有している。
【００５８】
また、区間検索部１０は、入力受付部５０からクエリ領域が出力されてくると、記憶部４３に対して問い合わせ、区間検索用データ構造４１を取得する。区間検索用データ構造４１は、クエリ領域が指定されたときに、区間検索部１０によって、点の列P上における、クエリ領域を表すd個の条件のうち(d-1)個の条件を満たす点を含む区間を特定するための、データ構造である。
【００５９】
本実施の形態では、区間検索用データ構造４１としては、ノードを有する木構造によって表現されたデータ構造が挙げられる。また、このデータ構造において、ノードは、多次元空間に設定された複数のカバー領域のいずれかと、点の列上において、該当するカバー領域に含まれる点が出願する区間と、の両方に関連付けられている。具体的には、区間検索用データ構造４１としては、kd木が挙げられる。なお、本実施の形態において、区間検索用データ構造４１は、kd木に限定されず、木構造の各ノードが矩形の領域に関連付けられた任意のデータ構造であれば良い。他の具体例としては、kdB木、R木、bounding volume hierarchy (BVH)、と呼ばれるデータ構造も挙げられる。
【００６０】
本実施の形態では、区間検索部１０は、ノードのうち、関連付けられたカバー領域に存在する点における、１つの次元を除いた残りの各次元の座標がクエリ領域に含まれている、ノードを特定する。そして、区間検索部１０は、特定した１又は２以上のノードが関連付けられている区間を特定する。
【００６１】
ここで、区間検索用データ構造４１について、更に詳しく説明する。上述したように、本実施の形態では、区間検索用データ構造４１としてkd木を用いることができる。kd木は、各ノードが多次元空間上に設定された矩形領域に関連付けられた二分木である。この矩形領域が、上述したカバー領域に相当する。kd木のルートノードのカバー領域は、グリッド上の全領域、[0,n-1]×[0,n-1]×[0,n-1]× … ×[0,n-1]である。また、各ノードの深さは、いずれかひとつの次元に着目して空間を二分割すると、１つ下がり、分割する次元は1,2,3,…,dの順番で繰り返して選ぶものとする。
【００６２】
kd木は、ルートノードを出発点として、以下のように再帰的に構築できる。まず、各内部ノードにおいて、その深さで分割に用いられる次元がkであるとき、そのカバー領域に含まれる全ての点について次元kの座標を調べ、中央値となる座標を選び、その座標を用いてカバー領域を二分割する。すなわち、その座標をtとおくと、カバー領域は、次元kの座標がtより小さくなる領域と、次元kの座標がtと同じか、tより大きくなる領域とに分割される。
【００６３】
そして、この内部ノードの２つの子ノードは、分割によって得られた２つの領域に対応する。この分割を左の子ノードと右の子ノードに再帰的に適用することで、kd木は構築される。また、内部ノードはそれぞれ、分割に用いられた座標を保持する。従って、この分割を繰り返して、カバー領域に含まれる点が１つになれば、これ以上分割せずに、このカバー領域に関連付けられた葉ノードを構築して保持する。終端となる葉ノードは、そのカバー領域に含まれる点自体を保持する。また、各点が重みを持つ場合、葉ノードは、この重みについても同様に保持する。
【００６４】
また、kd木の各ノードvのカバー領域R(v)に関して、ノードvは、カバー領域の値を直接保持していても良いし、kd木を探索するときに、通過したノードに保持されている分割に用いられた座標から、カバー領域の値を動的に計算しても良い。
【００６５】
なお、kd木の定義方法には複数のバリエーションが存在するが、本実施の形態においては、そのいずれの定義が用いられても良い。また、本実施の形態では、kd木の内部ノードが分割に用いた座標のみを保持する定義を用いて説明が行われているが、これに限定される趣旨ではない。本実施の形態においては、kd木の内部ノードが分割に用いた点自体を保持する定義が用いられていても良い。また、後述するように、葉ノードが１つの点を保持する定義に限定されず、葉ノードが複数の点を保持する定義が用いられていても良い。
【００６６】
また、上述した点の列Pは、ノードに関連付けられたカバー領域それぞれに存在する点が、ひとつながりで連続して出現するように、点の集合に含まれる点を一列に並べて得られている。
【００６７】
具体的には、点の列Pは、構築されたkd木を用いて以下のように定義される。まず、点の列Pにおいて、各点は、kd木を通りがけ順(in-order)に探索したときに見つかる順序に基づいて並べられているものとする。すなわち、kd木のルートノードを出発点として、まず左の部分木が探索され、次にルートノード自身を通り、右の部分木が探索される。この探索順序を再帰的に全ノードに適用するとき、kd木に含まれる全ての点に一回ずつアクセスすることになるが、その順番通りに点を並べて得られる列をPとする。
【００６８】
このとき、kd木の任意のノードvに関して、以下の条件を満たす区間Iv = [s, e]が存在する。その条件とは、点の列P上で区間Ivに含まれる点の集合が、vをルートノードとする部分木に含まれる点の集合と一致することである。各ノードvは、このような区間Ivを保持するものとする。このとき、vの部分木に含まれる点の数nvは、nv=e-s+1という式で計算できる。
【００６９】
さらに、この点の列Pに対応する、k個の座標列Pkを考える。ただし、Pkは、次元kについて、点の列Pの並び順と同じ順序で、各点の次元kでの座標を取り出すことで得られる座標列である。
【００７０】
ここで、図３及び図４を用いて、kd木の具体例について説明する。また、以下の説明では、次元数dは２次元であるとする。図３は、kd木の元になる２次元平面の一例を示している。図４（ａ）は、２次元空間から得られるkd木の一例を示し、図４（ｂ）は、kd木から得られる点の列Pの一例を示している。
【００７１】
図３に示すように、２次元平面上には複数の点が存在している。具体的には、[0,7]×[0,7]のグリッドで表される２次元平面に、n=8個の点が存在している。それぞれの点には0から7の番号が与えられているが、これは後述するように、点の列Pにおける順序を表している。すなわち、0と書かれた点は、点の列Pにおける最初の点であるP[0]を表している。また、グリッドの上に引かれている太線は、kd木のノードによって生じる空間の分割を表しており、横の太線は次元１に関する分割を、縦の太線は次元２に関する分割を表している。
【００７２】
また、図４（ａ）に示すように、図３に示した各点はkd木に格納される。この木構造において、深さが偶数のノードは次元１に関する分割を表し、深さが奇数のノードは次元２に関する分割を表している。内部ノードの上部に示されている式は、どの座標を用いて空間を分割しているかを表している。さらに、ノードの下部には、そのノードに対応する点の列Pでの区間Ivが示されている。葉ノードでは、分割に用いる座標の代わりに、座標の組で表される点が保持されている。
【００７３】
また、図４（ｂ）に示すように、点の列Ｐは、図３に示した点と図４（ａ）に示したkd木とに対応する。定義により、座標列P1とP2も同じ図で表される。図４（ｂ）の一行目は添字iの値を表し、二行目は座標列P1、三行目は座標列P2を表す。この図によれば、たとえば、P[0] = (P1[0],P2[0]) = (0,4) である。
【００７４】
続いて、図４（ａ）に示したkd木の一例が、上述したkd木の定義を満たしていることについて説明する。たとえば、kd木のルートノードvは、与えられたグリッドにおける全ての領域をカバー領域R(v)として持つ。すなわち、カバー領域R(v)=[0,7]×[0,7]である。さらに、全ての点はルートノードの子として含まれるため、区間Iv= [s, e]=[0,7]である。ルートノードは深さ０であり、次元１で空間を分割している。次元１の座標のうち中央値となるp1=4に注目して、p1<4となる領域と4≦p1となる領域とに分割している。従って、左の子ノードのカバー領域は[0,3]×[0,7]であり、右の子ノードのカバー領域は[4,7]×[0,7]である。以下、同様に分割されて構築されている。
【００７５】
また、点の列Pは、kd木を通りがけ順に巡回した順番に並んでいるため、全てのノードについて、点の列P上で区間Ivに含まれる点は、そのノードをルートとする部分木に含まれている。たとえば、図４（ａ）において木全体のルートノードの左の子ノードは、Iv=[0,3]であるが、このことは、P[0]からP[3]の４つの点が、このノードをルートとする部分木に含まれることを表す。
【００７６】
また、本実施の形態では、座標列集計部３０は、まず、座標列集計用データ構造４２を用いて、座標列から得られる複数の部分列のうち、入力された範囲に含まれる座標のみが出現する部分列を特定する。そして、座標列集計部３０は、特定した部分列上の区間であって、座標列において入力された区間に出現する座標が出現している、区間を特定し、特定した部分列上の区間に出現する座標が対応する点の集合に関する統計量を計算する。なお、後述するように、部分列としては、座標のビット表現が同じ接頭辞で始まる座標を、座標同士の位置関係を保ったまま抽出することで得られるものが挙げられる。
【００７７】
また、本実施の形態では、座標列集計用データ構造４２は、1からdの各次元kに対応する座標列Pkを表現するデータ構造である。ただし、Pkは、次元kについて、前記点の列Pの並び順と同じ順序で、各点の次元kでの座標を取り出すことで得られる座標列である。座標列集計用データ構造４２は、座標列集計部３０において、座標列Pk上の添字の区間と、座標の値の範囲とが入力されたときに、座標列上での位置が入力された区間に含まれ、且つ、値が入力された範囲に含まれる、全ての座標について、これらの座標が対応する点の集合に関する統計量を計算できるようにする、データ構造である。
【００７８】
座標列集計用データ構造４２としては、上述の部分列に関連付けられた複数のノードを有するデータ構造が挙げられる。この場合、各ノードは、部分列において出現する各座標のビット表現における、一つ以上の特定の桁のビットを取り出し、取り出したビットを部分列と同じ順序で並べることによって得られる、ビットの列を用いて表現できる。この場合、座標列集計部３０は、各ノードを表現するビットの列を用いて、部分列上の区間を特定する。
【００７９】
具体的には、本実施の形態では、座標列集計用データ構造４２として、ウェーブレット木を用いることができる。この場合、区間検索用データ構造４２は、1からdの各次元に対応する、d個のウェーブレット木で構築されている。このd個のウェーブレット木の集合をW={wk}とする。
【００８０】
ただし、本実施の形態において、座標列集計用データ構造４２は、ウェーブレット木に限定されるものではない。座標列集計用データ構造４２は、整数列上の添字の区間と整数の値の範囲とが条件として与えられたとき、整数列上で、その区間に含まれ、かつ、その範囲条件を満たす、点を検索できる、データ構造であれば良い。たとえば、その他の座標列集計用データ構造４２としては、Chazelleのcompressed range tree、compressed range treeを外部記憶に拡張したCompressed Range B-tree (CRB-tree)等が挙げられる。
【００８１】
ここで、上述した図３及び図４に加え、図５を用いて、座標列集計用データ構造４２の具体例、すなわち、d個のウェーブレット木の具体例について説明する。また、以下の説明では、次元数は２次元であるとする。図５は、本発明の実施の形態で用いられるウェーブレット木の一例を示す図であり、図５（ａ）及び（ｂ）はそれぞれ次元が異なるウェーブレット木を示している。
【００８２】
図５（ａ）は座標列P1及び座標列P1に対応するウェーブレット木w1を示し、図５（ｂ）は座標列P2及び座標列P2に対応するウェーブレット木w2を示している。また、各図の左に示されたテーブルは座標列を表している。１行目は列の添字iを示し、２行目は添字に対応する整数を示している。そして、３行目以降には、各整数のビット表現が示されている。
【００８３】
そして、次元kの座標列Pkに対応するウェーブレット木は、以下のように、二分木として定義される。なお、ウェーブレット木は、深さlの二分木である。この木構造において、親から左の子に向かうエッジはビット0に対応し、親から右の子に向かうエッジはビット1に対応する。
【００８４】
まず、ウェーブレット木のルートノードは、深さ0にあり、長さ0ビットの座標接頭辞に対応しているものとする。さらにウェーブレット木の深さhにあるノードvは、ルートノードからそのノードへのパスに出現するh個のビットを連結して得られるhビットの座標接頭辞πに対応しているものとする。深さlにあるノードは全て葉ノードである。葉ノードは、ルートからそのノードへのパスに出現するl個のビットを連結して得られるlビットで表される１つの整数に対応する。
【００８５】
さらに、深さhにおいて座標接頭辞πに対応するノードvは、座標列Pkの部分列Pk (π)に対応する。ただし、Pk (π)は、座標列Pkから座標接頭辞πで始まる全ての整数を、その並び順と同じ順序を保ったまま抜き出した部分列とする。本明細書では、元となるPkを「座標列」、座標接頭辞πに注目して抜き出した部分列Pk(π)を、「座標部分列(coordinate subsequence)」と呼び分けることとする。
【００８６】
座標部分列Pk(π)の添字iの要素であるPk(π)[i]が、元の座標列Pkの添字jの要素であるPk[j]に相当するとき、このPk(π)[i]は、元々は、点P[j]の次元kの座標である。このとき、本明細書では、座標Pk(π)[i]は、点P[j]に属する、と呼ぶこととする。
【００８７】
さらに、このノードvは、Pk (π)の各要素のh+1番目のビットのみを抜き出して同じ順序で連結したビット列Bvを記憶しているものとする。すなわち、整数Pk (π)[i]のh+1ビット目が0であるときBv[i]=0となり、1であるときBv[i]=1となるようなビット列である。
【００８８】
具体的には、図５（ａ）及び（ｂ）に示すように、本実施の形態では、次元１の座標列P1に対して構築されたウェーブレット木w1と、次元２の座標列P2に対して構築されたウェーブレット木w2とが用いられる。また、図５（ａ）及び（ｂ）においては、各ノードについて対応する座標接頭辞π、座標部分列Pk(π)、およびビット列Bvが示されている。
【００８９】
また、図５（ａ）及び（ｂ）に示すように、ウェーブレット木w1は、座標列P1=(0,2,1,3,4,7,5,6)のウェーブレット木である。座標列P1の各要素は、3ビットで表されている。そして、各ウェーブレット木のルートノードは、座標接頭辞π＝”***”に結びつけられている。よって、この座標接頭辞は3ビットで表せる全ての値、すなわち、[“000”,”111”]=[0,7]までの範囲の全ての値に対応している。このため、ルートノードは、座標部分列P1(π)の0+1=1ビット目のビットをビット列Bvとして保持している。
【００９０】
次に、ルートノードの左の子ノードは、接頭辞“0**”に対応しており、1ビット目が0で始まる3ビットの整数、すなわち[0,3]の範囲に対応し、さらに、座標列P1から[0,3]の範囲に該当する値だけを取り出した座標部分列P1 (π)=(0,2,1,3)にも対応する。よって、この左の子ノードは、その2ビット目のビットをビット列Bvとして保持している。なお、以降の子ノードも同様に考えることができる。
【００９１】
また、ウェーブレット木は、各内部ノードvについて、ビット列Bvの完備辞書を保持している。完備辞書は、長さnのビット列Bに対してaccess、rank、selectと呼ばれる３種類の操作をサポートするデータ構造である。この３種類の操作は以下のように定義される。
【００９２】
access(B,i)は、B上の添字iの要素B[i]を返す。
rank1(B,i)は、B[0,i)の範囲に存在する1の数を返す。
rank0(B,i)は、B[0,i)の範囲に存在する0の数を返す。
select1(B,i)は、B上でi+1番目の1が出現する位置jを返す。
select0(B,i)は、B上でi+1番目の0が出現する位置jを返す。
【００９３】
なお、完備辞書は、文献によっては、簡潔ビットベクトルあるいはrank / select dictionaryなどと呼ばれることがある。
【００９４】
また、図５（ａ）及び（ｂ）の例では、説明のため、ウェーブレット木の各ノードにおいて、座標接頭辞πと、座標部分列Pk(π)と、ビット列Bvとが、示されているが、実際には、ウェーブレット木はBvの完備辞書だけを保持しており、座標接頭辞πおよび座標部分列Pk (π)を保持している必要はない。これは、座標接頭辞πは、たどってきたエッジの情報から計算でき、座標部分列Pk (π)の各要素は、ビット列Bvの完備辞書を用いることで計算できるためである。よって、記憶部４３には、実際には、座標列集計用データ構造４２として、完備辞書のみが保持される。
【００９５】
なお、ウェーブレット木の定義方法は文献によって異なる。上述した非特許文献１では、ウェーブレット木は、接頭辞を用いずに定義されているが、本明細書では、ウェーブレット木は、説明のため、接頭辞を用いて定義されている。どちらの定義の場合であっても、ウェーブレット木の本質的な構造は同一であり、同じ動作を実現できる。
【００９６】
また、ウェーブレット木は、木構造としての探索が可能な構造、即ち、複数のノードを有する構造を有していれば、明示的に木構造として構成されていなくてもよい。たとえば、ウェーブレット行列という、ビット列をノードごとに分けずにウェーブレット木を実装する手法が知られているが、本発明における議論は、ウェーブレット行列を使った場合でもまったく同様に成立する。
【００９７】
また、区間検索部１０によって特定された区間が複数である場合は、集計部２０は、座標列集計部３０によって計算された区間毎の統計量（即ち、部分的な統計量）を、更に集計する。この場合、集計部２０は、集計によって得られた全体的な統計量を、クエリ領域に含まれる点の集合に関する全体的な統計量として、出力部６０に出力する。その後、出力部６０は、集計部２０が出力した全体的な統計量を、外部の端末装置、サーバ装置等に出力する。
【００９８】
［探索アルゴリズムの概要］
続いて、情報処理装置１００の動作を説明する前に、情報処理装置１００において用いられる探索アルゴリズムの概要について以下に説明する。
【００９９】
初めに、kd木を用いて、ノードのカバー領域がクエリ領域と重なっており、かつ、ノードのカバー領域の包含次元数が(d-1)になるノードを見つける。このことはすなわち、ノードのカバー領域がクエリ領域に含まれるためのd個の範囲条件のうち、(d-1)個の範囲条件が成り立っていることを表す。ここで、条件が成り立っていない次元をfとおく。
【０１００】
このノードvが保持する添字の区間Iv = [s, e]に注目すると、点の列PのうちP[s,e]に含まれる点は、このノードvをルートとする部分木に含まれる点であるから、f以外の次元に関して、クエリの範囲条件を満たすことが保証される。ただし、次元fに関する範囲条件を満たすことが保証されない。
【０１０１】
そこで、次元fに関する座標列Pfに注目する。もしPf[s,e]に含まれる座標Pf[i]が、次元fに関する範囲条件を満たすとき、座標Pf[i]に対応する点P[i]は、全ての次元に関するd個の範囲条件を満たす。より厳密に表現すれば、s≦i≦eを満たすiに関して、座標Pf[i]が、次元fにおける範囲条件lqf≦Pf[i]≦uqfをさらに満たすとき、この座標Pf[i]はクエリの範囲条件を全て満たす点P[i]に属する。
【０１０２】
本実施の形態では、このような性質が利用される。すなわちPf[s,e]に含まれる座標であって、座標の値が次元fに関するクエリの範囲[lqf,uqf]に含まれるような全ての座標について、それらの座標が属する点の集合の統計量を計算する。この統計量は、ウェーブレット木を用いることで高速に計算できる。この統計量は、P[s,e]に含まれる点であって、クエリに含まれる点の集合の統計量に等しい。この統計量を、全ての区間について計算することで、クエリに含まれる全ての点の集合に関する全体的な統計量を求めることができる。
【０１０３】
［装置動作］
次に、本発明の実施の形態における情報処理装置１００の動作について図６を用いて説明する。図６は、本発明の実施の形態における情報処理装置の動作を示すフロー図である。また、以下の説明においては、適宜図１〜図５を参酌する。また、本実施の形態では、情報処理装置１００を動作させることによって、情報処理方法が実施される。よって、本実施の形態における情報処理方法の説明は、以下の情報処理装置１００の動作説明に代える。
【０１０４】
図６に示すように、まず、入力受付部５０は、クエリ領域の範囲を指定するための外部からの入力を受付け（ステップＡ１）、受け付けた内容を区間検索部１０に出力する。この入力されたクエリ領域Qは、Q=[lq1, uq1]×[lq2, uq2]×…×[lqd, uqd]と表記される。
【０１０５】
次に、区間検索部１０は、統計量の集合を表す変数であるASに、空集合をセットする（ステップＡ２）。この変数ASは、クエリに含まれる点の部分集合に関する部分的な統計量を、中間集計として格納するための変数である。
【０１０６】
次に、区間検索部１０は、記憶部４３に問い合わせを行なって、区間検索用データ構造４１、すなわちkd木を取得する。区間検索部１０は、kd木のルートノードを変数vに代入する（ステップＡ３）。この変数vは、現在注目しているノードを表す変数である。
【０１０７】
区間検索部１０は、クエリ領域Qについて、区間検索用データ構造４１を対象として関数find_intervals(v,Q)を実行し、区間と次元とのペアの集合IDPを返り値として取得する（ステップＡ４）。IDPに含まれる区間Iv=[s,e]と次元fとのペアは、点の列Pにおいて、P[s,e]に含まれるe-s+1個の点が、次元f以外の(d-1)個の範囲条件を満たしていることを表している。また、関数find_intervals(v,Q)は、そのようなIDPを返す関数である。
【０１０８】
なお、関数find_intervals(v,Q)は、クエリに含まれる点であって、点の列P上でこれらの区間に含まれない点を見つけた場合、それらの点については別途統計量を計算して変数ASに格納する。区間検索部１０は、IDPおよびASを集計部２０に出力する。
【０１０９】
次に、集計部２０は、区間検索部１０からIDPおよびASを受け取り、IDPに含まれる区間Iv=[s,e]と次元fとのペアについて、ループを開始する（ステップＡ５）。すなわち、IDPに含まれる全てのペアについて、ステップＡ６及びＡ７を実行する。
【０１１０】
次に、集計部２０は、次元fに関する座標列集計部３０−ｆに区間Ivを出力する。次元fに関する座標列集計部３０−ｆは、区間Ivを入力として受け付け、記憶部４３に問い合わせを行なって、次元fの座標列Pfに対応する座標列集計用データ構造４２、すなわちウェーブレット木wfを取得する。そして、次元fに関する座標列集計部３０−ｆは、ウェーブレット木wfのルートノードを変数vに代入する（ステップＡ６）。
【０１１１】
次元fに関する座標列集計部３０−ｆは、関数aggregate_interval(v, s, e, lqf, uqf)を呼び出し、この関数が返す統計量（出力結果）をASに加える（ステップＡ７）。この関数aggregate_interval(v, s, e, lqf, uqf)は、ウェーブレット木wfを参照することで実行される。また、関数aggregate_interval(v, s, e, lqf, uqf)は、座標列Pfに関してPf[s, e]に含まれる座標のうち、lqf≦Pf[i]≦uqf が成り立つ全ての座標Pf[i]の集合について、その集合に含まれる座標が属する全ての点の集合を特定し、その点の集合に関する統計量を返す関数である。これらの点はクエリに含まれる点の一部であり、この統計量は部分的な統計量である。
【０１１２】
統計量としては、条件を満たす点の数であるカウント(COUNT)、及び条件を満たす点の重みの合計であるサム(SUM)などを用いることができる。
【０１１３】
集計部２０は、IDPに含まれる全てのペアについてステップＡ７が実行されたのち、ループを終了する（ステップＡ８）。
【０１１４】
集計部２０は、ASに含まれる部分的な統計量を用いて、クエリ領域に含まれる全ての点の集合についての全体的な統計量を計算する（ステップＡ９）。たとえば、統計量としてカウントを用いる場合は、ASに含まれる各カウントを合計することにより、クエリ領域に含まれるすべての点の集合のカウントが得られる。
【０１１５】
最後に、出力部６０は、集計部２０から受け取った、クエリ領域に含まれる全ての点の集合についての全体的な統計量を外部に出力する（ステップＡ１０）。ステップＡ１〜ステップＡ１０の実行により、クエリ領域Qについての探索処理は終了する。また、ステップＡ１〜ステップＡ１０は、クエリ領域Qが入力される度に実行される。
【０１１６】
［ステップＡ４］
続いて、図６に示したステップＡ４について、図７を用いて更に具体的に説明する。図７は、再帰的に区間を検索する関数find_intervals(v,Q)の動作を示すフロー図である。この関数は区間検索部１０が、記憶部４３に問い合わせを行なうことで実現される。
【０１１７】
図７に示すように、まず、区間検索部１０は、kd木のノードvが葉ノードであるか判定する（ステップＢ１）。そして、区間検索部１０は、ステップＢ１の判定の結果、答えがYesであれば、葉ノードに保持されている全ての点についてクエリ領域に含まれるか調べ、葉ノードに保持されており、かつクエリ領域に含まれる点について統計量を計算し、ASに加える（ステップＢ６）。また、ステップＢ６では、必要であれば、葉ノードに保持されている重みを参照して計算する（ステップＢ６）。
【０１１８】
また、図７においては、ステップＢ６で行なわれる操作は、AS=AS∪aggregate_leaf(v)という式で表現されている。aggregate_leaf(v)は、葉ノードに保持されている全ての点にがクエリ領域に含まれているかどうかを調べ、クエリ領域に含まれる点について統計量を計算して返す関数である。たとえば、カウント・クエリを実現する場合、関数aggregate_leaf(v)は、葉ノードvに保持されている全ての点のうち、クエリ領域に含まれる点の数を数えて返す。以上の葉ノードに関する処理を行った場合、区間検索部１０は空集合を返す。
【０１１９】
一方、ステップＢ１の判定の結果、答えがNoであれば、区間検索部１０は、kd木のノードvのカバー領域がクエリ領域と重なるかどうかを判定する（ステップＢ２）。そして、区間検索部１０は、ステップＢ２の判定の結果、答えがYesであればステップＢ３に進み、答えがNoであれば空集合を返す。
【０１２０】
具体的には、ステップＢ２では、区間検索部１０は、kd木のノードvのカバー領域R(v) = [lv1,uv1] × [lv2,uv2] × … × [lvd,uvd]を取得する。その上で、区間検索部１０は、1≦k≦dとなるkのうち、少なくともひとつの次元kにおいて、（uvk<lqkまたは uqk < lvk）が成り立つかどうかを判定する。判定の結果、上記関係が成り立つ場合は、空間上の重なりがないため、区間検索部１０は、Noと判定する。上記の関係が成り立たない場合は、空間上での重なりがあるため、区間検索部１０は、Yesと判定する。ステップＢ２の判定は、クエリ領域と重なりがないカバー領域をこれ以上探索しないように枝刈りすることが目的である。
【０１２１】
次に、区間検索部１０は、ノードvのカバー領域とクエリ領域とを比較して、包含次元数hを計算する（ステップＢ３）。具体的には、区間検索部１０は、たとえば、定義により、lqk≦ lvk 、且つ uvk ≦ uqkを満たす次元kがいくつ存在しているかを数えることによって、包含次元数hを計算できる。
【０１２２】
次に、区間検索部１０は、包含次元数hがd-1よりも小さいかどうかを判定する（ステップＢ４）。区間検索部１０は、ステップＢ４の判定の結果、答えがYesである場合は、区間検索部１０は、変数vleftにノードvの左の子ノードを代入し、変数vrightにノードvの右の子ノードを代入する（ステップＢ５）。
【０１２３】
そして、ステップＢ５の後、区間検索部１０は、同じ関数を以下のように再帰的に呼び出す。
return find_intervals(vleft, Q) ∪ find_intervals(vright, Q)
【０１２４】
一方、ステップＢ４の判定の結果、答えがNoである場合は、区間検索部１０は、ノードvのカバー領域とクエリ領域とを比較して、lqf ≦ lvf 、且つuvf ≦ uqf という範囲条件が満たされていない次元fを求める（ステップＢ７）。そして、区間検索部１０は、ノードvが保持する添字の区間Ivと次元fとのペアである(Iv,f)を返す。
【０１２５】
以上により、図７に示すアルゴリズムの動作の説明を終える。この図７に示すアルゴリズムは、従来のkd木の探索アルゴリズムとほぼ等しいが、d個の範囲条件全てを満たすノードを見つけるまで探索するのではなく、(d-1)個の範囲条件を満たすノードを見つけるまで探索する点で異なっている。
【０１２６】
［ステップＡ７］
次いで、図６に示すアルゴリズムにおけるステップＡ７の動作について、図８を用いて詳しく説明する。すなわち、図６中の関数aggregate_interval(v, s, e, lqf, uqf)の動作について、図８を用いて説明する。図８は、図６のステップＡ７に示された関数aggregate_interval(v, s, e, lqf, uqf)の動作を示す図である。
【０１２７】
関数aggregate_interval(v, s, e, lqf, uqf)は、次元fに関する座標列集計部３０−ｆによって実行される関数である。この関数は、ウェーブレット木wfのノードvと、添字の区間[s, e]、および、座標の値の範囲[lqf, uqf]を入力として受け付け、vに対応する座標部分列Pf(π)上で該区間に含まれる座標のうち、座標の値が該範囲に含まれる全ての座標について、それらの座標が属する点に関する統計量を返す関数である。
【０１２８】
図８に示すように、次元fに関する座標列集計部３０−ｆは、関数aggregate_interval(v, s, e, lqf, uqf)を実行して、s > e または ([lπ, uπ] ∩ [lqf, uqf]) = φ が成り立つかどうかを判定する（ステップＣ１）。そして、座標列集計部３０−ｆは、ステップＣ１の判定の結果、答えがYesであれば、空集合を返す。なお、[lπ, uπ]は、接頭辞πで始まる整数の範囲を表している。
【０１２９】
一方、ステップＣ１の判定の結果、答えがNoであれば、座標列集計部は、 [lπ, uπ] ⊆ [lqf, uqf] が成り立つかどうかを判定する（ステップＣ２）。なお、[lπ, uπ]は、接頭辞πで始まる整数の範囲を表している。
【０１３０】
そして、ステップＣ２の判定の結果、答えがYesであれば、つまり、[lπ, uπ] ⊆ [lqf, uqf] が成り立つときは、座標の値の範囲がクエリの範囲に包含される。よって、Pf(π) [s, e]に含まれる座標は、必ずクエリに包含される点に属する。従って、座標列集計部３０−ｆは、関数aggregate_node(v , s , e)を実行して、その出力結果を返り値とする。関数aggregate_node(v , s , e)は、v に対応する座標列Pf(π)に関して、Pf(π) [s, e]に含まれる座標が属する点の集合の統計量を返す関数である。
【０１３１】
一方、ステップＣ２の判定の結果、答えがNoであれば、座標列集計部３０−ｆは、ノードvに保持されているビット列をBvとおいて、図８中に示す４つのrankの式を用いて、左の子ノードにおける添字の区間[sleft, eleft]と、右の子ノードにおける添字の区間[sright, eright]とを計算する（ステップＣ３）。
【０１３２】
これらの式を用いて計算すると、ウェーブレット木の特性により、ノードvに対応する座標部分列Pf(π)上の区間[s, e]から抽出された座標を含む、左の子ノードに対応する座標部分列Pf(πleft)上の区間[sleft, eleft]、および、右の子ノードに対応する座標部分列Pf(πright)上の区間[sright, eright]を計算できる。なお、πleft、πrightは接頭辞πを一つ延長したものであり、πleftはπ+”0”に対応し、πrightはπ+”1”に対応している。
【０１３３】
その後、座標列集計部３０−ｆは、右の子ノード、および左の子ノードについて、同様の処理を行うため、再帰的に以下の関数を呼び出す。
return aggregate_interval (vleft, sleft, eleft, lqf, uqf) ∪aggregate_interval (vright, sright, eright, lqf, uqf)
【０１３４】
［ステップＣ２］
続いて、図８に示したステップＣ２で呼び出される関数aggregate_node(v , s , e) について説明する。この関数は座標列集計部３０によって実行される。
【０１３５】
関数aggregate_node(v, s , e)は、ノードv に対応する座標列Pf(π)に関して、Pf(π) [s, e]に含まれる座標が属する点の集合の統計量を返す関数である。
【０１３６】
関数aggregate_node(v, s , e)は、様々な集計関数を抽象化したものであり、この関数を、具体的な集計関数に置き換えることで、情報処理装置１００を様々な種類の矩形範囲検索に利用できる。
【０１３７】
たとえば、情報処理装置１００は、クエリ領域Qに含まれる点の数をカウントして出力することができる。この動作は、関数aggregate_node(v , s , e)が、返り値として(e - s +1)を返すことによって実現される。何故なら、Pf (π)[s ,e ]に含まれる全ての座標が、それぞれクエリ領域Qに含まれる点に対応しており、 (e - s +1)個の点がクエリ領域Qに含まれていることを表しているからである。
【０１３８】
また、このとき、関数aggregate_interval(v , s , e , lqf , uqf)は、Pf[s, e]に座標が含まれる点のうち、さらにクエリ領域Qに含まれる数をカウントして返す関数として動作する。この場合、集計部２０は、点の列Pに含まれる点のうち、クエリ領域Qに含まれる数をカウントして出力する。
【０１３９】
また、たとえば、全ての点pに重みw(p)が付与されているとき、情報処理装置１００は、クエリ領域に含まれる点の重みの合計を計算することができる。これは、あらかじめ、全ての座標部分列Pf (π)に含まれる各座標について、対応する点pの重みw(p)を同じ順番で並べた列Wf(π)が設定されている場合に、この列上での区間合計を計算できるようなデータ構造が用意されていれば可能となる。
【０１４０】
このようなデータ構造としては、既存のPartial Sumを扱うデータ構造が挙げられる。また、このようなデータ構造であれば、Pf (π)[s ,e]がクエリ領域に含まれる点に対応していることが分かっているとき、この区間[s,e]に対応する重みの列上の区間Wf(π) [s,e]に含まれる重みの区間合計を計算し、最後に足し合わせることで、クエリ領域Qに含まれる全ての点の重みの合計が計算できる。この場合、集計部２０は、クエリ領域Qに含まれる全ての点の重みの合計を統計量として出力する。
【０１４１】
同様に、情報処理装置１００は、クエリ領域Qに含まれる全ての点のリストを返すレポート・クエリとしても用いることができる。つまり、Pf (π)[s ,e]に含まれる各要素Pf(π)[j]について、元の整数列Pf上での位置iを、ウェーブレット木をさかのぼることによって特定できる。このとき、点P[i]がクエリ領域に含まれる。この場合、集計部２０は、クエリ領域Qに含まれる全ての点のリストを統計量として出力する。
【０１４２】
以上で、関数aggregate_interval(v , s , e , lqf , uqf)及び関数aggregate_node(v, s , e)についての説明を終える。この２つの関数の動作は、非特許文献２に示されている、ウェーブレット木を用いた２次元上の統計量の計算と同等であることに注意する。すなわち、この２つの関数の動作は、添字の区間[s , e]と値の範囲[lqf , uqf]を指定した２次元空間上での検索と見なすことができる。この計算によって求まる区間の数はO(log n)であることが知られている。
【０１４３】
また、以上のように、本実施の形態によれば、様々な種類の矩形範囲検索を実現することができる。本実施の形態は、図６〜図８に示したアルゴリズムが単独で用いられる態様に限定されず、図６〜図８に示したアルゴリズムに、適宜他の探索アルゴリズムが組み合わされた態様であってもよい。
【０１４４】
［実施の形態による効果］
本実施の形態は、kd木を単独で用いる従来手法よりも、計算量が少なくなる効果がある。このことを明らかにするため、最悪計算量について解析する。kd木を用いる従来手法は、包含次元数がdになるまで分割するのに対して、本実施の形態における手法は、d-1になるまでしか分割しない。このことが最悪計算量におよぼす影響を以下に述べる。
【０１４５】
まず、計算量が最悪になる場合のkd木のノードの分割数を見積もる。計算量が最悪になるのは、空間分割数が最大になるときである。つまり、１回の分割で生じた２つのカバー領域が、常にクエリ領域と重なってしまう場合である。
【０１４６】
図９に、最悪な場合の探索ノード数と包含次元数との関係を示す。図９は、２次元の場合の探索ノード数と包含次元数との変化を示す図である。図９に示すように、木構造上のひとつのノードは、ひとつの探索ノードに対応している。木構造の深さが１つ下がることは、ノードが１回分割されて２つの探索ノードに分割されることを表している。ノード上の数字は、包含次元数を表している。分割されるほど、包含次元数が高いノードが増えていくことが分かる。
【０１４７】
ここで、d回の分割をまとめて考える。深さm * dにおいて包含次元数hになるノードの数をTh(m)とおいて、Th(m)とTh(m-1)のあいだに成り立つ漸化式を考える。d回の分割により、1つのカバー領域が2d個のカバー領域に分割される。このとき、必ず各次元で１回の分割が生じる。すでに包含されている次元について分割されても包含次元数は上がらないことを考えると、深さm * dにおいて、包含次元数がhになるノードの数を求めるには、深さ(m-1) * dにおいて包含次元数がi(≦ h)だったノードから、h-i個の次元が新たに包含される数を考えればよい。
【０１４８】
この漸化式は、以下の数１に示す通りとなる。ただし、以下の数１において、C(x,y)は組み合わせの数を表すものとする。
【０１４９】
【数１】
2016072249.tif 000003
【０１５０】
上記の数１から、d回の分割により、全体のノード数は2d倍に増加するが、そのうち包含次元数hのノードは2h倍に増加することが分かる。
【０１５１】
また、この分割をlog(n)/d回繰り返すと、探索木全体は深さlog nの二分木になり、全体のノード数はO(n)に達して分割が終了する。そのうち包含次元数hのノードは、O(n(h/d))となる。ただし包含次元数0のノードはO(log n)である。
【０１５２】
よって、以下のように説明することができる。まず、探索の打ち切りを全く行なわなければ、分割数は最大でO(n)になる。また、包含次元数がdに達した時点で分割を打ち切れば、分割数はO(n(d-1)/d)となる。一方、包含次元数がd-1に達した時点で分割を打ち切れば、分割数はO(n(d-2)/d)となる。そして、kd木では、包含次元数がdに達した時点で分割が打ち切られるため、計算量はO(n(d-1)/d)となる。これは従来から知られているオーダと一致する。
【０１５３】
このkd木での解析が、本実施の形態に適用される。本実施の形態では、包含次元数がd-1に達した時点で分割が打ち切られるので、分割数、すなわちkd木によって計算される区間の数は最大でO(n(d-2)/d)となる。
【０１５４】
また、区間毎に、関数aggregate_interval(v , s , e , lqf , uqf)が実行される。この関数では、関数aggregate_node(v , s , e)がO(log n)回実行される。ここで関数aggregate_node(v , s , e)がO(1)で実行できる関数だとする。たとえば、カウント・クエリを実現するには、(e - s+1)を計算するだけでよいため、O(1)で計算できる。これにより、本実施の形態における手法は、O(n(d-2)/d)個の区間について、それぞれO(log n)回、O(1)の計算を実行することになるため、合計の計算量はO(n(d-2)/d log n)となる。
【０１５５】
ただし、d=2の場合は特殊である。d-1=1次元が包含された時点で探索ループを抜けるので、分割されたノードの数は、包括次元数が0となるノードの数O(log n)に比例する。各ノードについてO(log n)の計算が必要になるので、d=2の場合の計算量はO(log2 n)となる。
【０１５６】
以上はクエリ領域に包含される点を数えるカウント・クエリの場合であるが、包含される点全てについてリストを出力するレポート・クエリには、出力される点の数をFとして、それぞれについてO(log n)の計算時間がかかる。まとめると、図１０に示す通りとなる。図１０に示すように、本発明によれば、kd木を用いて探索処理を行なう場合よりも計算量のオーダが改善されており、しかも従来のウェーブレット木と異なり、３次元以上にも適用できる。図１０は、本発明と従来手法との計算量の比較を示す図である。
【０１５７】
［プログラム］
本発明の実施の形態におけるプログラムは、コンピュータに、図６に示すステップＡ１〜Ａ１０を実行させるプログラムであれば良い。このプログラムをコンピュータにインストールし、実行することによって、本実施の形態における情報処理装置１００と情報処理方法とを実現することができる。この場合、コンピュータのＣＰＵ（Central Processing Unit）は、区間検索部１０、集計部２０、座標列集計部３０、入力受付部５０、及び出力部６０として機能し、処理を行なう。また、本実施の形態では、記憶部４３は、コンピュータに備えられたハードディスク等の記憶装置に、これらを構成するデータファイルを格納することによって実現される。
【０１５８】
なお、本実施の形態におけるプログラムは、複数のコンピュータによって構築されたコンピュータシステムによって実行されても良い。この場合は、例えば、各コンピュータが、それぞれ、検索部１０、集計部２０、座標列集計部３０、入力受付部５０、及び出力部６０として機能しても良い。また、記憶部４３は、本実施の形態におけるプログラムを実行するコンピュータとは別のコンピュータ上に構築されていても良い。
【０１５９】
ここで、本実施の形態におけるプログラムを実行することによって、情報処理装置１００を実現するコンピュータについて図１１を用いて説明する。図１１は、本発明の実施の形態における情報処理装置を実現するコンピュータの一例を示すブロック図である。
【０１６０】
図１１に示すように、コンピュータ１１０は、ＣＰＵ１１１と、メインメモリ１１２と、記憶装置１１３と、入力インターフェイス１１４と、表示コントローラ１１５と、データリーダ／ライタ１１６と、通信インターフェイス１１７とを備える。これらの各部は、バス１２１を介して、互いにデータ通信可能に接続される。
【０１６１】
ＣＰＵ１１１は、記憶装置１１３に格納された、本実施の形態におけるプログラム（コード）をメインメモリ１１２に展開し、これらを所定順序で実行することにより、各種の演算を実施する。メインメモリ１１２は、典型的には、ＤＲＡＭ（Dynamic Random Access Memory）等の揮発性の記憶装置である。また、本実施の形態におけるプログラムは、コンピュータ読み取り可能な記録媒体１２０に格納された状態で提供される。なお、本実施の形態におけるプログラムは、通信インターフェイス１１７を介して接続されたインターネット上で流通するものであっても良い。
【０１６２】
また、記憶装置１１３の具体例としては、ハードディスクドライブの他、フラッシュメモリ等の半導体記憶装置が挙げられる。入力インターフェイス１１４は、ＣＰＵ１１１と、キーボード及びマウスといった入力機器１１８との間のデータ伝送を仲介する。表示コントローラ１１５は、ディスプレイ装置１１９と接続され、ディスプレイ装置１１９での表示を制御する。
【０１６３】
データリーダ／ライタ１１６は、ＣＰＵ１１１と記録媒体１２０との間のデータ伝送を仲介し、記録媒体１２０からのプログラムの読み出し、及びコンピュータ１１０における処理結果の記録媒体１２０への書き込みを実行する。通信インターフェイス１１７は、ＣＰＵ１１１と、他のコンピュータとの間のデータ伝送を仲介する。
【０１６４】
また、記録媒体１２０の具体例としては、ＣＦ（Compact Flash（登録商標））及びＳＤ（Secure Digital）等の汎用的な半導体記憶デバイス、フレキシブルディスク（Flexible Disk）等の磁気記憶媒体、又はＣＤ−ＲＯＭ（Compact Disk Read Only Memory）などの光学記憶媒体が挙げられる。
【０１６５】
また、上述した実施の形態の一部又は全部は、以下に記載する（付記１）〜（付記２８）によって表現することができるが、以下の記載に限定されるものではない。
【０１６６】
（付記１）  多次元空間上の点の集合を表現するデータ構造を処理対象とする情報処理装置であって、
クエリ領域として、特定の多次元の領域が指定された場合に、
前記点の集合を一列に並べて得られた点の列上にあり、且つ、前記多次元空間を構成する全次元のうち１つの次元を除いた残りの各次元の座標がクエリ領域に含まれている点のみによって構成されている、区間を特定する、区間検索部と、
前記区間検索部で特定された区間について、当該区間に出現する点が前記クエリ領域に含まれるための条件として、除かれた前記１つの次元における座標の値の範囲を特定する、集計部と、
前記区間検索部で特定された区間、及び前記集計部で特定された前記座標の値の範囲を入力として、
前記点の列の並び順と同じ順序で、前記点の集合の各点における、除かれた前記１つの次元での座標を取り出すことで得られる、座標列に関して、当該座標列において入力された前記区間に出現し、且つ、値が入力された前記範囲に含まれる、全ての座標について、
前記全ての座標が対応する点の集合に関する統計量を計算する、座標列集計部と、
を備えている、ことを特徴とする情報処理装置。
【０１６７】
（付記２）  前記座標列集計部が、前記多次元空間を構成する全次元それぞれ毎に備えられており、それぞれ、対応する次元と前記集計部が座標の値の範囲を特定した次元とが一致する場合に、前記点の集合に関する統計量を計算する、
付記１に記載の情報処理装置。
【０１６８】
（付記３）  前記集計部が、前記区間検索部によって特定された区間が複数である場合に、前記座標列集計部によって計算された区間毎の前記点の集合に関する統計量を、更に集計し、集計によって得られた統計量を、前記クエリ領域に含まれる点の集合に関する全体的な統計量として、出力する、
付記１に記載の情報処理装置。
【０１６９】
（付記４）  前記データ構造が、前記区間検索部による前記区間の特定に用いられる第１のデータ構造と、前記座標列集計部による前記統計量の計算に用いられる第２のデータ構造とを有している、
付記１に記載の情報処理装置。
【０１７０】
（付記５）  前記第１のデータ構造が、
前記多次元空間に設定された複数のカバー領域のいずれかと、前記点の列上において当該カバー領域に含まれる点が出現する区間とに関連付けられている、ノードを有する木構造によって表現されており、
前記区間検索部が、
前記ノードのうち、
関連付けられた前記カバー領域に含まれる点における、前記１つの次元を除いた残りの各次元の座標がクエリ領域に含まれている、ノードを特定し、
特定した１又は２以上のノードが関連付けられている区間を前記区間として特定する、
付記４に記載の情報処理装置。
【０１７１】
（付記６）  前記点の列は、
前記ノードに関連付けられたカバー領域それぞれに含まれる点が、ひとつながりで連続して出現するように、前記点の集合に含まれる点を一列に並べて得られている、
付記５に記載の情報処理装置。
【０１７２】
（付記７）  前記座標列集計部は、前記第２のデータ構造を用いて、
前記座標列から得られる複数の部分列のうち、入力された前記範囲に含まれる座標のみが出現する部分列を特定し、そして、特定した部分列上の区間であって、前記座標列において入力された前記区間に出現する座標が出現している、第二の区間を特定し、
更に、特定した前記第二の区間に出現する座標が対応する点の集合に関する統計量を計算する、
付記４に記載の情報処理装置。
【０１７３】
（付記８）  前記部分列が、座標のビット表現が同じ接頭辞で始まる座標を、座標同士の位置関係を保ったまま抽出することで得られるものであり、
前記第２のデータ構造が、
前記部分列に関連付けられた複数のノードを有し、
前記複数のノードそれぞれは、前記部分列において出現する各座標のビット表現における、一つ以上の特定の桁のビットを取り出し、取り出した前記ビットを前記部分列と同じ順序で並べることによって得られる、ビットの列を用いて表現され、
前記座標列集計部は、前記複数ノードそれぞれを表現するビットの列を用いて、前記第二の区間を特定する、
付記７に記載の情報処理装置。
【０１７４】
（付記９）  前記座標列集計部が、前記全ての座標が対応する点の集合に関する統計量として、前記全ての座標が対応する点の個数を計算する、
付記１に記載の情報処理装置。
【０１７５】
（付記１０）  前記座標列集計部が、前記全ての座標が対応する点の集合に関する統計量として、前記全ての座標が対応する点それぞれの各次元の座標を計算する、
付記１に記載の情報処理装置。
【０１７６】
（付記１１）  多次元空間上の点の集合を表現するデータ構造を処理対象とする情報処理方法であって、
（ａ）クエリ領域として、特定の多次元の領域が指定された場合に、
前記点の集合を一列に並べて得られた点の列上にあり、且つ、前記多次元空間を構成する全次元のうち１つの次元を除いた残りの各次元の座標がクエリ領域に含まれている点のみによって構成されている、区間を特定する、ステップと、
（ｂ）前記（ａ）のステップで特定された区間について、当該区間に出現する点が前記クエリ領域に含まれるための条件として、除かれた前記１つの次元における座標の値の範囲を特定する、ステップと、
（ｃ）前記（ａ）のステップで特定された区間、及び前記（ｂ）のステップで特定された前記座標の値の範囲を入力として、
前記点の列の並び順と同じ順序で、前記点の集合の各点における、除かれた前記１つの次元での座標を取り出すことで得られる、座標列に関して、当該座標列において入力された前記区間に出現し、且つ、値が入力された前記範囲に含まれる、全ての座標について、
前記全ての座標が対応する点の集合に関する統計量を計算する、ステップと、
を有する、ことを特徴とする情報処理方法。
【０１７７】
（付記１２）（ｄ）前記（ａ）のステップによって特定された区間が複数である場合に、前記（ｂ）のステップによって計算された区間毎の前記点の集合に関する統計量を、更に集計し、集計によって得られた統計量を、前記クエリ領域に含まれる点の集合に関する全体的な統計量として、出力する、ステップを更に有する、
付記１１に記載の情報処理方法。
【０１７８】
（付記１３）  前記データ構造が、前記（ａ）のステップによる前記区間の特定に用いられる第１のデータ構造と、前記（ｃ）のステップによる前記統計量の計算に用いられる第２のデータ構造とを有している、
付記１１に記載の情報処理方法。
【０１７９】
（付記１４）  前記第１のデータ構造が、
前記多次元空間に設定された複数のカバー領域のいずれかと、前記点の列上において当該カバー領域に含まれる点が出現する区間とに関連付けられている、ノードを有する木構造によって表現されており、
前記（ａ）のステップにおいて、
前記ノードのうち、
関連付けられた前記カバー領域に存在する点における、前記１つの次元を除いた残りの各次元の座標がクエリ領域に含まれている、ノードを特定し、
特定した１又は２以上のノードが関連付けられている区間を前記区間として特定する、
付記１３に記載の情報処理方法。
【０１８０】
（付記１５）  前記点の列は、
前記ノードに関連付けられたカバー領域それぞれに存在する点が、ひとつながりで連続して出現するように、前記点の集合に含まれる点を一列に並べて得られている、
付記１４に記載の情報処理方法。
【０１８１】
（付記１６）  前記（ｃ）のステップにおいて、前記第２のデータ構造を用いて、
前記座標列から得られる複数の部分列のうち、入力された前記範囲に含まれる座標のみが出現する部分列を特定し、そして、特定した部分列上の区間であって、前記座標列において入力された前記区間に出現する座標が出現している、第二の区間を特定し、
更に、特定した前記第二の区間に出現する座標が対応する点の集合に関する統計量を計算する、
付記１３に記載の情報処理方法。
【０１８２】
（付記１７）  前記部分列が、座標のビット表現が同じ接頭辞で始まる座標を、座標同士の位置関係を保ったまま抽出することで得られるものであり、
前記第２のデータ構造が、
前記部分列に関連付けられた複数のノードを有し、
前記複数のノードそれぞれは、前記部分列において出現する各座標のビット表現における、一つ以上の特定の桁のビットを取り出し、取り出した前記ビットを前記部分列と同じ順序で並べることによって得られる、ビットの列を用いて表現され、
前記（ｃ）のステップにおいて、前記複数ノードそれぞれを表現するビットの列を用いて、前記第二の区間を特定する、
付記１６に記載の情報処理方法。
【０１８３】
（付記１８）  前記（ｃ）のステップにおいて、前記全ての座標が対応する点の集合に関する統計量として、前記全ての座標が対応する点の個数を計算する、
付記１１に記載の情報処理方法。
【０１８４】
（付記１９）  前記（ｃ）のステップにおいて、前記全ての座標が対応する点の集合に関する統計量として、前記全ての座標が対応する点それぞれの各次元の座標を計算する、
付記１１に記載の情報処理方法。
【０１８５】
（付記２０）  多次元空間上の点の集合を表現するデータ構造を処理対象とする情報処理をコンピュータによって行なうためのプログラムを記録したコンピュータ読み取り可能な記録媒体であって、
前記コンピュータに、
（ａ）クエリ領域として、特定の多次元の領域が指定された場合に、
前記点の集合を一列に並べて得られた点の列上にあり、且つ、前記多次元空間を構成する全次元のうち１つの次元を除いた残りの各次元の座標がクエリ領域に含まれている点のみによって構成されている、区間を特定する、ステップと、
（ｂ）前記（ａ）のステップで特定された区間について、当該区間に出現する点が前記クエリ領域に含まれるための条件として、除かれた前記１つの次元における座標の値の範囲を特定する、ステップと、
（ｃ）前記（ａ）のステップで特定された区間、及び前記（ｂ）のステップで特定された前記座標の値の範囲を入力として、
前記点の列の並び順と同じ順序で、前記点の集合の各点における、除かれた前記１つの次元での座標を取り出すことで得られる、座標列に関して、当該座標列において入力された前記区間に出現し、且つ、値が入力された前記範囲に含まれる、全ての座標について、
前記全ての座標が対応する点の集合に関する統計量を計算する、ステップと、
を実行させる命令を含む、プログラムを記録しているコンピュータ読み取り可能な記録媒体。
【０１８６】
（付記２１）前記プログラムが、前記コンピュータに、
（ｄ）前記（ａ）のステップによって特定された区間が複数である場合に、前記（ｂ）のステップによって計算された区間毎の前記点の集合に関する統計量を、更に集計し、集計によって得られた統計量を、前記クエリ領域に含まれる点の集合に関する全体的な統計量として、出力する、ステップを実行させる命令を更に含む、
付記２０に記載のコンピュータ読み取り可能な記録媒体。
【０１８７】
（付記２２）  前記データ構造が、前記（ａ）のステップによる前記区間の特定に用いられる第１のデータ構造と、前記（ｃ）のステップによる前記統計量の計算に用いられる第２のデータ構造とを有している、
付記２０に記載のコンピュータ読み取り可能な記録媒体。
【０１８８】
（付記２３）  前記第１のデータ構造が、
前記多次元空間に設定された複数のカバー領域のいずれかと、前記点の列上において当該カバー領域に含まれる点が出現する区間とに関連付けられている、ノードを有する木構造によって表現されており、
前記（ａ）のステップにおいて、
前記ノードのうち、
関連付けられた前記カバー領域に存在する点における、前記１つの次元を除いた残りの各次元の座標がクエリ領域に含まれている、ノードを特定し、
特定した１又は２以上のノードが関連付けられている区間を前記区間として特定する、
付記２２に記載のコンピュータ読み取り可能な記録媒体。
【０１８９】
（付記２４）  前記点の列は、
前記ノードに関連付けられたカバー領域それぞれに存在する点が、ひとつながりで連続して出現するように、前記点の集合に含まれる点を一列に並べて得られている、
付記２３に記載のコンピュータ読み取り可能な記録媒体。
【０１９０】
（付記２５）  前記（ｃ）のステップにおいて、前記第２のデータ構造を用いて、
前記座標列から得られる複数の部分列のうち、入力された前記範囲に含まれる座標のみが出現する部分列を特定し、そして、特定した部分列上の区間であって、前記座標列において入力された前記区間に出現する座標が出現している、第二の区間を特定し、
更に、特定した前記第二の区間に出現する座標が対応する点の集合に関する統計量を計算する、
付記２２に記載のコンピュータ読み取り可能な記録媒体。
【０１９１】
（付記２６）  前記部分列が、座標のビット表現が同じ接頭辞で始まる座標を、座標同士の位置関係を保ったまま抽出することで得られるものであり、
前記第２のデータ構造が、
前記部分列に関連付けられた複数のノードを有し、
前記複数のノードそれぞれは、前記部分列において出現する各座標のビット表現における、一つ以上の特定の桁のビットを取り出し、取り出した前記ビットを前記部分列と同じ順序で並べることによって得られる、ビットの列を用いて表現され、
前記（ｃ）のステップにおいて、前記複数ノードそれぞれを表現するビットの列を用いて、前記第二の区間を特定する、
付記２５に記載のコンピュータ読み取り可能な記録媒体。
【０１９２】
（付記２７）  前記（ｃ）のステップにおいて、前記全ての座標が対応する点の集合に関する統計量として、前記全ての座標が対応する点の個数を計算する、
付記２０に記載のコンピュータ読み取り可能な記録媒体。
【０１９３】
（付記２８）  前記（ｃ）のステップにおいて、前記全ての座標が対応する点の集合に関する統計量として、前記全ての座標が対応する点それぞれの各次元の座標を計算する、
付記２０に記載のコンピュータ読み取り可能な記録媒体。
【０１９４】
以上、実施の形態を参照して本願発明を説明したが、本願発明は上記実施の形態に限定されるものではない。本願発明の構成や詳細には、本願発明のスコープ内で当業者が理解し得る様々な変更をすることができる。
【０１９５】
この出願は、２０１４年１１月７日に出願された日本出願特願２０１４−２２７０４１を基礎とする優先権を主張し、その開示の全てをここに取り込む。
【産業上の利用可能性】
【０１９６】
以上のように、本発明によれば、任意の次元dについて、線形サイズで、kd木よりも高速な矩形範囲検索を実現することができる。本発明は、大量のデータ群から必要なデータを探索する必要がある種々の分野において有用である。
【符号の説明】
【０１９７】
１０  区間検索部
２０  集計部
３０、３０−１〜３０−ｄ  座標列集計部
４０  データ構造
４１  区間検索用データ構造
４２  座標列集計用データ構造
４３  記憶部
５０  入力受付部
６０  出力部
１００  情報処理装置
１１０  コンピュータ
１１１  ＣＰＵ
１１２  メインメモリ
１１３  記憶装置
１１４  入力インターフェイス
１１５  表示コントローラ
１１６  データリーダ／ライタ
１１７  通信インターフェイス
１１８  入力機器
１１９  ディスプレイ装置
１２０  記録媒体
１２１  バス
【図１】
2016072249.tif 000004
【図２】
2016072249.tif 000005
【図３】
2016072249.tif 000006
【図４】
2016072249.tif 000007
【図５】
2016072249.tif 000008
【図６】
2016072249.tif 000009
【図７】
2016072249.tif 000010
【図８】
2016072249.tif 000011
【図９】
2016072249.tif 000012
【図１０】
2016072249.tif 000013
【図１１】
2016072249.tif 000014
【国際調査報告】
2016072249.tif 000015
2016072249.tif 000016
2016072249.tif 000017
2016072249.tif 000018