85 votes

En quoi la PriorityQueue de Java diffère-t-elle d'un mini-heap ?

Pourquoi ont-ils nommé PriorityQueue si vous ne pouvez pas insertWithPriority ? Cela semble très similaire à un tas. Y a-t-il des différences ? S'il n'y a pas de différence, alors pourquoi a-t-il été nommé PriorityQueue et pas Heap ?

18 votes

Je ne sais pas si cela diffère d'un mini-heap, mais en général, les objets Java sont nommés en fonction de la fonctionnalité qu'ils fournissent, et non en fonction de la façon dont ils sont mis en œuvre.

1 votes

@Daniel Ok, cela explique pourquoi il n'est pas appelé heap, mais pourquoi est-il appelé PriorityQueue s'il ne supporte pas la fonctionnalité d'une file d'attente prioritaire ?

9 votes

Il fait prennent en charge la fonctionnalité d'une file d'attente prioritaire.

116voto

DpGeek Points 202

La PriorityQueue par défaut est implémentée avec Min-Heap, c'est-à-dire que l'élément supérieur est le plus petit dans le tas.

Afin d'implémenter un max-heap, vous pouvez créer votre propre Comparateur :

import java.util.Comparator;

public class MyComparator implements Comparator<Integer>
{
    public int compare( Integer x, Integer y )
    {
        return y - x;
    }
}

Ainsi, vous pouvez créer un min-heap et un max-heap de la manière suivante :

PriorityQueue minHeap=new PriorityQueue();
PriorityQueue maxHeap=new PriorityQueue(size, new MyComparator());

4 votes

Exactement, c'est un mini-heap parce que l'ordre de tri par défaut est ascendant.

2 votes

@ThinkRecursively faisant une minus pour obtenir un comparateur inverse est une idée terrible

7 votes

Un max-heap plus facile : Queue<Integer> maxHeap = new PriorityQueue<Integer>(Collections.reverseOrder()); como depuis la version 1.8 vous pouvez simplement passer dans le comparateur sans avoir besoin de passer dans la capacité initiale.

62voto

Hengameh Points 774

Pour le max-heap, vous pouvez utiliser :

PriorityQueue<Integer> queue = new PriorityQueue<>(10, Collections.reverseOrder());

14 votes

Depuis la version 1.8 vous pouvez simplement passer dans le comparateur sans avoir besoin de passer dans la capacité initiale : Queue<Integer> maxHeap = new PriorityQueue<Integer>(Collections.reverseOrder());

36voto

Marcelo Points 6708

Add() fonctionne comme un insertWithPriority.

Vous pouvez définir la priorité pour le type que vous voulez en utilisant le constructeur :

PriorityQueue(int, java.util.Comparator)

regardez en dessous https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/PriorityQueue.html

L'ordre donné par le comparateur représentera la priorité dans la file d'attente.

12voto

GauravRatnawat Points 345

Comportement par défaut tel que décrit dans les autres réponses

Min Heap (par défaut) :

PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();

Pour Max Heap :

PriorityQueue<Integer> priorityQueue = new PriorityQueue<>((o1, o2) -> o2-o1);

7voto

roottraveller Points 4532

De Docs Java

La file d'attente prioritaire est représentée par un tas binaire équilibré les deux enfants de queue[n] sont queue[2*n+1] et queue[2*(n+1)]. La file d'attente prioritaire est ordonnée par comparateur ou par les éléments ordre naturel .


Voici un code fonctionnel pour maxHeap y minHeap en utilisant PriorityQueue -

class HeapDemo {
    private final static int HEAP_SIZE = 10; //size of heap

    //INNER CLASS
    static class maxHeapComparator implements Comparator<Integer> {
        @Override
        public int compare (Integer x, Integer y) {
            return y-x; //reverse order
        }
    }

    public static void main(String[] args) {
        PriorityQueue<Integer> minHeap = new PriorityQueue<>(HeapDemo.HEAP_SIZE); 
        PriorityQueue<Integer> maxHeap = new PriorityQueue<>(HeapDemo.HEAP_SIZE, new maxHeapComparator());  

        for(int i=1; i<=HeapDemo.HEAP_SIZE; ++i){
            int data = new Random().nextInt(100) +1; //number between 0 to 100
            minHeap.add(data);
            maxHeap.add(data);
        }

        System.out.print("\nMIN Heap : ");
        Iterator<Integer> iter = minHeap.iterator();
        while(iter.hasNext()){
            System.out.print(iter.next() + " ");
        }

        System.out.print("\nMAX Heap : ");
        iter = maxHeap.iterator();
        while(iter.hasNext()) {
            System.out.print(iter.next() + " ");
        }
    }
}

échantillon o/p :

MIN Heap : 20 32 37 41 53 91 41 98 47 86 
MAX Heap : 98 91 41 53 86 20 37 41 32 47

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X