自分で質問に答えなければならないようです。そして、その答えは、私が実際に求めていたz階数曲線に関連しています。これは私がそれを得る限りです:
- はい。これは、z階数曲線では常にそのように機能します。
- 1)が真であるため、無関係です。
- エリアの大きさや場所によって異なりますが、最悪のシナリオは、スペースから遠く離れている場合ではなく、実際にスペースの中心を含める場合です。どの次元でも、各次元で深さNビットのインデックスを使用する場合、z階数曲線が完全に一致し、検索ボックスでのみポイントを取得するという特殊なケースがあります。これは、次の条件が満たされた場合に発生します。
- 検索領域はすべての次元で同じサイズで、2の累乗、2 ^ Mです。ここで、0 <= M<=Nです。
- 検索領域は、すべての軸に揃えられた超立方体です。
- 検索領域の超立方体の角のすべての座標は、2^Mの倍数です。これらの条件がすべて満たされると、検索領域はサブツリーノードに正確に対応するため、完全に一致します。ただし、一般的なケースでは、必要なすべてのポイントを保持する最小のノードを見つけて、部分的に一致する小さなノードに再帰的に細分化し、最大の目的の深さまで、より良い一致を得ることができます。複数のクエリを使用するコスト。エリアのすべてのコーナーを含む最小のツリーノードを見つけることは、すべてのコーナーに共通のモートンコードのプレフィックスを見つけることと同じです。また、単一のクエリを使用する場合、返される領域の外側のポイントの量は、クエリされたそのノードの量から検索領域の量を引いたものになります。
- それが問題だと確信していますが、それに関する情報はまだ見つかりません。
私が言っていることがはっきりしていないようですので、少しアスキーアートをやります...
2Dの基本的なZオーダー(モートンオーダー)曲線は次のようになります(パスはA、B、C、D)。
x 0 1
0 A → B
↙
1 C → D
したがって、A =(0,0)B =(0,1)C =(1,0)D =(1,1)
これで、2Dの基本的なヒルベルト曲線は次のようになります(パスはA、B、C、Dです)。
x 0 1
0 A D
↓ ↑
1 B → C
したがって、A =(0,0)B =(1,0)C =(1,1)D =(0,1)
Z次(モートン次)の場合、曲線は最低点A(0,0)から始まり、最高点D(1,1)で終わり、その間のすべての点をカバーします。これにより、範囲検索が簡単になり、3Dでも機能します。3Dボックス(0,0,0)から(1,1,1)のすべてのポイントは、モートン注文コード(0,0,0)と(1,1,1)の間にあります。
ヒルベルト曲線では、(0,0)で開始し、(0,1)で終了します(おそらく3Dでも同様です)。したがって、(0,0)から(1,1)のヒルベルトコードから範囲クエリを実行しても、すべてのポイントが見つかるわけではありません。
したがって、ヒルベルト曲線を使用して3Dボックス(0,0,0)から(1,1,1)までの範囲クエリを(単一のDBクエリとして)実行する場合は、何を通知する関数が必要です。 (0,0,0)と(1,1,1)は機能しないため、最初のポイントとして使用する必要があるポイントと、最後のポイントとして使用する必要があるポイント。
では、8(3Dの場合)ボックス座標を指定し、範囲クエリで使用する最初と最後のポイントを返すような関数はありますか?それがないと、ヒルベルト曲線を使用して問題を解決することはできません。
または、疑似SQLの場合:
モートンクエリ:
SELECT key,data FROM table WHERE (key >= Morton(lowest(box))) AND (key <= Morton(highest(box)))
ヒルベルトクエリ:
SELECT key,data FROM table WHERE (key >= Hilbert(XXX(box))) AND (key <= Hilbert(YYY(box)))
したがって、XXX()とYYY()が必要です。
[編集]この回答の一部は、ヒルベルト曲線を使用するように指示する他の回答を対象としていましたが、その後、回答が削除されました。