Montón (estructura de datos)


En informática , un montón es una estructura de datos especializada del tipo de árbol que satisface la propiedad del montón : si B es un nodo hijo del nodo A , entonces clave( A ) ≥ clave( B ). De ello se deduce que el elemento con la clave más grande es siempre el nodo raíz del montón, por lo que a veces estos montones se denominan montones máximos (alternativamente, si se invierte la comparación, el elemento más pequeño siempre será el nodo raíz, tales montones se denominan min-montones ). No existe ninguna restricción sobre cuántos nodos secundarios tiene cada nodo del montón, aunque en la práctica este número no suele ser más de dos. El montón es la implementación más eficiente de un tipo de datos abstracto llamado cola de prioridad . Los montones son cruciales en algunos algoritmos gráficos eficientes , como el algoritmo de Dijkstra en d-heaps y heapsort .  

La estructura de datos del montón no debe confundirse con el concepto de montón en la asignación de memoria dinámica . El término se utilizó por primera vez específicamente para estructuras de datos. Algunos de los primeros lenguajes de programación populares, como LISP , proporcionaron una asignación de memoria dinámica utilizando la estructura de datos "montón", que dio su nombre a la cantidad de memoria asignada. [1] .

Los montones generalmente se implementan como matrices, lo que elimina la necesidad de punteros entre sus elementos.

Las siguientes operaciones generalmente se realizan en montones:

Opciones

Comparación de estimaciones teóricas de variantes

A continuación, se muestran estimaciones de la complejidad temporal de los cálculos para operaciones en ciertos tipos de montones. [1] Cuando un valor está marcado con un asterisco, la estimación se basa en el análisis de amortización (peor momento), de lo contrario, la estimación es el peor caso normal. O(F) da un límite superior asintótico, y Θ(F) es una estimación asintóticamente exacta (consulte la notación "O" grande y "o" pequeña ). Los nombres de operación se eligen para el montón mínimo.

(*) Tiempo de amortización
(**) Donde n es el tamaño del montón más grande

Tenga en cuenta que la "cola de Brodal" es una implementación de una cola de prioridad paralela desarrollada por un grupo dirigido por Gert Brodal. [3]

Aplicación

Las estructuras de datos de montón tienen muchos usos.

Un montón binario completo y casi completo se puede representar de una manera muy eficiente utilizando una matriz de índices . El primer (o último) elemento contendrá la raíz. Los siguientes dos elementos de la matriz contienen los nodos secundarios de la raíz. Los siguientes cuatro elementos contienen cuatro hijos de dos nodos que son hijos de la raíz, y así sucesivamente, por lo tanto, los hijos del nodo de nivel nse ubicarán en posiciones 2ny 2n+1para una matriz indexada desde uno, o en posiciones 2n+1y 2n+2para una matriz indexada desde cero Esto le permite moverse hacia arriba o hacia abajo en el árbol haciendo simples cálculos de índice de matriz. El equilibrio del montón se realiza reorganizando los elementos que están desordenados. Dado que podemos construir un montón usando una matriz sin memoria adicional (para nodos, por ejemplo), podemos usar heapsort para ordenar la matriz en su lugar.

Implementaciones

Véase también

Notas

  1. 1 2 3 Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest (1990): Introducción a los algoritmos. MIT Press/McGraw-Hill.
  2. Iacono, John (2000), Límites superiores mejorados para emparejar montones , Proc. Séptimo taller escandinavo sobre teoría de algoritmos , vol. 1851, Lecture Notes in Computer Science, Springer-Verlag, p. 63–77 , DOI 10.1007/3-540-44985-X_5 
  3. A Parallel Priority Queue with Constant Time Operations , < http://www.ceid.upatras.gr/faculty/zaro/pub/jou/J9-JPDC-pq.pdf > Archivado el 26 de julio de 2011 en Wayback Machine . 
  4. Frederickson, Greg N. (1993), Un algoritmo óptimo para la selección en un montón mínimo , Información y computación , vol. 104, Prensa Académica, pág. 197–214, doi : 10.1006/inco.1993.1030 , < http://ftp.cs.purdue.edu/research/technical_reports/1991/TR%2091-027.pdf > Archivado el 3 de diciembre de 2012 en Wayback Machine . 
  5. Montón de Pythonq . Consultado el 31 de mayo de 2011. Archivado desde el original el 18 de octubre de 2012.
  6. Montón de Perl