1
ary配列のO(1)時間範囲クエリのビット複雑度
次の問題を検討してください。 してみましょうkkk一定です。我々は、与えられた進アレイのとのが。ましょ。A d 1 × … × d k 0 1 N = ∏ k i = 1 d ikkkAd1×…×dkAd1×…×dkA_{d_1\times\ldots\times d_k}000111N=∏ki=1diN=∏i=1kdiN = \prod_{i=1}^k d_i 次のタイプのクエリ操作を実行するためにを前処理ことにより、データ構造を作成したいとします。AAA aryボックスの座標を考えると、ボックスにはがありますか? D 1kkkDDD111 aryボックスの座標を指定して、ボックス内のの位置を返します(存在する場合)。D 1kkkDDD111 操作は一定時間で実行する必要がありますO(1)O(1)O(1)。時間の複雑さは、RAMマシンで測定されます。データ構造の前処理の時間とスペースは、私たちにとって重要ではありません。 問題は、上記の操作を可能にするデータ構造を格納するために必要なスペース(ビットの複雑さ)の量です。 これらのクエリに対して配列を再構築できるため、自明な下限はNNNビットです(したがって、データ構造には少なくとも同じ量の情報が含まれている必要があります)。 自明な上限は、すべてのクエリに対する回答を格納することです。これには、ビットが必要です。ただし、これははるかに効率的に実行できると思われます。∏ki=1(di2)=Θ(N2)∏i=1k(di2)=Θ(N2)\prod_{i=1}^k {d_i \choose 2} = \Theta(N^2) たとえば、である特殊なケースを考えます。この場合、最初の問題を解決するために簡潔なRMQデータ構造を使用できます。データ構造の格納にはビットかかります。k=1k=1k=12N+o(N)2N+o(N)2N+o(N) このタスクの効率的なデータ構造は何ですか? スペースの複雑さ(ビット数)は、これらの操作(または最初の操作のみ)をサポートするためにどれだけ低くできますか? アップデート(1/15): 特殊なケースでは使用して、ビットは、実際によりよい(十分であるここで、数であるの)は、問題を先行問題に削減し、先行問題から完全に索引付け可能な辞書(FID)への削減を使用することによって。Grossi、Orlandi、Raman、およびRao(2009)による「より速く、より少ない無駄:完全に索引付け可能な辞書の冗長性を下げる」を参照してください。k=1k=1k=1N+o(N)N+o(N)N +o(N)log(Nt)+O(t)log(Nt)+O(t)\log {N\choose t}+O(t)ttt111AAA 更新(6/27): 問題をRMQに減らします。YuanとAtallahによる次元のRMQ を使用して、が固定されている場合に必要なスペース量の上限を取得し。kkkO(nlogn)O(nlogn)O(n\log …