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.
la source
Réponses:
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 /ϵ q d d (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/ϵd−1 -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
la source
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.
la source
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:
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:
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.
la source
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!
la source