コンピュータサイエンスにおいて、範囲クエリ問題とは、配列内の特定の要素区間に関する複数のクエリに効率的に応答する問題です。例えば、範囲最小値クエリと呼ばれる一般的なタスクは、数値リスト内の特定の範囲内の最小値を見つけることです。
関数が与えられた場合配列、範囲クエリを受け入れる配列上で2つのインデックスを取るそしてそして、サブアレイに適用した場合例えば、関数の場合配列内のすべての値の合計を返す範囲クエリ範囲内のすべての値の合計を返します。
範囲合計クエリは、入力と同じ長さの配列pを事前に計算し、すべてのインデックスiに対して、要素p iがaの最初のi個の要素の合計となるようにすることで、定数時間と線形空間で回答できます。その後、任意のクエリは次のように計算できます。
この戦略は、他のあらゆる二項演算にも拡張できる。その逆関数は明確に定義され、容易に計算できます。[ 1 ]同様の前処理で高次元にも拡張できます。[ 2 ] 例えば、p i,jがaの最初のi × j要素の合計を含む場合、
この問題のより難しい部分集合は、動的データ、つまりクエリごとに変化する可能性のあるデータに対して範囲クエリを実行することです。配列の値を効率的に更新するには、セグメントツリーやフェンウィックツリーのような、より高度なデータ構造が必要です。

範囲クエリで関心のある関数が半群演算子である場合、は必ずしも定義されないため、前のセクションの戦略は機能しません。Andrew Yaoは[ 3 ]で、半群演算子を含む範囲クエリに対して効率的な解が存在することを示しました。彼は、任意の定数cに対して、時間と空間の事前処理で、fが半群演算子であるリストに対する範囲クエリに答えることを可能にする時間、は、アッカーマン関数の特定の関数逆関数です。
わずかに優れた解を許容する半群演算子もいくつかあります。たとえば、。 仮定するそれから最小要素のインデックスを返します。 それからは対応する最小範囲クエリを表します。範囲最小クエリに答えることができるデータ構造はいくつかあります。時間と空間の前処理を用いた時間そのような解決策の一つは、この問題と最小共通祖先問題との等価性に基づいている。
デカルトツリー配列のルートとしてそして、左サブツリーと右サブツリーとして、デカルトツリーはそしてデカルトツリーそれぞれ。範囲最小クエリは、のそして最小共通祖先は時間と空間の事前処理によって定数時間で解くことができるため範囲最小クエリも同様です。同様である。デカルト木は線形時間で構築できる。
配列の最頻値は、配列内で最も多く出現する要素です。たとえば、の最頻値はは4.同数の場合は、最も頻繁に出現する要素のいずれかが最頻値として選択される可能性があります。範囲最頻値クエリは前処理から構成されます。任意の範囲でモードを見つけることができるこの問題を解決するためにいくつかのデータ構造が考案されており、その結果の一部を次の表にまとめます。[ 1 ]
最近、Jørgensen らは細胞プローブモデルの下限を証明した。Sセルを使用するあらゆるデータ構造に対して。[ 4 ]
この特定のケースは、中央値を求めることにはいくつかの応用があるため、特に興味深い。 [ 5 ]一方、選択問題の特殊なケースである中央値問題は、中央値の中央値アルゴリズムを使用することでO ( n )で解くことができる。[ 6 ]しかし、範囲中央値クエリによるその一般化は最近のものである。[ 7 ]範囲中央値クエリここで、A、i、jは通常の意味を持ち、中央値を返します。同等に、要素を返す必要があります階級範囲の中央値クエリは、半群演算子に対するヤオのアプローチを含め、上記で説明した以前の方法のいずれに従っても解決できません。[ 8 ]
この問題には2つのバリアントが研究されています。1つはオフラインバージョンで、関心のあるk個のクエリすべてがバッチで与えられます。もう1つは、すべての前処理が事前に行われるバージョンです。オフラインバージョンは、次のように解決できます。時間と空間。
以下のクイックセレクトアルゴリズムの擬似コードは、ランクrの要素を見つける方法を示しています。異なる要素のソートされていない配列で、範囲の中央値を見つけるために、[ 7 ]
rangeMedian(A, i, j, r) { if A.length() == 1 return A[1] A.lowが未定義の場合 m = 中央値(A) A.low = [e in A | e <= m] A.high = [e in A | e > m ] A[i, j]の要素のうち、A.lowに属する要素の数を計算します。 r <= t の場合は rangeMedian(A.low, i, j, r) を返し、そうでない場合は rangeMedian(A.high, i, j, rt)を返す。 }この手順では、の中央値を使用してを2つの配列とにrangeMedian分割します。前者はの中央値以下の要素を含み、後者はの残りの要素を含みます。の要素数がわかっている場合AAA.lowA.highAmA最終的に となりA.low、tこの数が より大きい場合は、のrランクの要素を探し続ける必要があります。そうでない場合は、 のランクの要素を探す必要があります。rA.lowにおいて。tをA.high見つけるには、最大インデックスを見つけるだけで十分です。そのためはA.low、最大インデックスですそのため は にありますA.high。パーティショニング部分を考慮に入れない場合、任意のクエリの総コストはせいぜい再帰呼び出しが行われ、それぞれの呼び出しで一定数の演算のみが実行されます(tの値を取得するには、分数カスケードを使用する必要があります)。中央値を求める線形アルゴリズムを使用する場合、 k範囲の中央値クエリの前処理の総コストはアルゴリズムは、この問題のオンライン版を解決するために修正することもできます。 [ 7 ]
与えられたアイテムセットの中で頻繁に出現する要素を見つけることは、データマイニングにおいて最も重要なタスクの 1 つです。ほとんどのアイテムの出現頻度が似ている場合、頻繁に出現する要素を見つけるのは難しい場合があります。そのため、そのようなアイテムを検出するために何らかの有意性の閾値を使用すると、より有益になる可能性があります。配列の多数決を見つけるための最も有名なアルゴリズムの 1 つは、Boyer と Moore [ 9 ]によって提案されたもので、Boyer–Moore 多数決アルゴリズムとしても知られています。Boyer と Moore は、文字列の多数決要素 (存在する場合) を見つけるアルゴリズムを提案しました。時間と使用 空間。BoyerとMooreの研究の文脈、そして一般的に言えば、項目の集合(例えば文字列や配列)における多数派要素とは、その集合のサイズの半分を超えるインスタンス数を持つ要素のことである。数年後、MisraとGries [ 10 ]は、BoyerとMooreのアルゴリズムのより一般的なバージョンを提案した。配列内の相対頻度が一定の閾値を超えるすべての項目を見つけるための比較範囲多数決クエリとは、データ構造(例えば配列)のサブレンジのサイズが与えられた場合に、、出現回数が(または一部の出版物では等しい)すべての異なる項目のセットを返します。その範囲内の回数。範囲をサポートするさまざまな構造-大多数のクエリ、は静的(前処理中に指定)または動的(クエリ時に指定)のいずれかになります。このようなアプローチの多くは、範囲のサイズに関係なく、特定の最大で少なくとも相対頻度が明確な異なる候補これらの候補をそれぞれ一定時間で検証することにより、 クエリ時間が達成されました。範囲-多数決クエリは、範囲内の過半数パーティション付きそしてでなければならない-どちらかの過半数またはこの分解可能性により、いくつかのデータ構造は-範囲ツリーでクエリ範囲のエンドポイントの最小共通祖先(LCA) を見つけ、2 つの候補セット (サイズ) を検証することにより、1 次元配列に対する多数決クエリを実行します。)各エンドポイントから最小共通祖先まで一定時間で到達し、クエリ実行時間。
Gagieら[ 12 ]は範囲をサポートするデータ構造を提案した。-大多数のクエリは 配列各クエリについてこのデータ構造では、しきい値長方形の範囲が指定され、その矩形範囲内の相対頻度が 以上のすべての要素の集合は、出力として返されます。このデータ構造は、動的なしきい値(クエリ時に指定)と前処理しきい値をサポートしています。これは、それに基づいて構築されます。前処理中に、垂直および水平の間隔のセットが構築されます。配列。垂直方向と水平方向の区間が組み合わさってブロックを形成します。各ブロックは、それ自身の9倍の大きさのスーパーブロックの一部です(ブロックの水平方向の区間の3倍と垂直方向の区間の3倍)。各ブロックに対して、候補のセット(少なくとも の相対頻度を持つ要素で構成される要素が格納されます。(前述の前処理閾値)はそれぞれのスーパーブロックに格納されます。これらの要素は、その頻度に応じて非増加順に格納され、相対頻度が少なくとも 1 以上の要素は、ブロック内には、その候補セットが表示される必要があります。- 多数決クエリは、まずクエリブロック、つまり指定されたクエリ矩形に含まれる最大のブロックを見つけることによって回答されます。時間。取得したクエリブロックの場合、最初の候補者は(検証されずに)返されます時間がかかるため、このプロセスでは偽陽性が返される可能性があります。他の多くのデータ構造(後述)では、各候補を定数時間で検証し、したがってクエリ時間中に誤検出を返さないケース。クエリブロックが小さい場合保存によって処理されます以下の形式のデータ構造の異なるインスタンス:
どこ前処理のしきい値は番目のインスタンス。したがって、クエリブロックが小さい場合、の番目のインスタンスがクエリされます。前述のとおり、このデータ構造はクエリ時間を持っています。 そして必要とするハフマン符号化されたコピーを保存することで、スペースのビットを節約できます(因子(ハフマン符号化も参照)。
Chanら[ 13 ]は、 1次元配列が与えられた場合のデータ構造を提案した。部分範囲の(クエリ時に指定)およびしきい値(クエリ時に指定)すべてのリストを返すことができます-大多数が時間のかかる空間の単語。このような質問に答えるために、Chan ら[ 13 ]は、範囲内で上位 k個の最も頻繁に出現する項目を返すことができるデータ構造が存在することを指摘することから始めます。時間のかかる空間の単語。一次元配列の場合片側トップk範囲クエリを次の形式とする範囲の最大範囲については異なる要素の周波数で変更されず(そして等しい)水平線分が構築される。この線分の区間はそしてそれは-値は各要素を追加して前述のプロセスは、正確に1つの異なる要素の周波数を変化させ、線分。さらに、垂直線の場合それと交差するすべての水平線分は、その頻度に従ってソートされます。各水平線分は、-間隔正確に1つの異なる要素に対応するで、したがって上位k件のクエリには、垂直光線を照射することで回答できる。そして最初の報告それと交差する水平線分(上記で述べたように、これらの線分はすでに頻度に応じてソートされている)時間。
Chan ら[ 13 ]は、まず、各分岐ノードが片側範囲トップ k クエリ用に上述のデータ構造のコピーを 1 つ格納し、各リーフが要素を表す範囲ツリーを構築します。各ノードにおけるトップkデータ構造は、そのノードのサブツリーに存在する値に基づいて構築され、片側範囲トップkクエリに応答することを目的としています。1次元配列の場合、範囲ツリーは分割することによって構築できます2つの半分に分割し、両方の半分で再帰処理を行う。したがって、結果として得られる範囲ツリーの各ノードは範囲を表す。また、この範囲ツリーは空間の言葉は、レベルと各レベルもっているノード。さらに、各レベルで範囲ツリーのすべてのノードの合計は要素サブツリーには、レベルごとに、この範囲ツリーの空間計算量は。
この構造を使用すると、範囲- 多数決クエリの上と答えは以下のとおりです。まず、葉ノードの最小共通祖先(LCA)そして定数時間で見つかります。必要なデータ構造が存在することに注意してください。LCAクエリに答えることができる空間の断片時間。[ 14 ]LCA を表すそして使用そして範囲の分解可能性に応じて-多数決クエリ(上記および[ 11 ]で説明されているとおり)、両側範囲クエリ2 つの片側範囲トップ k クエリに変換できます (にそして) これらの 2 つの片側範囲トップ k クエリはトップ (それぞれの範囲で最も頻繁に出現する要素時間。これらの頻繁に出現する要素は、-大多数がそこには候補の中には偽陽性である可能性のあるものもある。各候補は、線形空間データ構造([ 15 ]の補題3で説明されている) を使用して定数時間で評価され、配列の特定のサブレンジが少なくとも特定の要素のインスタンス。
Gagie ら[ 16 ]は、 2 つのノードが与えられた場合にクエリをサポートするデータ構造を提案した。そしてツリーでは、相対頻度がより大きい要素のリストを報告できます道中により正式には、各ノードがサイズのアルファベットからのラベルを持つラベル付き木とする。 させてノードのラベルを示すで。 させてから一意のパスを表しますにで中間ノードは訪問された順にリストされます。、および固定(前処理中に指定)しきい値クエリ複数回出現するすべてのラベルのセットを返す必要があります 回数。
このデータ構造を構築するには、まずノードはマークされます。これは、少なくとも距離を持つノードをマークすることによって実行できます。3つの高さのうち一番下から、深さがで割り切れるこの操作を行うと、各ノードとその最も近いマークされた祖先との間の距離が以下であることが観察されます。マークされたノードの場合、異なるシーケンス(ルートへの経路)保存されます、
のためにどこノードの直接の親のラベルを返します言い換えれば、マークされた各ノードについて、ルートに向かう長さが2のべき乗(ノード自体の長さ1を加えた値)のすべてのパスのセットが格納されます。さらに、各、すべての多数派候補の集合保存されます。より具体的には、すべてのセットが含まれています-大多数がまたは、より多く表示されるラベル回数候補の集合は容易にわかる。最大でそれぞれに固有のラベルGagie ら[ 16 ]は、すべての集合が-マークされたノードからのパス上の過半数その祖先の1つへ一部に含まれる([ 16 ]の補題2 )長さはに等しいしたがって、のために長さがどこは x と z の間の距離です。このような存在は、は、-経路の大半からにでなければならない-大多数が、したがって、このデータ構造では、空間の言葉、なぜなら、建設段階で上述したようにノードにはマークが付けられ、マークされた各ノードに対していくつかの候補セットが格納されます。定義により、マークされた各ノードに対して、このようなセットにはストアがあり、それぞれには候補者。したがって、このデータ構造には空間の単語。各ノードに注意してください。また店舗もこれは、道中根源へこれは、ノードごとに一定数の単語を追加するだけなので、空間計算量を増加させません。
2つのノード間の各クエリそして範囲の分解可能性特性(上記で説明したとおり)を使用することで回答できます。-大多数のクエリとクエリパスを分割することによってそして4 つのサブパスに分割します。最小共通祖先であるそして、 とそして最も近い標識された祖先であるそしてそれぞれ。には、以下のパスに分解されます。そしてにそしてそれぞれ(これらのパスのサイズは以下より小さい)定義上、これらはすべて候補とみなされる)から、そしてに(適切なものを見つけることによって)上記の説明に従い、すべてのラベルを候補として考慮します。境界ノードは、これらのサブパスがすべて互いに素であり、それらすべてから一連の候補が導出される。これらの候補はそれぞれ、ノードの最下位祖先を返すクエリラベルが付いているそして各ノードのフィールド。-ビットRAMとサイズのアルファベット、質問には以下のように回答できます線形空間要件を持ちながら時間。[ 17 ]したがって、候補者時間の結果すべてのセットを返すための合計クエリ時間-大多数がに。
上記の問題はすべて、高次元の場合や動的なバージョンについても研究されています。一方、範囲クエリは、レベル祖先問題などのツリー[ 8 ]などの他のデータ構造にも拡張できます。同様の問題群として、直交範囲クエリ(カウントクエリとも呼ばれる)があります。