Un ejemplo de un árbol m-ary con m = 5
En la teoría de grafos , un árbol m -ary (también conocido como árbol k -ary o k -way ) es un árbol enraizado en el que cada nodo no tiene más de m hijos. Un árbol binario es el caso especial donde m = 2 , y un árbol ternario es otro caso con m = 3 que limita sus hijos a tres.
Tipos de m árboles ary [ editar ]
- Un completo m árbol ary es una m árbol ary donde dentro de cada nivel de cada nodo tiene 0 o m niños.
- Una completa m árbol ary es una m árbol ary que es máximamente eficiente del espacio. Debe estar completamente lleno en todos los niveles, excepto en el último nivel. Sin embargo, si el último nivel no está completo, todos los nodos del árbol deben estar "lo más a la izquierda posible". [1]
- Una perfecta m árbol ary es un completo [1] m árbol ary en el que todos los nodos hoja son a la misma profundidad. [2]
Propiedades de m árboles ary [ editar ]
- Para una m árbol ary con la altura h , el límite superior para el número máximo de hojas es.
- La altura h de un árbol m -ary no incluye el nodo raíz, con un árbol que contiene solo un nodo raíz que tiene una altura de 0.
- La altura de un árbol es igual a la profundidad máxima D de cualquier nodo en el árbol.
- El número total de nodos. en una perfecta m árbol ary es, mientras que la altura h es
-
- Por la definición de Big-Ω, la profundidad máxima
- La altura de una completa m árbol ary con n nodos es.
- El número total de posibles m árbol ary con n nodos es (que es un número catalán ) [3] .
Métodos de recorrido para árboles arábigos [ editar ]
Recorrido de una m árbol ary es muy similar al recorrido de árbol binario. El recorrido de preorden va al padre, el subárbol izquierdo y el subárbol derecho, y para atravesar el orden posterior va por el subárbol izquierdo, el subárbol derecho y el nodo padre. Para recorrer en orden, dado que hay más de dos hijos por nodo para m> 2 , uno debe definir la noción de subárboles izquierdo y derecho . Un método común para establecer subárboles izquierdo / derecho es dividir la lista de nodos secundarios en dos grupos. Al definir un orden en los m hijos de un nodo, el primero los nodos constituirían el subárbol izquierdo y los nodos constituirían el subárbol correcto.
Convertir un m árbol ary al árbol binario [ editar ]
Un ejemplo de conversión de un árbol m-ary a un árbol binario. m = 6
El uso de una matriz para representar un m- árbol ary es ineficiente, porque la mayoría de los nodos en aplicaciones prácticas contienen menos de m niños. Como resultado, este hecho conduce a una matriz dispersa con un gran espacio no utilizado en la memoria. La conversión de una arbitraria m- árbol ary a un árbol binario sólo aumentaría la altura del árbol por un factor constante y no afectaría el tiempo total en el peor caso. En otras palabras, ya que .
Primero, vinculamos todos los nodos hijos inmediatos de un nodo padre dado para formar una lista de enlaces. Luego, mantenemos el enlace del padre al primer hijo (es decir, el que está más a la izquierda) y eliminamos todos los demás enlaces al resto de los hijos. Repetimos este proceso para todos los hijos (si tienen hijos) hasta que hayamos procesado todos los nodos internos y rotamos el árbol 45 grados en el sentido de las agujas del reloj. El árbol obtenido es el árbol binario deseado obtenido a partir de lo dado m árbol ary.
Métodos para almacenar m árboles ary [ editar ]
Matrices [ editar ]
Un ejemplo de almacenamiento de un árbol m-ary con m = 3 en una matriz
m árboles ary también se pueden almacenar con el fin en amplitud como una estructura de datos implícito en las matrices , y si el árbol es una completa m árbol ary, este método no pierde el espacio. En esta disposición compacta, si un nodo tiene un índice i , su c -ésimo hijo en el rango {1, ..., m } se encuentra en el índice, mientras que su padre (si lo hay) se encuentra en el índice (suponiendo que la raíz tiene índice cero, lo que significa una matriz basada en 0). Este método se beneficia de un almacenamiento más compacto y una mejor localidad de referencia , particularmente durante un recorrido previo al pedido. La complejidad espacial de este método es.
Basado en puntero [ editar ]
Cada nodo tendría una matriz interna para almacenar punteros en cada uno de sus childeren
Implementación basada en puntero del árbol m-ary donde m = 4.
En comparación con la implementación basada en matriz, este método de implementación tiene una complejidad espacial superior de .
La enumeración de m- árboles ary [ editar ]
Listado de todos los posibles m árboles ary son útiles en muchas disciplinas, como una manera de comprobar hipótesis o teorías. Una representación adecuada de m- objetos de árbol ary puede simplificar en gran medida el proceso de generación. Uno puede construir una representación secuencia de bits utilizando la búsqueda en profundidad de un m árbol ary con n nodos indican la presencia de un nodo en un índice dado usando valores binarios. Por ejemplo, la secuencia de bits x = 1110000100010001000 representa un árbol de 3 arios con n = 6 nodos como se muestra a continuación.
El problema con esta representación es que enumerar todas las cadenas de bits en orden lexicográfico significaría que dos cadenas sucesivas podrían representar dos árboles que son lexicográficamente muy diferentes. Por lo tanto, la enumeración sobre cadenas binarias no daría lugar necesariamente a una generación ordenada de todos los m- árboles ary [4] . Una mejor representación se basa en una cadena de enteros que indica el número de ceros entre sucesivos, conocido como Secuencia de cero simple . es una secuencia cero simple que corresponde a la secuencia de bits donde j es el número de ceros necesarios al final de la secuencia para hacer que la cadena tenga la longitud adecuada. Por ejemplo,es la representación de secuencia cero simple de la figura anterior. Una representación más compacta de 00433 es, que se llama secuencia cero , cuyas bases duplicadas no pueden ser adyacentes. Esta nueva representación permite construir una siguiente secuencia válida en. Una secuencia cero simple es válida si
, Es decir que el número de ceros en la secuencia de bits de un m árbol ary no puede exceder el número total de punteros nulos (es decir, punteros sin ningún nodo hijo unido a ellos). Este resumen está restringiendo nodos para que haya espacio para agregar el sin crear una extracción no válida (es decir, tener un puntero nulo disponible para adjuntarle el último nodo).
La tabla a continuación muestra la lista de todas las secuencias cero simples válidas de todos los 3 árboles con 4 nodos:
Comenzando desde la parte inferior derecha de la tabla (es decir, "000"), hay una plantilla de red troncal que rige la generación de los posibles árboles ordenados a partir de "000" a "006". La plantilla de red troncal para este grupo ("00X") se muestra a continuación, donde se agrega un nodo adicional en las posiciones etiquetadas como "x".
Una vez que uno ha agotado todas las posiciones posibles en la plantilla de red troncal, se construirá una nueva plantilla desplazando el tercer nodo una posición a la derecha como se muestra a continuación, y la misma enumeración ocurriría hasta que se agoten todas las posiciones posibles etiquetadas con "X".
Volviendo a la tabla de enumeración de todos los m árboles ary, donde y , podemos observar fácilmente que el salto aparente de "006" a "010" puede explicarse trivialmente de manera algorítmica como se muestra a continuación:
El pseudocódigo para esta enumeración se proporciona a continuación [4] :
Procedimiento SIGUIENTE ()
si por todo lo que entonces
terminado
más
si yo entonces
terminar si
para
fin si
fin
Enumeración sin bucle [ editar ]
Un algoritmo de generación que toma el peor de los casos se llama loopless ya que la complejidad del tiempo no puede involucrar un loop o recursividad. Enumeración Loopless de m- árboles ary se dice que es loopless si después de la inicialización, se genera objetos de árbol en sucesivas. Para un determinado una m- árbol ary T con siendo uno de sus nodos y sus niño, una rotación izquierda-t en se hace haciendo el nodo raíz, y haciendo y todos sus subárboles son hijos de , adicionalmente asignamos el dejó la mayoría de los niños de a y el hijo más adecuado de permanece unido a él mientras se promociona a root, como se muestra a continuación:
Convierta un árbol m-ary en árbol izquierdo
para:
para :
mientras t hijo del nodo en profundidad :
Lt reotación en nodos a profundidad i
terminar mientras
fin de
fin de
Una rotación derecha-t en d es la inversa de esta operación. La cadena izquierda de T es una secuencia de nodos tales que es la raíz y todos los nodos excepto tener un niño conectado a su izquierda más (es decir, ) puntero. Cualquier m- árbol ary puede ser transformado a una cadena izquierda árbol usando secuencia de finitos izquierda-t rotaciones para t de 2 a m . Específicamente, esto se puede hacer realizando rotaciones t-izquierda en cada nodo hasta que todo su el subárbol se vuelve nulo en cada profundidad. Luego, la secuencia del número de rotaciones a la izquierda-t realizadas a profundidad i se denota pordefine una palabra de código de un m- árbol ary que pueden ser recuperados mediante la realización de la misma secuencia de derecha-t rotaciones.
Deja el tupla de representan el número de rotaciones L-2 , rotaciones L-3 , ..., rotaciones Lm que se han producido en la raíz (es decir, i = 1).es el número de rotaciones de Lt requeridas a profundidad i .
La captura de cargos de rotaciones a la izquierda en cada profundidad es una forma de codificar un m árbol ary. Por lo tanto, la enumeración de todos los posibles codificación legal sería nos ayuda a generar todos los m árboles ary para un determinado m y n . Pero no todosLas secuencias de m enteros no negativos representan un árbol m-ario válido. Una secuencia deenteros no negativos es una representación válida de un m- árbol ary si y sólo si [5]
La representación de palabras de código lexicográficamente más pequeña de un m-ario con n nodos es todo ceros y el más grande es n-1 seguido de m-1 cero a su derecha.
Inicialización
c [i] a cero para todo i de 1 a
p [i] establecido en para i de 1 a n
Condición de terminación
Terminar cuando c [1] = n-1
Procedimiento SIGUIENTE [5]
Si luego
terminara si
Si luego
más
fin si
fin
Solicitud [ editar ]
Una de las aplicaciones de m -ary tree es crear un diccionario para la validación de cadenas aceptables. Para hacer eso, que m sea igual al número de alfabetos válidos (por ejemplo, número de letras del alfabeto inglés ) con la raíz del árbol que representa el punto de partida. Del mismo modo, cada uno de los niños puede tener hasta mhijos que representan el siguiente personaje posible en la cadena. Por lo tanto, los caracteres a lo largo de las rutas pueden representar claves válidas marcando el carácter final de las claves como "nodo terminal". Por ejemplo, en el ejemplo a continuación, "at" y "y" son cadenas de teclas válidas con "t" y "d" marcadas como nodos terminales. Los nodos terminales pueden almacenar información adicional para asociarla con una clave determinada. Hay formas similares de construir dicho diccionario usando B-tree , Octree y / o trie .
No hay comentarios:
Publicar un comentario