Montón (estructura de datos)

Compartir Imprimir Citar
Estructura de datos de ciencias informáticas
Ejemplo de un max-heap binario con teclas de nodo siendo enteros entre 1 y 100

En informática, un montón es una estructura de datos basada en un árbol especializado que es esencialmente un árbol casi completo que satisface la propiedad del montón: en un max heap, para cualquier nodo C dado, si P es un nodo principal de C, entonces la clave (el valor) de P es mayor o igual que la clave de C. En un min heap, la clave de P es menor o igual que la clave de C. El nodo en el "superior" del montón (sin padres) se denomina nodo raíz.

El montón es una implementación de máxima eficiencia de un tipo de datos abstractos llamado cola de prioridad y, de hecho, las colas de prioridad a menudo se denominan "montones", independientemente de cómo se implementen. En un montón, el elemento de prioridad más alta (o más baja) siempre se almacena en la raíz. Sin embargo, un montón no es una estructura ordenada; puede considerarse como parcialmente ordenado. Un montón es una estructura de datos útil cuando es necesario eliminar repetidamente el objeto con la prioridad más alta (o más baja), o cuando las inserciones deben intercalarse con las eliminaciones del nodo raíz.

Una implementación común de un montón es el montón binario, en el que el árbol es un árbol binario (ver figura). La estructura de datos del montón, específicamente el montón binario, fue introducida por J. W. J. Williams en 1964, como una estructura de datos para el algoritmo de clasificación heapsort. Los montones también son cruciales en varios algoritmos de gráficos eficientes, como el algoritmo de Dijkstra. Cuando un montón es un árbol binario completo, tiene la altura más pequeña posible: un montón con N nodos y a ramas para cada nodo siempre tiene log una N altura.

Tenga en cuenta que, como se muestra en el gráfico, no hay un orden implícito entre hermanos o primos ni una secuencia implícita para un recorrido en orden (como lo habría, por ejemplo, en un árbol de búsqueda binaria). La relación de montón mencionada anteriormente se aplica solo entre los nodos y sus padres, abuelos, etc. El número máximo de hijos que puede tener cada nodo depende del tipo de montón.

Operaciones

Las operaciones comunes que involucran montones son:

Básico
Creación
Inspección
Internos

Implementación

Los montones generalmente se implementan con una matriz, de la siguiente manera:

Ejemplo de un max-heap binario completo con teclas de nodo siendo enteros de 1 a 100 y cómo se almacenaría en un array.

Para un montón binario, en el array, el primer índice contiene el elemento raíz. Los siguientes dos índices de la matriz contienen los hijos de la raíz. Los siguientes cuatro índices contienen los cuatro hijos de los dos nudos de la raíz, y así sucesivamente. Por lo tanto, dado un nodo en el índice i, sus hijos están en índices 2i+1{displaystyle 2i+1} y 2i+2{displaystyle 2i+2}, y su padre está en el índice i−1)/2. Este esquema de indexación simple hace que sea eficiente para mover "up" o "down" el árbol.

El equilibrio de un montón se realiza mediante operaciones de cribado ascendente o descendente (intercambio de elementos que están fuera de servicio). Como podemos construir un montón a partir de una matriz sin requerir memoria adicional (para los nodos, por ejemplo), se puede usar heapsort para ordenar una matriz en el lugar.

Después de insertar o eliminar un elemento de un montón, la propiedad del montón puede violarse y el montón debe reequilibrarse intercambiando elementos dentro de la matriz.

Aunque los diferentes tipos de montones implementan las operaciones de manera diferente, la forma más común es la siguiente:

La construcción de un montón binario (o d-ario) a partir de una matriz dada de elementos se puede realizar en tiempo lineal usando el clásico algoritmo de Floyd, con el número de comparaciones en el peor de los casos igual a 2N − 2s2(N) − e2 (N) (para un montón binario), donde s2(N) es el la suma de todos los dígitos de la representación binaria de N y e2(N) es el exponente de 2 en la descomposición en factores primos de N. Esto es más rápido que una secuencia de inserciones consecutivas en un montón originalmente vacío, que es logarítmicamente lineal.

Variantes

  • 2-3 montones
  • B-heap
  • Beap
  • Salto binario
  • Salto binomio
  • Oficina de redacción
  • d-ary heap
  • Fibonacci heap
  • K-D Heap
  • Leaf heap
  • Salto de izquierda
  • Salto de pareja
  • Salto de radiación
  • Salto soldable aleatorio
  • Skew Heap
  • Jabón suave
  • Ternario
  • Treap
  • Montón débil

Comparación de límites teóricos para variantes

Estas son las complejidades de tiempo de varias estructuras de datos de almacenamiento dinámico. Los nombres de funciones asumen un montón máximo. Para el significado de "O(f)" y "Θ(f)" ver notación Big O.

Operación encontrar-max delete-max insertar aumento de la llave sold
binario .1) .(logn) O(logn) O(logn) .()n)
Izquierda .1) .(log n) .(log n) O(log n) .(log n)
Binomial .1) .(log n) .1) .(log n) O(logn)
Fibonacci .1) O(logn) .1) .1) .1)
Pareja .1) O(log n) .1) o(logn) .1)
Brodal .1) O(logn) .1) .1) .1)
Rank-pairing .1) O(log n) .1) .1) .1)
Fibonacci estricta .1) O(log n) .1) .1) .1)
2-3 montones O(log n) O(log n) O(log n) .1) ?
  1. ^ Cada inserción toma O(log)k) en el tamaño existente del montón, por lo tanto .. k=1nO()log⁡ ⁡ k){displaystyle sum _{k=1}{n}O(log k)}. Desde log⁡ ⁡ n/2=()log⁡ ⁡ n)− − 1{displaystyle log n/2=(log n)-1}, un factor constante (la mitad) de estas inserciones están dentro de un factor constante del máximo, por lo que asintomáticamente podemos asumir k=n{displaystyle k=n}; formalmente el tiempo es nO()log⁡ ⁡ n)− − O()n)=O()nlog⁡ ⁡ n){displaystyle nO(log n)-O(n)=O(nlog n)}. Esto también se puede ver fácilmente desde la aproximación de Stirling.
  2. ^ a b c d e f g h i Tiempo amortizado.
  3. ^ n es el tamaño del montón más grande.
  4. ^ Límite inferior de Ω Ω ()log⁡ ⁡ log⁡ ⁡ n),{displaystyle Omega (log log n),} límite superior O()22log⁡ ⁡ log⁡ ⁡ n).{displaystyle O(2^{2{sqrt {log log n}}}}
  5. ^ Brodal y Okasaki describen más adelante una variante persistente con los mismos límites excepto la tecla de reducción, que no es compatible. Saltos con n elementos pueden ser construidos en el fondo O()n).

Aplicaciones

La estructura de datos del montón tiene muchas aplicaciones.

Implementaciones de lenguajes de programación