Estructura de Datos - montón

montón

"Montón" (Montón), es en realidad un tipo especial de árbol.

¿Qué tipo de árbol es el montón? Tenemos que cumplir con dos condiciones

 

En primer lugar, el montón es un árbol binario completo;

En segundo lugar, el valor de la pila son cada nodo debe ser mayor que su valor (o menos) subárbol para cada nodo (que también se puede decir sobre el valor del nodo).

 

Gran 顶 堆

Valor para cada nodo es mayor o igual pilas para cada nodo en el subárbol valor, que se llama "montón grande superior."

Top pequeño montón

Para cada nodo el valor es inferior a igual a cada nodo en el valor de la pila subárbol, que llamamos "menor vértice montón."

 

Como se muestra en la figura, 1, y 2 es una tapa de pila grande, la parte superior de la pila 3 es pequeño, no una pila 4, porque 4 no es un árbol binario completo

 

Cómo almacenar un montón

Debido a que el montón es un árbol binario completo, árbol binario completo es adecuado para utilizar matrices para almacenar.

Debido a que no necesita almacenar punteros sobre nodo hijo, simplemente a través del índice de la matriz, se pueden encontrar alrededor de los niños y de los padres de los nodos de un nodo.

Una matriz para almacenar el árbol binario completo es muy ahorrar espacio de almacenamiento. 

Un índice de matriz al nodo hijo izquierdo de la i, es decir, el nodo etiquetado i * 2, el hijo derecho es el subíndice i nodo * 2 + 1, el nodo padre es el subíndice i / 2 en.

 

 

 

montón de

Cuando insertamos o elementos de eliminación en el montón, ya no cumple con las características de un montón pila invertida, que sea necesario ajustar de nuevo permitido para satisfacer las características de la pila, la pila del proceso es.

Montón de divide en dos, hacia abajo y hacia arriba desde la parte inferior del.

 

operativo central Reactor

 

Para insertar un elemento de la pila

Dejamos que el nodo padre del nodo comparación de tamaño recién insertado. Si no menor que el tamaño del nodo hijo de la relación de igualdad nodo padre, que intercambiar los dos nodos.

Este proceso se repite hasta que la pila de completado. Este es un típico pila arriba a partir del método de.

 

 

Eliminar la parte superior del elemento de montón

La parte superior de los elementos de la pila son especiales, de acuerdo con la definición de la pila, la parte superior de los elementos de memoria de pila es máximo o mínimo pila de datos.

Suposición es tan grande la pila superior, retire el elemento más grande, el segundo elemento más grande será colocado en la parte superior de la pila.

Si te gusta para insertar elementos como el intercambio comparativo, el problema se produce.

El último problema es que fuera del montón del montón no cumple con las características del árbol binario completo.

Para resolver este problema, tenemos que cambiar la forma de pensar.


Nos último nodo en la parte superior de la pila y, a continuación, por el mismo método de nodos principales y secundarios comparativos.

relación padre-hijo no se satisface por el tamaño, intercambiados, dos nodos, y este proceso se repite, hasta que esté satisfecho hasta que la relación de magnitud entre padre e hijo nodos.

 

Para evitar este problema matriz vacía, por lo que eliminamos el último elemento de la matriz. Después de los resultados de este método de pila, asegúrese de cumplir con las características del árbol binario completo.

Usando este método, la pila del proceso, la operación de intercambio es, no se producen la matriz de "agujeros". (Se apreciará que el orificio se coloca en el final de la matriz)

Este es un típico abajo del montón del proceso.

 

Código para operaciones de lixiviación en práctica

public class Heap {
  private int[] a; // 数组,从下标1开始存储数据
  private int n;  // 堆可以存储的最大数据个数
  private int count; // 堆中已经存储的数据个数

  public Heap(int capacity) {
    a = new int[capacity + 1];
    n = capacity;
    count = 0;
  }

  public void insert(int data) {
    if (count >= n) return; // 堆满了
    ++count;
    a[count] = data;
    int i = count;
    while (i/2 > 0 && a[i] > a[i/2]) { // 自下往上堆化
      swap(a, i, i/2); // swap()函数作用:交换下标为i和i/2的两个元素
      i = i/2;
    }
  }
 }


public void removeMax() {
  if (count == 0) return -1; // 堆中没有数据
  a[1] = a[count];
  --count;
  heapify(a, count, 1);
}

private void heapify(int[] a, int n, int i) { // 自上往下堆化
  while (true) {
    int maxPos = i;
    if (i*2 <= n && a[i] < a[i*2]) maxPos = i*2;
    if (i*2+1 <= n && a[maxPos] < a[i*2+1]) maxPos = i*2+1;
    if (maxPos == i) break;
    swap(a, i, maxPos);
    i = maxPos;
  }
}


Montón de nodos a lo largo de la ruta en la que el proceso es relativamente intercambio, por lo que el montón de tiempo con complejidad proporcional a la altura del árbol.

Contiene un árbol binario completo de n nodos, el árbol no supere la altura de log n.

Insertar y elementos de datos de borrado en la parte superior de la pila es la lógica principal de la pila, por lo que la pila se inserta en una parte superior del elemento de pila y los elementos de eliminación de la complejidad de tiempo es O (log n).

 

 

 

Publicados 113 artículos originales · ganado elogios 25 · Vistas a 30000 +

Supongo que te gusta

Origin blog.csdn.net/qq_42006733/article/details/104683008
Recomendado
Clasificación