KDツリーでOctreeを使用するのはなぜですか?


32

科学コンピューティングの経験があり、BSP(バイナリ空間分割)アプリケーションにkdツリーを広く使用しています。最近、3Dユークリッド空間を分割するための同様のデータ構造であるoctreeにかなり精通しましたが、収集したものから一定の間隔で機能するものです。

少しの独立性調査では、ほとんどのデータセットでkdツリーのパフォーマンスが一般的に優れていることが示されているようです(構築とクエリが高速です)。私の質問は、空間的/時間的パフォーマンスまたはその他の点でoctreeの利点は何ですか?また、どの状況で最も適していますか(3Dグラフィックスプログラミングを聞いたことがありますか)?両方のタイプの利点と問題の要約は、私が最も高く評価するでしょう。

さらに、Rツリーデータ構造の使用法とその利点について詳しく説明できれば、それもありがたいです。Rツリー(octreeよりも)は、k最近傍検索または範囲検索のkdツリーとまったく同じように適用されるようです。


kd-treeとR-tree(octreeではありません)の両方は、k最近傍検索を容易にするために特別に設計されているように見えることに注意してください-この意味でどのように比較しますか?
ノルドリン

1つの注意点は、kdツリーが小さい深さを保証していることです。圧縮されたクワッドツリーはそこに到達できますが、あまり便利ではありません。
スレシュヴェンカト

@Suresh Venkat:ありがとうございます。圧縮されたクアッドツリーに慣れていませんが、3D空間担当者には本当に適していますか?おそらく、「圧縮されたoctree」類似体があります。
ノルドリン

また、既知のZオーダー(空間充填)曲線を持っている場合、八分木がより適切であると聞いたことがありますが、ここでの理由についてはよくわかりません。
ノルドリン

回答:


23

中の細胞 -treeはオクツリー細胞が立方体であることが保証されているのに対し、高アスペクト比を有することができます。これは理論ボードであるため、高アスペクト比が問題となる理論的な理由を説明します:近似境界クエリを解決するときに調べる必要があるセルの数をボリューム境界を使用して制御することが不可能になります。kD

詳細:クエリポイント -approximate最近傍を要求し、実際の最近傍が距離にある場合、通常、内側から内側に到達するすべてのデータ構造セルを調べる検索になります。内側半径および外側半径環または環状シェルの外側。四分木にあるように、セルのアスペクト比が制限されている場合、最大でそのようなセルが存在する可能性があり、クエリの時間の適切な範囲を証明できます。ツリーのようにアスペクト比が制限されていない場合、これらの制限は適用されません。q d d 1 + ϵ d 1 / ϵ d 1 k Dϵqdd(1+ϵ)d1/ϵd1kD

kDツリーは、最大で対数の深さを持つことが保証されるという点で、クアッドツリーとは異なる利点があります。これは、最近傍クエリの時間にも寄与します。しかし、四分木の深さはせいぜい入力の精度のビット数であり、一般に大きくはなく、深さを本質的に対数に制御する理論的な方法があります(スキップ四分木データ構造を参照)。


4
圧縮されたクアッドツリーの最新の要約については、Sariel Har-Peledの最近の教科書を参照してください。
ジェフ

良い定量的要約をありがとう、David。確認のために:「アスペクト比」の使用は「分岐比」と同義ですか?私は間違いなくスキップquadrees / octreesと圧縮されたquadtrees / octreesをチェックインする必要があります。
ノルドリン

1
長方形のボックスの縦横比は、最長の辺の長さと最短の辺の長さの比として定義できます。この文脈で分岐比が何を意味するかはわかりませんが、アスペクト比は木の分岐係数とは無関係です(両方のデータ構造で一定です)。
デビッドエップシュタイン

私は「細胞」を見逃しました。今理にかなっています。
ノルドリン

15

友人のグループと私は、楽しいサイドプロジェクトとしてspace-RTSゲームに取り組んでいます。コンピューターサイエンスで学んだことを非常に効率的に使用して、後で大規模な軍隊を作ることができるようにしています。

この目的のために、私たちはkdツリーを使用することを検討しましたが、すぐにそれらを却下しました:挿入と削除はプログラムで非常に一般的であり(宇宙を飛行する船を考えてください)、これはkdツリーの厄介な混乱です。したがって、私たちはゲームのために八分木を選びました。


ああ、私もこれを聞いたことがあります。kdツリーを使用した挿入/削除は、コストのかかる操作です(再バランスのため)。私は最善の時間の複雑さは、しかし、まだ同じと考えている...
Noldorin

2
kdツリーの修正方法によって異なります。良いベストケースの時間の複雑さは、私が一般的に目指しているものではありません。たとえば、bogosortにはO(1)のベストケースの複雑さがありますが、誰も使用しないことを望みます。
アレックス10ブリンク

残念ながら、これらのデータ構造での一般的な操作の時間的な複雑さの良い要約を見つけることはできませんが、気にしません。平均ケース時の複雑さが...しばしば洞察力のある
Noldorin

1
軸を循環させ、スペースを真ん中に単純に分割するKDツリーを使用しただけで、さらに良くなると思います。かさばるSAHやその他の高価な中央値カットをスキップすると、octreeよりも高速に検索できるだけでなく、ビルドも高速になるものになります。八分木ではなく八分木でスペースを均等に分割しているので、削除のために以前に何をしていたとしても、KDツリーでこれ以上複雑になるべきではありません。同様の方法で等間隔になります。例:あなたは、単にNの深さを超えて空のノードを削除するかもしれない
ドラゴンエネルギー

8

空間的/時間的パフォーマンスまたはその他の点でoctreeの利点は何ですか?また、どのような状況で最も適していますか(3Dグラフィックスプログラミングを聞いたことがありますか)?

kDツリーはバランスの取れた二分木であり、八分木は試行であるため、長所と短所はおそらくこれらのより一般的なデータ構造から継承されます。具体的には:

  • リバランスは高価になる可能性があります(octreeはリバランスを必要としません)。
  • 分散は適応性があるため、不均一性をより適切に処理します。
  • octreesの分岐係数が高いとは、同種分布の浅いツリー(間接参照と割り当てが少ない)を意味します。

また、(octreesのように)二分法は、ビットトゥイドリングの観点から自明な実装に適しています。同様に、範囲検索を行う場合、octreeは事前に計算された距離から大きな恩恵を受けることができると思います。

編集

どうやら私の試行と均一性への言及には明確化が必要です。

トライは、辞書のツリーで表されるデータ構造のファミリーであり、シーケンス(特に文字列だけでなく、DNAシーケンスとハッシュ試行のハッシュ値のビット)であるキーの辞書として使用されます。各ディクショナリがx、y、z座標のそれぞれの1ビットをマッピングする場合(トライの最初のレベルの最上位ビット、2番目のレベルの次の有意ビットなど)、トライは3D空間を均一に細分する八分木です。したがって、octreeは一般に次の試行の特性を継承します。

  • 高い分岐係数は、検索が高速であるため、検索が高速な浅いツリーを意味します。たとえば、20のレベルのバイナリツリーを256の分岐係数を持つツリーの4つのレベルに格納できます。
  • 挿入および削除中に試行のバランスが再調整されないため、バランスの取れたバイナリツリーに必要な高価な操作が節約されます。

不利な点は、不均一性により試行/ octreeが不均衡になる可能性があるため、検索で多くのインダイレクションが必要になる場合があることです。試行の同等の問題は、エッジ圧縮を使用して複数レベルの間接参照を単一レベルに折りたたみます。Octreesはこれを行いませんが、octreeを圧縮することを止めるものは何もありません(しかし、結果をoctreeと呼ぶことはできないと思います!)。

比較のために、トライとして表される文字列キー専用の辞書を検討してください。トライの最初のレベルは、キーの最初の文字で分岐します。2番目のキャラクターの2番目のレベルなど。辞書内のキーから最初の文字を検索して、キーから2番目の文字を検索するために使用される2番目の辞書を取得するなどして、任意の文字列を検索できます。ランダムなキー文字列のセットは同種の分布になります。すべてが何らかの接頭辞を共有する一連のキー文字列(たとえば、「anti」で始まるすべての単語)は異種です分布。後者の場合、最初の辞書には「a」のバインディングが1つだけ含まれ、2番目の辞書には「n」のバインディングが含まれます。トライのマッピングを検索するには、常に同じ4つのキーで同じ4つの辞書を検索します。これは非効率的です。たとえば、オクトツリーを使用して、大部分の粒子がベクトル空間内の小さなボリュームにある異種粒子分布を保存する場合に使用します。


「octreesはトライ」ですか?また、「不均一性をより良く処理する」とはどういう意味ですか?同質という言葉は、木に関して私が出会った言葉ではありません。
ノルドリン

2
「Octtreeはリバランスを必要としません」?これは、異種のポイント分布を保存するオクトツリーにはまったく当てはまりません。あるいは、「octtree」をどの程度一般的に定義するかに応じて、octtreeのリバランスは、それがどれほど望ましいものであっても、単に不可能です。
ジェフ

@Noldorin「octreesは試行」です。はい。あなたはトライが何であるか知っていますか?en.wikipedia.org/wiki/Trie
ジョンハロップ

@Noldorin「同質という言葉は、木に関して私が出会った言葉ではありません」。私は、分割されている分布の均一性について言及しています。たとえば、3D空間で粒子を分割すると、固体の原子は均一に分布しますが、宇宙の星は不均一に分布します。kDツリーは、空間の細分化が適応的であるため、異種分布に適している可能性が高くなります。
ジョンハロップ

@Jɛff E「オクトツリーのリバランスは単純に不可能です」。それはまさに私が言っていたものです。私の言い回しが混乱していた場合は申し訳ありません。
ジョンハロップ

2

Octreesは、連続体モデルの基本データ型として役立ちます。たとえば、Gerrisフローソルバーを参照してください。流体力学では生命は十分に困難であるため、すべてのサブキューブのサイズが深さにのみ依存することを知ることは、単純化の要因である必要があります。

警告:私は流体力学者ではありません!


面白い。octreesは連続体モデルでの作業がより簡単であることは間違いなく理解できます。グラフィックプログラミングの理由は何でしょうか
ノルドリン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.