Kd-arbre
Dans le de l'informatique, un d-arbre du k de (abréviation arbre k-dimensionnel de ) est une structure de données de espace-division de du pour les points de organisation dans un k - l'espace dimensionnel . les d-arbres du k sont une structure de données utile pour plusieurs applications, telles que des recherches impliquant une clef de recherche multidimensionnelle (par exemple la gamme recherche et le voisin le plus proche de recherche . les d-arbres du k sont une caisse spéciale des arbres du BSP
Un d-arbre du k utilise seulement les avions de division qui sont le perpendiculaire à une des haches du système du même rang . Ceci diffère des arbres de BSP, dans lesquels des avions de division arbitraires peuvent être utilisés. En outre, dans la définition typique chaque noeud d'un d-arbre du k , de la racine au laisse , stocke un point. Ceci diffère des arbres de BSP, dans lesquels les feuilles sont typiquement les seuls noeuds qui contiennent des points (ou d'autres primitifs géométriques ). Par conséquent, chaque avion de division doit passer par un des points dans le d-arbre du k . le '' k '' d-essaye sont une variante qui stockent des données seulement dans des noeuds de feuille. Il vaut de noter cela dans une définition alternative de d-arbre du k que les points sont stockés dans ses noeuds de feuille seulement, bien que chaque avion de division passe toujours par un des points.
Nomenclature
Techniquement, le k de lettre se rapporte au nombre de dimensions. Un d-arbre à trois dimensions du k s'appellerait un 3d-tree. Cependant, le " d'expression ; d-tree" à trois dimensions du k ; est généralement employé. (Il est également plus descriptif, puisqu'un arbre à trois dimensions pourrait être n'importe laquelle d'une série de différentes choses, mais le d-arbre du k de limite se rapporte à un type spécifique d'arbre de espace-division.) Le k et d de lettres sont deux lettre minuscule, même lorsque la limite vient au début d'une phrase, et le k est en italique . Cependant, les épellations variables sont communes, comme le KD-arbre et le Kd-arbre. les 2D et 3D sont des exemples de " majuscule de signification de D ; dimensional" ;.
Opérations sur des d-arbres du k
Construction d'un d-arbre du k
Puisqu'il y a beaucoup de manières possibles de choisir les avions de division axe-alignés, il y a beaucoup de différentes manières de construire des d-arbres du k . La méthode canonique de construction de d-arbre du k a les contraintes suivantes :En tant qu'un abaisse l'arbre, un fait un cycle par les haches utilisées pour choisir les avions de division. (Par exemple, la racine aurait un X - avion aligné, les enfants de la racine tous les deux auraient le y - les avions alignés, les enfants de la racine aurait tout le z - avions alignés, et ainsi de suite.)
À chaque étape, le point choisi pour créer l'avion de division est le médian des points étant mis dans le d-arbre du k , en ce qui concerne leurs coordonnées à l'axe étant employé. (Noter la prétention que nous introduisons l'ensemble entier de points dans l'algorithme d'avance.) Cette méthode mène à un d-arbre du k de équilibré par , dans lequel chaque noeud de feuille est distance à peu près identique de la racine. Cependant, les arbres équilibrés ne sont pas nécessairement optimaux pour toutes les applications.
Noter également que ce n'est pas a exigé de de choisir le point médian. Dans ce cas, le résultat est simplement qu'il n'y a aucune garantie que l'arbre sera équilibré. Un heuristique simple pour éviter de coder un algorithme de médian-conclusion de linéaire-temps complexe ni d'employer une sorte d'O ( n de notation de n ) est d'employer la sorte pour trouver la médiane d'un nombre de fixe par de points choisis par de aléatoirement pour servir de ligne de coupe. Pratiquement cette technique a comme conséquence les arbres bien équilibrés.
Donné une liste de points du n , l'algorithme suivant construira un d-arbre équilibré du k contenant ces points.
kdtree de la fonction (liste de de pointList de points , de profondeur de international ) { si le de pointList de est vide zéro de retour du ; d'autre { Axe choisi de // de basé sur la profondeur de sorte que l'axe fasse un cycle par toutes les valeurs valides axe du international de la variété : = mod k de de profondeur ; La liste de point de sorte de // de et choisissent la médiane comme élément de pivot médian choisi du de pointList de ; Le // créent le noeud et construisent les sous-arbres noeud du tree_node la variété ; node.location : = médiane ; node.leftChild : = kdtree ( de points dans le de pointList de avant médiane de , depth+1) ; node.rightChild : = kdtree ( de points dans le de pointList de après médiane de , depth+1) ; noeud de retour du ; } } Il est commun que " de points ; after" ; la médiane incluent seulement ceux qui sont supérieur ou égal à la médiane. Une autre approche est de définir un " ; superkey" ; fonctionner qui compare les points dans d'autres dimensions. Pour finir, il peut être acceptable de laisser des points égaux au mensonge médian de chaque côté.
Cet algorithme mis en application dans le langage de programmation de python est comme suit :
noeud de la classe : passage kdtree du def (pointList, depth=0) : si pointList du pas de : de retour aucun # axe choisi basé sur la profondeur de sorte que l'axe fasse un cycle par toutes les valeurs valides k = len (pointList) # suppose que tous les points ont la même dimension % d'axe = de profondeur k # liste de point de sorte pour choisir médian pointList.sort ( lambda X de key= : x) la médiane = len (pointList) le de // 2 # choisissent médian Le # créent le noeud et construisent les sous-arbres noeud = noeud () node.location = pointList node.leftChild = kdtree (pointList, depth+1) node.rightChild = kdtree (pointList, depth+1) noeud de retour du
L'utilisation d'exemple serait :
pointList = (5.2) arbre = kdtree (pointList)
L'arbre produit est montré du côté droit.
Cet algorithme crée le invariable qui pour n'importe quel noeud, tous les noeuds dans le sous-arbre gauche sont d'un côté d'un de division plat, et tous les noeuds dans le sous-arbre droit sont de l'autre côté. Les points qui se trouvent sur l'avion de division peuvent apparaître de chaque côté. Le plan de division d'un noeud passe par le point lié à ce noeud (désigné dans le code sous le nom de node.
Ajouter des éléments à un d-arbre du k
On ajoute un nouveau point à un d-arbre du k comme on ajoute un élément à n'importe quel autre arbre. D'abord, transversalement l'arbre, à partir de la racine et du déplacement à l'enfant gauche ou droit selon si le point insérer est sur le " ; left" ; ou " ; right" ; côté de l'avion de division. Une fois que vous obtenez à un noeud de feuille, ajouter le nouveau point en tant qu'enfant gauche ou droit du noeud de feuille, encore selon quel côté de l'avion de division du noeud contient le nouveau point.
Élimination des éléments d'un d-arbre du k
Enlever un point d'un d-arbre existant du k , sans casser l'invariable.
Équilibrage d'un d-arbre du k
L'équilibrage d'un d-arbre du k exige le soin. Puisque des d-arbres du k sont assortis dans des dimensions multiples, la technique de la rotation d'arbre de ne peut pas être employée pour les équilibrer &mdash ; ceci peut casser l'invariable.< ! -- Description inachevée et wafty du KD-NN-algorithme -->
Le voisin le plus proche dans un d-arbre du k
L'algorithme voisin (NN) le plus proche, pour trouver le NN à un point donné de cible pas dans l'arbre, se fonde sur la capacité de jeter de grandes parties de l'arbre en réalisant un essai simple. Pour exécuter le calcul de NN, l'arbre est recherché d'une profondeur-première mode, raffinant la distance la plus proche. D'abord le noeud de racine est examiné avec une première prétention que la plus petite distance au prochain point est infinie. Le subdomain (droit ou gauche), qui est un Hyperrectangle , contenant le point de cible est recherché. Ceci est fait périodiquement jusqu'à ce qu'une région minimum finale contenant le noeud soit trouvée. L'algorithme alors (par la récursion) examine chaque noeud de parent, voyant s'il est possible que l'autre domaine contienne un point qui est plus étroit. Ceci est exécuté en déterminant la possibilité d'intersection entre le hyperrectangle et le hypersphere (constitués par noeud de cible et le rayon minimum courant). Si le rectangle qui n'a pas été périodiquement examiné pourtant n'intersecte pas cette sphère, alors il n'y a aucune manière que le rectangle peut contenir un point qui est un meilleur voisin le plus proche. Ceci est répété jusqu'à ce que tous les domaines soient recherchés ou jetés, de ce fait laissant le voisin le plus proche comme résultat final. En plus de celui-ci a également la distance au voisin le plus proche en main aussi bien. La conclusion du point le plus proche est une opération d'O (logN).L'algorithme peut être prolongé de plusieurs manières par des modifications simples.
Le voisin le plus proche approximatif peut être réalisé en plaçant simplement une limite supérieure sur les points de nombre pour examiner dans l'arbre, ou en interrompant le processus de recherche basé sur une horloge temps réel (qui peut être plus appropriée dans des réalisations de matériel). Le voisin le plus proche pour les points qui sont dans l'arbre déjà peut être réalisé en ne mettant pas à jour l'amélioration pour les noeuds qui donnent la distance zéro comme résultat.
Le voisin le plus proche approximatif est utile dans des applications en temps réel telles que la robotique due à la vitesse significative accrue gagnée en ne recherchant pas le meilleur point exhaustivement.
applications de d-arbre du k
Recherche orthogonale de gamme dans un d-arbre du k
Employer un d-arbre du k pour trouver tous les points qui se trouvent en dessous d'un rectangle indiqué (ou d'un hyperrectangle). Cette opération s'appelle également un la recherche orthogonale de gamme. Le contour d'algorithme est le suivant.question de la fonction (rectangle de r, noeud de kd-arbre de n) { axe de la variété : = n.axis ; médiane de la variété : = n.median ; si médian puis du ≥ r.low de question (r, n.left) ; Le saut de/* est parti si maximum de l'arbre gauche (médian) est hors de gamme * si médian puis du ≤ r.high de question (r, n.right) ; Droite de saut de/* si la minute de l'arbre droit (médian) est hors de gamme * si médian de dans le puis de r.interval rendement n.point de ; }
La question commence au noeud n de kd-arbre de étant la racine de l'arbre. Nous supposons que le hyperrectangle r est un choix d'intervalles répertoriés par axe.
Déterminant où évaluer une surface
Dans la régression locale , il est commun pour évaluer la surface allée directement seulement aux sommets d'un d-arbre du k et pour l'interpoler ailleurs. Cette utilisation, qui est décrite dans l'image ci-dessus, est de s'assurer que seulement autant d'évaluations directes sont exécutées comme sont nécessaire. Depuis le " de d-arbre du k ; adapts" ; soi-même à l'espace des variables de facteur prédictif, cette méthode peut fournir une excellente approximation à la véritable surface du loess . Si l'approximation est pauvre, elle peut être améliorée par davantage de subdivision du cel de l'arbre
Complexité
La construction d'un d-arbre statique du k des points du n prend du temps du O ( n de notation 2 de n ) si une sorte du O ( n de notation de n ) est employée pour calculer la médiane à chaque niveau. La complexité est le O ( n de notation de n ) si un algorithme de médian-conclusion du linéaire tel que celui décrit dans Cormen et autres est employé. insérant un nouveau point dans un d-arbre équilibré du k prend du temps d'O ( n de notation).
Enlever un point d'un d-arbre équilibré du k prend du temps d'O ( n de notation).
La question d'une gamme axe-parallèle dans un d-arbre équilibré du k prend du temps d'O (le n 1-1/d + k ), où k est le nombre de points rapportés, et d la dimension du d-arbre du k .
Variations
Au lieu des points
Au lieu des points, un d-arbre du k peut également contenir les rectangles ou les hyperrectangles. Un 2D rectangle est considéré un objet 4D (xlow, xhigh, ylow, yhigh). Ainsi la recherche de gamme devient le problème de renvoyer tous les rectangles intersectant le rectangle de recherche. L'arbre est construit la manière habituelle avec tous les rectangles aux feuilles. Dans une recherche orthogonale de gamme de , le vis-à-vis de la coordonnée de est employé en comparant contre la médiane. Par exemple, si le niveau actuel est dédoublé le long de xhigh, nous vérifions la coordonnée de xlow du rectangle de recherche. Si la médiane est moins que la coordonnée de xlow du rectangle de recherche, alors aucun rectangle dans la branche gauche ne peut jamais intersecter avec le rectangle de recherche et ainsi peut être taillé. Autrement les deux branches devraient être traversées. Voir également l'arbre d'intervalle de , qui est un cas spécial à une dimension.
Voir également
d-arbre implicite de '' k '' de minute de /d-arbre maximum de '' k ''
Octree
Hiérarchie de bondissement d'intervalle de
La recherche voisine la plus proche
Problème de la mesure de Klee de
libkdtree++, une ouvrir-source STL-comme l'exécution des d-arbres du k dans C++.
| Random links: | Nez-cueillette | Falaises de Moher | Le Conseil des ancients | Festival de Carneian | International d'IRCON | Kd-árbol |