Ausführliche Erklärung zur Java-Prioritätswarteschlange

1. Implementierung der Prioritätswarteschlange

Bei der Implementierung der Prioritätswarteschlange können wir die Heap-Datenstruktur auswählen, die Warteschlange mit der größten Priorität kann einen großen Heap verwenden und die Warteschlange mit der kleinsten Priorität kann mit einem kleinen Heap implementiert werden. Der Heap ist ein Binärbaum, wie in der Abbildung gezeigt unten. Das Prinzip wird unten mit der Warteschlange mit der kleinsten Priorität erläutert. Die Warteschlange mit minimaler Priorität umfasst im Allgemeinen das Einfügen eines Elements in die Menge S, das Zurückgeben des Elements mit dem kleinsten Schlüssel in der Menge S, das Zurückgeben und Löschen des Elements mit dem kleinsten Schlüssel in der Menge S usw.

Operation einfügen

Die Einfügeoperation besteht darin, ein Element in die Menge S einzufügen, das Element zuerst an die nächste Position aller Elemente zu setzen und dann die "float" -Operation auszuführen, wie im folgenden Beispiel gezeigt (beachten Sie das Beispiel in der folgenden Abbildung ist ein kleiner Stapel, und das Bild stammt aus einem gründlichen Verständnis von Java PriorityQueue.

Fügen Sie hier eine Bildbeschreibung ein
Entfernen Sie den Vorgang

Wenn die Warteschlange in der Prioritätswarteschlange nicht leer ist, entfernen Sie das erste Element in der Menge, dh das Element mit dem Index 0, und verschieben Sie dann das letzte Element in der Menge an die Position mit dem Index 0. Das neue Element führt a aus "Sink" -Operation. Das folgende Abbildung Beispiel (Hinweis, aber das Prinzip ist das gleiche, das Bild stammt aus einem gründlichen Verständnis von Java PriorityQueue)

Fügen Sie hier eine Bildbeschreibung ein
Live lernen und verwenden: ein
Algorithmusproblem:

题目描述:
对于一个数组,寻找其前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 

Ich denke du magst

Origin blog.csdn.net/fxwentian/article/details/115195995
Empfohlen
Rangfolge