Estructuras de datos y algoritmos

Tutorial de estructura de datos de montón

Tutorial de estructura de datos de montón
Los datos son un conjunto de valores. Los datos se pueden recopilar y colocar en una fila, en una columna, en una tabla o en forma de árbol. La estructura de los datos no es solo la ubicación de los datos en cualquiera de estos formularios. En informática, la estructura de datos es cualquiera de estos formatos, más la relación entre los valores, más las operaciones (funciones) que se realizan sobre los valores. Ya debe tener conocimientos básicos sobre la estructura de datos de árbol antes de venir aquí, ya que los conceptos allí se usarán aquí con poca o ninguna explicación. Si no tiene ese conocimiento, lea el tutorial titulado, Tutorial de estructura de datos de árbol para principiantes, en el enlace, https: // linuxhint.com / tree_data_structure_tutorial_beginners /. Después de eso, continúa leyendo este tutorial.Una estructura de datos de pila es un árbol binario completo o casi completo, donde el hijo de cada nodo es igual o menor en valor que el valor de su padre. Alternativamente, es un árbol donde el valor de un padre es igual o menor que el valor de cualquiera de sus hijos. El valor (dato) de un árbol también se llama clave.

Ilustración de estructuras de datos de montón

Hay dos tipos de montones: un montón máximo y un montón mínimo. Una estructura de montón máximo es donde el valor máximo es la raíz, y los valores se vuelven más pequeños a medida que desciende el árbol; cualquier padre tiene un valor igual o mayor que cualquiera de sus hijos inmediatos. Una estructura min-heap es donde el valor mínimo es la raíz y los valores aumentan a medida que desciende el árbol; cualquier padre es igual o menor en valor que cualquiera de sus hijos inmediatos. En los siguientes diagramas, el primero es un montón máximo y el segundo es un montón mínimo:

Para ambos montones, observe que para un par de niños, no importa si el de la izquierda es el valor más grande. Una fila en un nivel en el árbol, no debe necesariamente llenarse de mínimo a máximo, desde la izquierda; no necesariamente se llena de máximo a mínimo, desde la izquierda.

Representar un montón en una matriz

Para que el software utilice un montón fácilmente, el montón debe estar representado en una matriz. El montón máximo de arriba, representado en una matriz es:

89, 85, 87, 84, 82, 79, 73, 80, 81``, 65, 69

Esto se hace comenzando con el valor raíz como primer valor de la matriz. Los valores se colocan continuamente leyendo el árbol de izquierda a derecha, de arriba a abajo. Si un elemento está ausente, se omite su posición en la matriz. Cada nodo tiene dos hijos. Si un nodo está en el índice (posición) n, su primer hijo en la matriz está en el índice 2n + 1, y su siguiente hijo está en el índice 2n + 2. 89 está en el índice 0; su primer hijo, 85 está en el índice 2 (0) + 1 = 1 mientras que su segundo hijo está en el índice 2 (0) + 2 = 2. 85 está en el índice 1; su primer hijo, 84, está en el índice 2 (1) + 1 = 3 mientras que su segundo hijo, 82 está en el índice 2 (1) + 2 = 4. 79 está en el índice 5; su primer hijo, 65 está en el índice 2 (5) + 1 = 11 mientras que su segundo hijo está en el índice 2 (5) + 2 = 12. Las fórmulas se aplican al resto de elementos de la matriz.

Una matriz de este tipo, donde el significado de un elemento y la relación entre los elementos está implícita en la posición del elemento, se denomina Estructura de datos implícita.

La estructura de datos implícita para el min-heap anterior es:

65, 68, 70, 73, 71, 83, 84,, 79, 80,, 85, 89

El max-heap anterior es un árbol binario completo pero no un árbol binario completo. Es por eso que algunas ubicaciones (posiciones) están vacías en la matriz. Para un árbol binario completo, ninguna ubicación estará vacía en la matriz.

Ahora, si el montón fuera un árbol casi completo, por ejemplo, si faltara el valor 82, entonces la matriz sería:

89, 85, 87, 84, 79, 73, 80, 81,, 65, 69

En esta situación, tres ubicaciones están vacías. Sin embargo, las fórmulas siguen siendo aplicables.

Operaciones

Una estructura de datos es un formato de datos (p.gramo. un árbol), más la relación entre los valores, más las operaciones (funciones) que se realizan sobre los valores. Para un montón, la relación que atraviesa todo el montón es que el padre debe tener un valor igual o mayor que los hijos, para un montón máximo; y el padre debe tener un valor igual o inferior al de los hijos, para un min-heap. Esta relación se llama propiedad del montón. Las operaciones de un montón se agrupan bajo los títulos de Creación, Básico, Interno e Inspección. A continuación, se muestra un resumen de las operaciones del montón:

Resumen de operaciones de montón

Hay ciertas operaciones de software que son comunes con los montones, como se indica a continuación:

Creación de un montón

create_heap: Crear un montón significa formar un objeto que representa el montón. En el lenguaje C, puede crear un montón con el tipo de objeto struct. Uno de los miembros de la estructura será la matriz de pila. El resto de los miembros serán funciones (operaciones) para el montón. Create_heap significa crear un montón vacío.

Heapify: la matriz de pila es una matriz parcialmente ordenada (ordenada). Heapify significa, proporcionar una matriz de pila de una matriz sin clasificar; consulte los detalles a continuación.

Fusionar: esto significa, formar un montón de unión a partir de dos montones diferentes; consulte los detalles a continuación. Los dos montones deben ser max-heap o ambos min-heap. El nuevo montón está en conformidad con la propiedad del montón, mientras que los montones originales se conservan (no se borran).

Fusionar: esto significa, une dos montones del mismo tipo para formar uno nuevo, manteniendo duplicados; consulta los detalles a continuación. El nuevo montón está en conformidad con la propiedad del montón, mientras que los montones originales se destruyen (borran). La principal diferencia entre fusionar y fusionar es que, para fusionar, un árbol se ajusta como subárbol a la raíz del otro árbol, lo que permite valores duplicados en el nuevo árbol, mientras que para fusionar, se forma un nuevo árbol de montón, eliminando duplicados. No es necesario mantener los dos montones originales con fusión.

Operaciones de montón básicas

find_max (find_min): busque el valor máximo en la matriz max-heap y devuelva una copia, o busque el valor mínimo en la matriz min-heap y devuelva una copia.

Insertar: agregue un nuevo elemento a la matriz de montón y reorganice la matriz para que se mantenga la propiedad de pila del diagrama.

extract_max (extract_min): Localice el valor máximo en la matriz max-heap, elimínelo y devuélvalo; o localice el valor mínimo en la matriz min-heap, elimínelo y devuélvalo.

delete_max (delete_min): Localice el nodo raíz de un max-heap, que es el primer elemento de la matriz max-heap, elimínelo sin necesariamente devolverlo; o localice el nodo raíz de un min-heap, que es el primer elemento de la matriz min-heap, elimínelo sin devolverlo necesariamente;

Reemplazar: localice el nodo raíz de cualquier montón, elimínelo y reemplácelo por uno nuevo. No importa si se devuelve la raíz anterior.

Operaciones de montón interno

aumentar_clave (disminución_clave): aumente el valor de cualquier nodo para un montón máximo y reorganice para que se mantenga la propiedad del montón, o disminuya el valor de cualquier nodo para un montón mínimo y reorganice para que se mantenga la propiedad del montón.

Eliminar: elimine cualquier nodo, luego reorganice, de modo que la propiedad del montón se mantenga para max-heap o min-heap.

shift_up: mueve un nodo hacia arriba en max-heap o min-heap tanto tiempo como sea necesario, reorganizándolo para mantener la propiedad del montón.

shift_down: mueve un nodo hacia abajo en un montón máximo o un montón mínimo todo el tiempo que sea necesario, reorganizándolo para mantener la propiedad del montón.

Inspección de un montón

Tamaño: Esto devuelve el número de claves (valores) en un montón; no incluye las ubicaciones vacías de la matriz de pila. Un montón se puede representar mediante código, como en el diagrama, o con una matriz.

esta vacio: Esto devuelve booleano verdadero si no hay ningún nodo en un montón, o booleano falso si el montón tiene al menos un nodo.

Tamizar en un montón

Hay tamizado y tamizado:

Tamizado: Esto significa intercambiar un nodo con su padre. Si no se satisface la propiedad del montón, intercambie el padre con su propio padre. Continúe de esta manera en la ruta hasta que se satisfaga la propiedad del montón. El procedimiento puede llegar a la raíz.

Tamizar hacia abajo: Esto significa intercambiar un nodo de gran valor con el más pequeño de sus dos hijos (o un hijo por un montón casi completo). Si no se satisface la propiedad del montón, intercambie el nodo inferior con el nodo más pequeño de sus propios dos hijos. Continúe de esta manera en la ruta hasta que se satisfaga la propiedad del montón. El procedimiento puede llegar a una hoja.

Amontonando

Heapify significa ordenar una matriz no ordenada para que la propiedad heap se satisfaga para max-heap o min-heap. Esto significa que puede haber algunas ubicaciones vacías en la nueva matriz. El algoritmo básico para acumular un montón máximo o un montón mínimo es el siguiente:

- si el nodo raíz es más extremo que cualquiera de los nodos de su hijo, entonces intercambie la raíz con el nodo hijo menos extremo.

- Repita este paso con los nodos secundarios en un esquema de desplazamiento de árbol de pedido anticipado.

El árbol final es un árbol de montón que satisface la propiedad de montón. Un montón se puede representar como un diagrama de árbol o en una matriz. El montón resultante es un árbol parcialmente ordenado, yo.mi. una matriz parcialmente ordenada.

Detalles de la operación de pila

Esta sección del artículo proporciona los detalles de las operaciones del montón.

Creación de un montón de detalles

create_heap

Véase más arriba!

amontonar

Véase más arriba

unir

Si las matrices del montón,

89, 85, 87, 84, 82, 79, 73, 80, 81``, 65, 69

y

89, 85, 84, 73, 79, 80, 83, 65, 68, 70, 71

se fusionan, el resultado sin duplicados puede ser,

89, 85, 87, 84, 82, 83, 81, 80, 79, 73, 68, 65, 69, 70, 71

Después de un poco de tamizado. Observe que en la primera matriz, 82 no tiene hijos. En la matriz resultante, está en el índice 4; y sus ubicaciones en el índice 2 (4) + 1 = 9 y 2 (4) + 2 = 10 están vacantes. Esto significa que tampoco tiene hijos en el nuevo diagrama de árbol. Los dos montones originales no deben eliminarse ya que su información no está realmente en el nuevo montón (nueva matriz). El algoritmo básico para fusionar montones del mismo tipo es el siguiente:

- Une una matriz a la parte inferior de la otra matriz.

- Heapify está eliminando duplicados, asegurándose de que los nodos que no tenían hijos en los montones originales, todavía no tengan hijos en el nuevo montón.

fusionar

El algoritmo para fusionar dos montones del mismo tipo (ya sea dos max- o dos min-) es el siguiente:

- Compara los dos nodos raíz.

- Haga la raíz menos extrema y el resto de su árbol (subárbol), el segundo hijo de la raíz extrema.

- Tamizar al niño perdido de la raíz del ahora subárbol extremo, hacia abajo en el subárbol extremo.

El montón resultante sigue estando en conformidad con la propiedad del montón, mientras que los montones originales se destruyen (borran). Los montones originales se pueden destruir porque toda la información que poseían todavía está en el nuevo montón.

Operaciones de montón básicas

find_max (find_min)

Esto significa ubicar el valor máximo en la matriz max-heap y devolver una copia, o ubicar el valor mínimo en la matriz min-heap y devolver una copia. Una matriz de montón por definición ya satisface la propiedad de montón. Entonces, solo devuelva una copia del primer elemento de la matriz.

insertar

Esto significa agregar un nuevo elemento a la matriz de pila y reorganizar la matriz para que la propiedad de pila del diagrama se mantenga (satisfaga). El algoritmo para hacer esto para ambos tipos de montones es el siguiente:

- Suponga un árbol binario completo. Esto significa que la matriz debe llenarse al final con ubicaciones vacías si es necesario. El número total de nodos de un montón completo es 1, 3, 7, 15 o 31, etc.; sigue duplicando y sumando 1.

- Coloque el nodo en la ubicación vacía más adecuada por magnitud, hacia el final del montón (hacia el final de la matriz del montón). Si no hay una ubicación vacía, comience una nueva fila desde la parte inferior izquierda.

- Tamizar si es necesario, hasta que se satisfaga la propiedad del montón.

extract_max (extract_min)

Busque el valor máximo en la matriz max-heap, elimínelo y devuélvalo; o localice el valor mínimo en la matriz min-heap, elimínelo y devuélvalo. El algoritmo para extract_max (extract_min) es el siguiente:

- Eliminar el nodo raíz.

- Tome (elimine) el nodo inferior a la derecha (último nodo de la matriz) y colóquelo en la raíz.

- Tamizar según corresponda, hasta que se satisfaga la propiedad del montón.

delete_max (delete_min)

Localice el nodo raíz de un max-heap, que es el primer elemento de la matriz max-heap, elimínelo sin devolverlo necesariamente; o ubique el nodo raíz de un min-heap, que es el primer elemento de la matriz min-heap, elimínelo sin necesariamente devolverlo. El algoritmo para eliminar el nodo raíz es el siguiente:

- Eliminar el nodo raíz.

- Tome (elimine) el nodo inferior a la derecha (último nodo de la matriz) y colóquelo en la raíz.

- Tamizar según corresponda, hasta que se satisfaga la propiedad del montón.

reemplazar

Localice el nodo raíz de cualquier montón, elimínelo y reemplácelo con el nuevo. No importa si se devuelve la raíz anterior. Tamizar si es apropiado, hasta que se satisfaga la propiedad del montón.

Operaciones de montón interno

aumentar_clave (disminución_clave)

Aumente el valor de cualquier nodo para un montón máximo y reorganice para que se mantenga la propiedad del montón, o disminuya el valor de cualquier nodo para un montón mínimo y reorganice para que se mantenga la propiedad del montón. Tamizar hacia arriba o hacia abajo según corresponda, hasta que se satisfaga la propiedad del montón.

Eliminar

Elimine el nodo de interés, luego reorganice, de modo que la propiedad del montón se mantenga para max-heap o min-heap. El algoritmo para eliminar un nodo es el siguiente:

- Eliminar el nodo de interés.

- Tome (elimine) el nodo de la parte inferior derecha (último nodo de la matriz) y colóquelo en el índice del nodo eliminado. Si el nodo eliminado está en la última fila, es posible que esto no sea necesario.

- Tamizar hacia arriba o hacia abajo según corresponda, hasta que se satisfaga la propiedad del montón.

shift_up

Mueva un nodo hacia arriba en un montón máximo o un montón mínimo todo el tiempo que sea necesario, reorganizándolo para mantener la propiedad del montón - tamizar.

shift_down

Mueva un nodo hacia abajo en un montón máximo o un montón mínimo todo el tiempo que sea necesario, reorganizándolo para mantener la propiedad del montón - tamizar hacia abajo.

Inspección de un montón

Talla

Véase más arriba!

esta vacio

Véase más arriba!

Otras clases de montones

El montón descrito en este artículo se puede considerar como el montón principal (general). Hay otras clases de montones. Sin embargo, los dos que debe conocer más allá de esto son el montón binario y el montón d-ary.

Montón binario

El montón binario es similar a este montón principal, pero con más restricciones. En particular, el montón binario debe ser un árbol completo. No confunda entre un árbol completo y un árbol completo.

montón d-ary

Un montón binario es un montón de 2 arios. Un montón donde cada nodo tiene 3 hijos es un montón de 3 arios. Un montón donde cada nodo tiene 4 hijos es un montón de 4 arios, y así sucesivamente. Un montón d-ary tiene otras limitaciones.

Conclusión

Un montón es un árbol binario completo o casi completo, que satisface la propiedad del montón. La propiedad del montón tiene 2 alternativas: para un montón máximo, un padre debe tener un valor igual o mayor que los hijos inmediatos; para un min-heap, un padre debe tener un valor igual o menor que los hijos inmediatos. Un montón se puede representar como un árbol o en una matriz. Cuando se representa en una matriz, el nodo raíz es el primer nodo de la matriz; y si un nodo está en el índice n, su primer hijo en la matriz está en el índice 2n + 1 y su siguiente hijo está en el índice 2n + 2. Un montón tiene ciertas operaciones que se realizan en la matriz.

Chrys

Los 5 mejores productos ergonómicos de mouse de computadora para Linux
¿El uso prolongado de la computadora causa dolor en la muñeca o los dedos?? ¿Sufre de rigidez en las articulaciones y constantemente tiene que dar la ...
Cómo cambiar la configuración del mouse y el panel táctil con Xinput en Linux
La mayoría de las distribuciones de Linux se envían con la biblioteca "libinput" de forma predeterminada para manejar eventos de entrada en un sistema...
Vuelva a asignar los botones del mouse de manera diferente para diferentes programas con X-Mouse Button Control
Tal vez necesite una herramienta que pueda hacer que el control de su mouse cambie con cada aplicación que use. Si este es el caso, puede probar una a...