Pourquoi utiliserait-on jamais un octree sur un arbre KD?


32

J'ai une certaine expérience dans le calcul scientifique et j'ai largement utilisé les arbres kd pour les applications BSP (partitionnement d'espace binaire). Je me suis récemment familiarisé avec les octrois, une structure de données similaire pour partitionner des espaces euclidiens 3D, mais qui fonctionne à intervalles réguliers fixes, d'après ce que je comprends.

Un peu de recherche sur l'indépendance semble indiquer que les arbres kd ont généralement des performances supérieures pour la plupart des ensembles de données - plus rapides à construire et à interroger. Ma question est, quels sont les avantages des octrees dans les performances spatiales / temporelles ou autres, et dans quelles situations sont-ils les plus applicables (j'ai entendu la programmation graphique 3D)? Un résumé des avantages et des problèmes des deux types me serait très apprécié.

En plus, si quelqu'un pouvait expliquer l'utilisation de la structure de données de l'arborescence R et ses avantages, j'en serais également reconnaissant. Les arbres R (plus que les octrees) semblent être appliqués de manière assez similaire aux arbres kd pour les recherches de k voisin le plus proche ou de plage.


Je dois noter que les arbres kd et les arbres R (mais pas les octrees) semblent spécifiquement conçus pour faciliter les recherches de k-voisins les plus proches - comment se comparent-ils dans ce sens?
Noldorin

Une note est que les arbres kd ont garanti une faible profondeur. Les arbres quadruples compressés peuvent vous y conduire, mais sont moins pratiques.
Suresh Venkat

@Suresh Venkat: Merci pour cela. Je ne connais pas les arbres quadruples compressés, mais conviendraient-ils vraiment pour les répétitions spatiales 3D? Peut-être existe-t-il un analogue "octree compressé".
Noldorin

J'ai également entendu dire que les octrees sont plus appropriés lorsque l'on a une courbe d'ordre Z (remplissage d'espace) connue, mais je ne suis pas sûr du raisonnement ici.
Noldorin

Réponses:


23

Les cellules d'un arbre peuvent avoir un rapport d'aspect élevé, alors que les cellules octree sont garanties cubiques. Puisqu'il s'agit d'une carte théorique, je vais vous donner la raison théorique pour laquelle un rapport d'aspect élevé est un problème: il est impossible d'utiliser des limites de volume pour contrôler le nombre de cellules que vous devez examiner lors de la résolution des requêtes approximatives de voisins les plus proches.kD

De façon plus détaillée: si vous demandez un -approximate voisin le plus proche d'un point d'interrogation q , et le plus proche réelle voisin est à une distance d , vous finissez généralement avec une recherche qui examine toutes les cellules de structure de données qui va de l'intérieur vers l' à l'extérieur d'un espace annulaire ou annulaire de rayon intérieur d et de rayon extérieur ( 1 + ϵ ) d . Si les cellules ont un rapport d'aspect borné, comme elles le sont dans un quadtre, alors il peut y avoir au plus 1 /ϵqdd(1+ϵ)d telles cellules, et vous pouvez prouver de bonnes limites sur le temps de la requête. Si le rapport hauteur / largeur n'est pas limité, comme dans un k1/ϵd1 -tree, ces limites ne s'appliquent pas.kD

arbres D ont un avantage différent par rapport aux arbres quadruples, car ils sont garantis d'avoir au plus la profondeur logarithmique, ce qui contribue également au temps pour une requête de voisin le plus proche. Mais la profondeur d'un quadtree est au plus le nombre de bits de précision de l'entrée qui n'est généralement pas grand, et il existe des méthodes théoriques pour contrôler la profondeur pour être essentiellement logarithmique (voir la structure de données de saut de quadtree).kD


4
Voir le manuel récent de Sariel Har-Peled pour un résumé moderne des arbres quadratiques compressés.
Jeffε

Merci pour un bon résumé quantitatif, David. Juste pour confirmer: votre utilisation du "rapport d'aspect" est-elle synonyme de "rapport de branchement"? Je vais certainement devoir vérifier les sauts de quadruples / octets et peut-être aussi les quadruples / octets compressés.
Noldorin

1
Le rapport d'aspect d'une boîte rectangulaire peut être défini comme le rapport de sa longueur de bord la plus longue à sa longueur de bord la plus courte. Je ne sais pas ce que le ratio de branchement est censé signifier dans ce contexte, mais le ratio d'aspect n'est pas lié au facteur de branchement des arbres (qui est constant pour les deux structures de données).
David Eppstein

J'ai raté les "cellules dedans". Ça a du sens maintenant.
Noldorin

15

Un groupe d'amis et moi travaillons sur un jeu Space-RTS comme un projet parallèle amusant. Nous utilisons beaucoup de choses que nous avons apprises en informatique pour le rendre très efficace, ce qui nous permet de faire des armées massives plus tard.

À cette fin, nous avons envisagé d'utiliser des arbres kd, mais nous les avons rapidement rejetés: les insertions et les suppressions sont extrêmement courantes dans notre programme (considérons un navire volant dans l'espace), et c'est un gâchis impie avec les arbres kd. Nous avons donc choisi des octrees pour notre jeu.


Ah oui, j'ai déjà entendu ça aussi. L'insertion / suppression avec kd-trees est une opération coûteuse (due au rééquilibrage). Je crois que les complexités temporelles dans le meilleur des cas sont toujours les mêmes cependant ...
Noldorin

2
Cela dépend de la façon dont vous allez réparer l'arbre kd. Une bonne complexité temporelle dans le meilleur des cas n'est pas quelque chose que je vise généralement: par exemple, bogosort a une complexité dans le meilleur des cas O (1), mais j'espère que personne ne l'utilise.
Alex ten Brink

Malheureusement, je n'arrive pas à trouver de bons résumés des complexités temporelles pour les opérations courantes sur ces structures de données, mais cela ne me dérange pas. La complexité temporelle moyenne des cas est souvent révélatrice ...
Noldorin

1
Je pense vraiment que vous feriez encore mieux si vous utilisiez simplement un arbre KD qui faisait défiler les axes et divisait simplement l'espace au milieu. Ignorez le SAH volumineux et d'autres coupes médianes coûteuses et vous vous retrouverez avec quelque chose qui non seulement recherche plus vite qu'un octree, mais construit également plus rapidement. Puisque vous partitionnez l'espace de manière égale comme vous le feriez avec un octree, mais avec un arbre binaire plutôt qu'un arbre à 8 aires, tout ce que vous faisiez avant pour les suppressions ne devrait pas être plus complexe avec l'arbre KD, car il 'll seront également espacés de manière similaire. Ex: vous pouvez simplement supprimer des nœuds vides au-delà d'une profondeur de N.
Dragon Energy

8

quels sont les avantages des octrees dans les performances spatiales / temporelles ou autres, et dans quelles situations sont-ils les plus applicables (j'ai entendu une programmation graphique 3D)?

Les arbres kD sont des arbres binaires équilibrés et les octrees sont des essais donc les avantages et les inconvénients sont probablement hérités de ces structures de données plus générales. Plus précisément:

  • Le rééquilibrage peut être coûteux (les octets n'ont pas besoin d'être rééquilibrés).
  • L'équilibrage gère mieux l'hétérogénéité car il est adaptatif.
  • Un facteur de ramification plus élevé en octets signifie des arbres moins profonds (moins d'indirections et d'allocations) pour des distributions homogènes.

De plus, la bissection (comme dans les octrees) se prête à une implémentation triviale en termes de bit-twiddling. De même, j'imagine que les octrees peuvent grandement bénéficier des distances précalculées lors des recherches de plage.

MODIFIER

Apparemment, mes références aux essais et à l'homogénéité doivent être clarifiées.

Les essais sont une famille de structures de données représentées par des arbres de dictionnaires et sont utilisés comme dictionnaires pour des clés qui sont des séquences (notamment des chaînes mais aussi des séquences d'ADN et les bits dans une valeur de hachage pour les essais de hachage). Si chaque dictionnaire mappe un bit de chacune des coordonnées x, y et z (bit le plus significatif au premier niveau du trie, bit significatif suivant au deuxième niveau, etc.), le trie est un octree qui subdivise uniformément l'espace 3D. Par conséquent, les octrees héritent des caractéristiques des essais qui sont, en général:

  • Un facteur de ramification élevé peut signifier des arbres peu profonds qui subissent peu d'indirections, la recherche est donc rapide, par exemple 20 niveaux d'arbre binaire peuvent être stockés dans 4 niveaux d'un arbre avec un facteur de ramification de 256.
  • Les tentatives ne sont pas rééquilibrées pendant les insertions et les suppressions, ce qui évite une opération coûteuse requise pour les arbres binaires équilibrés.

L'inconvénient est que l'hétérogénéité peut entraîner des essais / octets déséquilibrés, de sorte que les recherches peuvent nécessiter de nombreuses indirections. Le problème équivalent dans les essais est résolu en utilisant la compression des bords pour réduire plusieurs niveaux d'indirection en un seul niveau. Octrees ne fait pas cela mais rien ne vous empêche de compresser un octree (mais je ne pense pas que vous puissiez appeler le résultat un octree!).

À titre de comparaison, considérons un dictionnaire spécialisé pour les clés de chaîne qui est représenté comme un trie. Le premier niveau du trie se branche sur le premier caractère de la clé. Le deuxième niveau sur le deuxième personnage et ainsi de suite. Toute chaîne peut être recherchée en recherchant le premier caractère de la clé dans le dictionnaire pour obtenir un deuxième dictionnaire qui est utilisé pour rechercher le deuxième caractère de la clé, etc. Un ensemble de chaînes de clés aléatoires serait homogène distribution . Un ensemble de chaînes de clés qui partagent toutes un préfixe (par exemple, tous les mots commençant par "anti") sont hétérogènes.Distribution. Dans ce dernier cas, le premier dictionnaire ne contient qu'une seule liaison, pour "a", le second uniquement pour "n" et ainsi de suite. La recherche de tout mappage dans le trie étant toujours en recherchant les quatre mêmes dictionnaires avec les mêmes quatre touches. C'est inefficace et c'est ce que font les octrees si, par exemple, ils sont utilisés pour stocker des distributions de particules hétérogènes où la grande majorité des particules se trouvent dans un petit volume dans l'espace vectoriel.


"les octrees sont des essais"? Aussi, que voulez-vous dire par «gère mieux l'hétérogénéité»? Homogène n'est pas un mot que j'ai rencontré à propos des arbres.
Noldorin

2
"Octtrees n'a pas besoin d'être rééquilibré"? Ce n'est absolument pas vrai pour les octtrees qui stockent des distributions de points hétérogènes. Alternativement, en fonction de la façon dont vous définissez généralement "octtree": Le rééquilibrage d'un octtree est tout simplement impossible , aussi souhaitable soit-il.
Jeffε

@Noldorin "les octrees sont des essais". Oui. Savez-vous ce qu'est un trie? en.wikipedia.org/wiki/Trie
Jon Harrop

@Noldorin "Homogène n'est pas un mot que j'ai rencontré à propos des arbres". Je fais référence à l'homogénéité de la distribution qui est partitionnée. Par exemple, lors de la partition de particules dans un espace 3D, les atomes d'un solide sont répartis de manière homogène tandis que les étoiles de l'univers sont réparties de façon hétérogène. Les arbres kD sont plus susceptibles d'être préférables pour les distributions hétérogènes car leur subdivision de l'espace est adaptative.
Jon Harrop

@ Jɛ ff E "Rééquilibrer un octtree est tout simplement impossible". C'est exactement de cela que je parlais. Toutes mes excuses si ma formulation était déroutante.
Jon Harrop

2

Les octrees sont utiles comme type de données de base pour les modèles de continuum, voir par exemple le solveur de flux Gerris . La vie est déjà assez difficile en dynamique des fluides, donc savoir que la taille de tous vos sous-cubes ne dépend que de leur profondeur doit être un facteur de simplification.

Mise en garde: je ne suis pas un dynamique dynamique!


Intéressant. Je peux certainement comprendre que les octrees sont plus simples à utiliser dans les modèles de continuum ... Je me demande cependant pourquoi la programmation graphique est une raison?
Noldorin
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.