En lugar de usar una matriz y ordenar elementos de mayor a menor, ¿cómo puedo usar un montón?

Montón

Heap es una estructura de datos que se usa específicamente para acceder al valor mínimo o máximo en el tiempo O (1) mientras que su tiempo de inserción o eliminación es O (log (n).

Montón mínimo

Max heap

Pero el truco está aquí, tiene que usar una matriz para almacenar el montón.

Entonces accederá a Array [0] para mínimo o máximo

Implementación

Sea n el número de elementos en el montón y yo sea ​​un índice válido arbitrario de la matriz que almacena el montón. Si la raíz del árbol está en el índice 0, con índices válidos de 0 a n – 1, entonces cada elemento a en el índice i tiene

  • niños en los índices 2 i + 1 y 2 i + 2
  • su padre en el piso índice (( i – 1) ∕ 2).

Alternativamente, si la raíz del árbol está en el índice 1, con índices válidos del 1 al n , entonces cada elemento a en el índice i tiene

  • niños en los índices 2 i y 2 i +1
  • su padre en el piso índice ( i ∕ 2).

Algoritmo de inserción

Ahora, expresemos un algoritmo general para insertar un nuevo elemento en un montón.

  1. Agregue un nuevo elemento al final de una matriz;
  2. Tamice el nuevo elemento, mientras que la propiedad de montón está rota. El tamizado se realiza de la siguiente manera: compare el valor del nodo con el valor principal. Si están en el orden incorrecto, cámbielos.

Algoritmo de eliminación

  1. Copie el último valor en la matriz a la raíz;
  2. Disminuya el tamaño del montón en 1;
  3. Tamizar el valor de la raíz. El cribado se realiza de la siguiente manera: si el nodo actual no tiene hijos, el cribado ha terminado; si el nodo actual tiene un hijo: verifique, si la propiedad del montón está rota, luego intercambie el valor del nodo actual y el valor hijo; tamizar hacia abajo el niño; si el nodo actual tiene dos hijos: encuentre el más pequeño de ellos. Si la propiedad del montón está rota, entonces intercambie el valor del nodo actual y el valor secundario seleccionado; tamizar al niño.

Explicación teórica completa Montón binario – Wikipedia

Implementación Básica Heap Binario – GeeksQuiz

Implementación avanzada BINARY HEAP (Java, C ++)

Enlace rápido para la representación interna basada en matrices REPRESENTACIÓN INTERNA DEL HEAP BINARIO BASADO EN ARRAY (Java, C ++)

Enlace rápido para inserción INSERCIÓN DE UN ELEMENTO EN UN HEAP (Java, C ++)

Enlace rápido para eliminar ELIMINANDO EL MÍNIMO DE UN HEAP (Java, C ++)

Bueno, un montón normalmente se implementa utilizando una matriz, pero no importa.

Lo que está describiendo es exactamente lo que sucede en las etapas finales de Heap Sort, donde realmente ordena la matriz subyacente, en su lugar, utilizando el siguiente algoritmo:

Después de construir un montón mínimo, el valor más pequeño se encuentra en la parte superior del montón, que se encuentra en la parte frontal de la matriz. Entonces, sabiendo que este es el elemento más pequeño del montón / matriz, lo saca del montón y lo empuja hacia la parte posterior de la matriz, donde se ubicará cuando se ordene toda la matriz.

Otro elemento burbujea en el montón y se convierte en el mínimo posterior del resto de la matriz, nuevamente sentado en la parte superior del montón y en la parte frontal de la matriz. Entonces, repites lo que hiciste la última vez: saca la cabeza del montón, cambia el elemento ahora penúltimo en la matriz y luego reconstruye el montón.

Repita este proceso hasta que haya un solo elemento en el montón, en cuyo punto se ordena la matriz subyacente.

En una sola oración: extrae repetidamente los mínimos del montón y los almacena de principio a fin en la matriz.

La estructura de datos del montón es un pseudo-árbol (más sobre esto a continuación) que inserta elementos en lg (n) y elimina el elemento más bajo (o más alto) en el tiempo lg (n). Para ordenar, inserte cada elemento en el montón y luego elimine cada elemento del montón para obtener los datos ordenados.

Un montón se puede implementar como una matriz donde un “nodo” en el índice n tiene dos “hijos” en las indicaciones 2n y 2n + 1. Las inserciones siempre ocurren en el último índice disponible, y son seguidas por un algoritmo de rotación para preservar la regla estipulada anteriormente. Por lo tanto, el índice 0 siempre contiene el elemento más bajo o más alto para un montón mínimo o un montón máximo, respectivamente. Después de la inserción, verifique si su padre es mayor que usted, si es así, cámbielos. Recurrir hasta que ningún padre sea mayor que su hijo.

Para eliminar elementos, devuelva el índice 0 después de extraer el hijo más grande y de forma recursiva hacia arriba su hijo más grande.

Heapsort (descrito en el primer párrafo) tiene una complejidad de peor caso de n lg (n), pero tiende a ser más lento que un quicksort bien implementado. Al igual que Quicksort, se puede hacer en su lugar pero es inestable.

More Interesting

¿Cuál es el código MATLAB para realizar el algoritmo AntNet?

¿Un cerebro humano tiene un algoritmo? Si se descifran los algoritmos del cerebro humano, ¿qué sucede? ¿Se usa en inteligencia artificial?

¿Por qué no ha habido sesiones sobre los cursos de Algoritmos I y II de Robert Sedgewick en Coursera durante tanto tiempo?

¿Cuál es el mecanismo fundamental detrás de los generadores de números aleatorios?

¿Qué tipo de operaciones podrían aplicarse sobre un árbol de segmentos?

¿Cómo aprenden los algoritmos de aprendizaje de refuerzo del juego de ajedrez a jugar bien, dado que cada movimiento no está etiquetado como bueno o malo, a diferencia del aprendizaje supervisado donde cada dato está etiquetado como bueno o malo?

Dado un gráfico de N vértices con m1 bordes unidireccionales y m2 bordes bidireccionales, ¿cómo podemos dirigir los bordes bidireccionales de modo que no tengamos ninguna caminata cerrada?

¿Cómo escribo un algoritmo para el problema de las 100 puertas?

¿Cuál de los siguientes libros es más adecuado para principiantes y más fácil de entender: CLRS o Algorithms by Sedgewick?

Cómo contar el número de enteros palindrómicos dentro de un rango [A, B] donde A y B pueden ser de hasta 10 ^ 17

¿Cuál es el mejor algoritmo para encontrar el camino con dos limitaciones?

Cómo insertar un valor al final de una lista vinculada

¿Cuáles son las diferencias entre las estructuras de datos y los algoritmos?

¿Por qué el problema de detención se considera no solucionable mientras manipulamos / negamos la respuesta nosotros mismos con la máquina N al final de la máquina X?

¿Cuáles son los 10 algoritmos y estructuras de datos imprescindibles para un concurso de programación?