Cola (cola) de la interfaz, y su PriorityQueue clase de implementación (cola de prioridad) analizar el código fuente

Pila se introduce delante dentro y fuera de la nueva, y la cola FIFO es

1, la estructura de cola

interfaz pública cola <E> Colección extiende <E> { 
   
    complemento booleano (E e); 
   
    oferta booleano (E e); 

    E remove (); 

    Sondeo E (); 

    Elemento E (); 

    E peek (); 
}

  Queue es una interfaz.

 

2, análisis de código fuente PriorityQueue

PriorityQueue es una cola de prioridad, la diferencia entre la cola y FIFO son: cada uno de los elementos cola de prioridad son un equipo de los elementos de mayor prioridad . Cómo prioridad para determinar qué elementos de la misma? jdk montón usando esta estructura de datos, a través de la pila de modo que la más pequeña por cola siempre elemento, el tamaño comparación elemento especificado por Compareator quitadas de la cola, correspondiente a la prioridad.

 

3. ¿Cuál es el montón y montones binarias?

1) el valor de un nodo de pila es siempre mayor que o no menor que la de su nodo padre

2) Montón siempre un árbol completa

Montón escena tiene un montón binario, montón de Fibonacci y así sucesivamente. El PriorityQueue es un montón binario.

heap binario es una pila especial, montón binario es un árbol binario completo o casi completo árbol binario. Hay dos pila binaria: máximo y mínimo de pila pila

almacenamiento dinámico máximo: nodo clave de los padres es siempre mayor que o igual a cualquier tecla de un nodo hijo

circuito de espera mínimo: la clave del nodo padre es siempre menor o igual a cualquier tecla de un nodo hijo

Leyenda pila binaria

 

 La figura es un árbol completo binario (heap binario), caracterizado por: antes de la n-ésima profundidad de la capa está llena, no empieza a llenar la profundidad de la n + 1 capa, y el elemento se inserta se llena de izquierda a derecha.

Sobre la base de esta función, montón binario y puede ser representada por una matriz en lugar de una lista enlazada. Nos fijamos en las siguiente figura muestra un montón matriz binaria

 

 Para la matriz de n elementos de cualquier elemento, en la matriz de pila binaria base mientras que su 2n + 1 posición hijo izquierdo en el niño derecha de la posición 2n + 2 de su nodo padre en la (n-1) / 2 , mientras que el nodo raíz es una posición en un 0.

 

4, la estructura de datos PriorityQueue, la pila es

público de clase PriorityQueue <E> el AbstractQueue extiende <E> 
    los implementos de la java.io.Serializable { 

    // capacidad por defecto 11. 
    Privado final static int DEFAULT_INITIAL_CAPACITY = 11;. 

    // utilizar una matriz para almacenar elementos 
    objeto transitorio [] cola; // no -private simplificar anidada acceso a la clase 

    // elemento de la cola tamaño 
    privada int size = 0; 
    // cola de prioridad implementado por el comparador 
    privada comparador comparador final <super E?>; 
}

  

5, el constructor

Nos fijamos en el constructor principal

PriorityQueue pública (int initialCapacity, Comparador comparador <Super E?>) { 
    
	si (initialCapacity <1) 
	    throw new IllegalArgumentException (); 
	this.queue = new Object [initialCapacity]; 
    	this.comparator = comparador; 

}

  

6, añadir el principio de un montón binario

características pila binaria:

1) el nodo padre es siempre menor que o igual a cualquier tecla una tecla nodos secundarios.

2) basado en la matriz de pila binaria implementado, para la matriz de n en cualquier elemento del elemento, su 2n + 1 posición hijo izquierdo, el hijo derecho 2n + 2 posición, su nodo padre en la (n-1) / 2, mientras que el nodo raíz es una posición en un 0.

Para mantener esta característica, una pila binaria cuando la adición de elementos, requiere una operación de "moverse hacia arriba", como se muestra en la figura.

 

 

7, la fuente de elemento analítico añadió

    // añadir un elemento 
    pública de Boole el botón Añadir (E E) { 
        devolver la oferta (E); 
    } 

    
    public boolean la oferta (E E) { 
        SI (E == null) 
            al lanzar una NullPointerException nuevo nuevo (); 
	// versión modificada hecho +1 
        ModCount ++; 
	/ / registrar el número actual de elementos de cola 
        int i = tamaño; 
	// si el número actual de elementos en la mayor cola que o igual a la longitud de la matriz subyacente, para la expansión de la 
        IF (I> = queue.length) 
            Grow (I + 1.); 
	// elemento 1 número 
        size = I + 1;. 
	// si no hay elemento de la cola, se añadirá el elemento directamente a la raíz e 
        IF (I == 0) 
            cola [0] = e; 
	método // else llamadas siftUp para añadir un elemento el fallo de la cola, el cambio en 
        la persona 
            siftUp (I, E); 
        regreso a la verdadera; 
    }

  

1) la expansión operativo

    Crecer private void (int ser minCapacity) { 
        int = oldCapacity queue.length; 
        // si la cola actual es menor que 64, la expansión a 2 veces, o 1,5 veces la expansión 
        int newCapacity oldCapacity + = ((oldCapacity <64)? 
                                         (2 + oldCapacity ): 
                                         (oldCapacity >> 1));. 
        // int si la expansión más allá de la gama, el newCapacity asignado Integer.MAX_VALUE 
        IF (newCapacity - MAX_ARRAY_SIZE> 0) 
            newCapacity = hugeCapacity (sea minCapacity); 
	// array para la copia de expansión 
        cola Arrays.copyOf = (Queue, newCapacity); 
    }

  

operación de cambio 2)

    Mover //, x representa un nuevo elemento se inserta, k representa la posición recién insertada en el elemento de matriz 
    privada siftUp void (int K, E X) { 
	// desplazamiento método de operación dependiendo de si el comparador está vacío, la selección de un diferente 
        si ( ! = null comparador) 
            siftUpUsingComparator (K, X); 
        la otra 
            siftUpComparable (K, X); 
    } 

    // comparador está vacía, este método se llama operación de cambio realizado en el 
    privado vacío siftUpComparable (int K, E X) { 
        el comparable <? E super> Key = (? la comparable <super E>) x; 
	// 0 donde k indica la k no es juzgado root>, x es un elemento con un nodo padre. 
        el tiempo (K> 0) { 
	    // calcular la posición del nodo padre del elemento x / 2 (n- 1). 
            int matriz = (K - 1). >>> 1;. 
	    elemento padre de x tomada // E 
            objeto de cola = E [parent ]; 
	    // si el nuevo elemento es mayor que su padre elemento E k, que no es necesario para "mover", fuera de la final de ciclo 
            IF (key.compareTo ((E) E)> = 0) 
                PAUSA;
	    // x más pequeño que el elemento padre, la necesidad de "movimiento" 
	    // elemento de conmutación de x y la posición de la matriz nodo e 
            cola de [k] = e; 
	    iteración // nuevo elemento insertado en los puntos de nodo padre a la posición de la posición k, llevaron a cabo 
            parent = k; 

        } 
	asignación // encontrar la posición correcta después de que el nuevo elemento x k 
        cola [k] = llave; 
    }

  Resumen: "Subir" operaciones de lixiviación binarios principalmente mantendrán los nuevos elementos y los elementos primarios para comparar, que el nodo padre es un pequeño cambio. Mover el nodo padre y luego comparar, hasta que el nodo raíz.

 

8, el principio de pila binaria elimina

Correspondiente a la operación de lixiviación en dequeue binario es eliminar el elemento raíz, que es el elemento más pequeño, se mueve para encontrar una posición de sustitución de la raíz, para retirar el elemento, que es el "abajo"

 

 

 

 

En combinación con la ilustración de arriba, vamos a explicar proceso de pila binaria del equipo:
     1. El elemento 8 para identificar la cola, y eliminarlo en la posición de la cola (Fig. 2);
     2. El elemento 8 a la raíz de la cola de un elemento hijo más pequeño 3 que ser grande, de modo que el elemento de abajo 1, las posiciones de intercambio 1 y 3 (Fig. 3);
     3. En este momento, el elemento de cola y luego el elemento 8 que la mayoría de los niños de 1 a 4 grande, un continúan hacia abajo, la posición de cambio 1 y 4 (Fig. 4);
     4. En este momento, el elemento raíz y la relación de elemento de 8 1 9 niño más pequeño es más pequeño, no hacia abajo asignado directamente al elemento raíz 8 en este caso la posición de los elementos 1, 1 están cubiertas con el equivalente de borrado (Fig. 5), el extremo .

 

Referencia: https://www.cnblogs.com/linghu-java/p/9467805.html

 

Supongo que te gusta

Origin www.cnblogs.com/linlf03/p/12634297.html
Recomendado
Clasificación