空間的/時間的パフォーマンスまたはその他の点で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つの辞書を検索します。これは非効率的です。たとえば、オクトツリーを使用して、大部分の粒子がベクトル空間内の小さなボリュームにある異種粒子分布を保存する場合に使用します。