空間インデックスを一括読み込みするために、ヒルベルト次数で d 次元のデータ ベクトルを並べ替えようとしています。
ただし、各点のヒルベルト値を明示的に計算したくはありません。特に、特定の精度を設定する必要があります。高次元データでは、これには32*d
ビットなどの精度が含まれ、効率的に行うには非常に面倒です。データが不均一に分布している場合、これらの計算の一部は不要であり、データ セットの一部に特別な精度が必要になります。
代わりに、パーティショニング アプローチを実行しようとしています。2次元の一次ヒルベルト曲線を見ると
1 4
| |
2---3
まず x 軸に沿ってデータを分割し、最初の部分 (必ずしもオブジェクトの半分を含むとは限りません!) が 1 と 2 (まだソートされていない) で構成され、2 番目の部分が 3 と 4 のオブジェクトを持つようにします。それだけ。次に、Y 軸で各半分をもう一度分割しますが、順序を 3-4 に逆にします。
したがって、基本的には、分割統治戦略 (QuickSort と密接に関連しています。均等に分散されたデータでは、これは最適であるはずです!) を実行し、必要に応じてヒルベルト インデックスの必要な「ビット」のみを計算します。したがって、「1」に単一のオブジェクトがあると仮定すると、その完全な表現を計算する必要はありません。オブジェクトが均等に分散されている場合、パーティションのサイズはすぐに減少します。
私は、長いグレーコーディングの次元インターリーブに変換する通常の教科書的なアプローチを知っています。これは私が探しているものではありません (利用可能な例はたくさんあります)。私は明示的に遅延分割統治ソートのみを望んでいます。さらに、2D 以上が必要です。
このように機能する記事またはヒルベルトソートアルゴリズムを知っている人はいますか? または、「回転」を正しく行う方法、どの表現を選択するかという重要なアイデアはありますか? 特に高次元では... 2Dでは些細なことです。1 は +y、+x の回転、4 は -y、-x (回転と反転) です。しかし、より高い次元では、これはよりトリッキーになると思います。
(もちろん、結果は、オブジェクトをヒルベルト次数で十分に大きな精度でソートした場合と同じになるはずです。必要のないときに完全な表現を計算し、それを管理する時間を節約しようとしているだけです。多くの人々は、かなり高価な「ヒルベルト数へのオブジェクト」ハッシュマップを保持しています。)
Peano 曲線と Z 曲線についても同様のアプローチが可能であり、おそらく実装が少し簡単です...おそらく最初にこれらを試す必要があります (Z 曲線は既に機能しています。仮想ピボットとしての適切な平均/グリッド値と各反復の次元の循環)。
編集:Zおよびpeano曲線でどのように解決したかについては、以下を参照してください。また、すでに 2D ヒルベルト曲線に対しても機能しています。しかし、ヒルベルト曲線の回転と反転はまだ正しくありません。