Explicación detallada de la cola de prioridad Java

1. Implementación de la cola de prioridad

En la implementación de la cola de prioridad, podemos elegir la estructura de datos del montón, la cola de prioridad más grande puede usar un montón grande y la cola de prioridad más pequeña se puede implementar con un montón pequeño. El montón es un árbol binario como se muestra en la figura debajo. El principio se explica a continuación con la cola de prioridad más pequeña. La cola de prioridad mínima generalmente incluye insertar un elemento en el conjunto S, devolver el elemento con la clave más pequeña en el conjunto S, devolver y eliminar el elemento con la clave más pequeña en el conjunto S, y así sucesivamente.

Insertar operación

La operación de inserción consiste en insertar un elemento en el conjunto S, primero poner el elemento en la siguiente posición de todos los elementos y luego realizar la operación "flotar", como se muestra en el ejemplo siguiente (tenga en cuenta que el ejemplo de la figura siguiente es una pila pequeña, y la imagen proviene de un conocimiento profundo de Java PriorityQueue)

Inserte la descripción de la imagen aquí
Quitar operación

En la cola de prioridad, cuando la cola no está vacía, elimine el primer elemento del conjunto, es decir, el elemento con subíndice 0, y luego mueva el último elemento del conjunto a la posición con subíndice 0. El nuevo elemento realiza una Operación "fregadero". El siguiente ejemplo de figura (nota, pero el principio es el mismo, la imagen proviene de una comprensión profunda de Java PriorityQueue)

Inserte la descripción de la imagen aquí
Aprendizaje y uso en vivo: un
problema de algoritmo:

题目描述:
对于一个数组,寻找其前K个最小的元素

import java.util.Comparator;
import java.util.PriorityQueue;

class Solution {
    
    

    public void getLeastNumbers(int[] arr, int k) {
    
    
        int[] num = new int[k];

        //Queue<Integer> queue = new PriorityQueue<>((v1, v2) -> v2 - v1);
        PriorityQueue<Integer> queue = new PriorityQueue<>(k, new Comparator<Integer>() {
    
    
            @Override
            public int compare(Integer t1, Integer t2) {
    
    
                return t2 - t1;
            }//大根堆
        });
        for (int value : arr) {
    
    
            if (queue.size() < k)
                queue.offer(value);
            else {
    
    
                if (value < queue.peek()) {
    
    
                    queue.poll();
                    queue.offer(value);
                }
            }
        }
        for (int i = 0; i < k; i ++){
    
    
            num[i] = queue.poll();
        }
        for(int i=0;i<k;i++)
            System.out.print(num[i]+" ");
        //return num;
    }

    public static void main(String[] args) {
    
    
        Solution s=new Solution();
        int []arr={
    
    4,5,1,6,2,7,3,8};
        int k=4;
        s.getLeastNumbers(arr,4);
    }
}
返回结果:4 3 2 1 

Supongo que te gusta

Origin blog.csdn.net/fxwentian/article/details/115195995
Recomendado
Clasificación