web-dev-qa-db-fra.com

En quoi Java PriorityQueue diffère-t-il d'un min-tas?

Pourquoi ont-ils nommé PriorityQueue si vous ne pouvez pas insertWithPriority? Cela ressemble beaucoup à un tas. Y a-t-il des différences? Si aucune différence, pourquoi était-il nommé PriorityQueue et non Heap?

46
Jeff Chen

Add () fonctionne comme un insertWithPriority.

Vous pouvez définir la priorité du type souhaité à l'aide du constructeur:

PriorityQueue(int, Java.util.Comparator)

regardez sous http://download.Oracle.com/javase/1,5.0/docs/api/Java/util/PriorityQueue.html

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

23
Marcelo

Le PriorityQueue par défaut est implémenté avec Min-Heap, c'est-à-dire que l'élément supérieur est le minimum 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 tas min et un tas max de la manière suivante:

PriorityQueue minHeap=new PriorityQueue();
PriorityQueue maxHeap=new PriorityQueue(size, new MyComparator());
70
Bin Feng

Pour max-heap, vous pouvez utiliser:

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

De les PriorityQueue JavaDocs :

Une file d'attente prioritaire illimitée basée sur un segment de priorité. Les éléments de la file d'attente prioritaire sont ordonnés selon leur ordre naturel, ou par un Comparator fourni au moment de la construction de la file d'attente, selon le constructeur utilisé.

La priorité est censée être une propriété inhérente des objets dans la file d'attente. Les éléments sont classés en fonction d'une sorte de comparaison. Pour insérer un objet avec une priorité donnée, il vous suffit de définir les champs de l'objet qui affectent l'ordre, et add() .


Et, comme @ Daniel commenté,

Généralement Java Les objets sont nommés en fonction des fonctionnalités qu'ils fournissent, et non en fonction de la façon dont ils sont implémentés.

6
Matt Ball

De documents Java

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


Voici un code de travail pour maxHeap et 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 
3
roottraveller

De http://docs.Oracle.com/javase/7/docs/api/Java/util/PriorityQueue.html

Une file d'attente prioritaire illimitée basée sur un segment de priorité. Les éléments de la file d'attente prioritaire sont ordonnés selon leur ordre naturel, ou par un Comparateur fourni lors de la construction de la file d'attente

pour entier, long, flottant, double, caractère, booléen (c'est-à-dire les types de données primitifs), le ordre naturel est un ordre croissant, c'est pourquoi Arrays.sort (arr) {où arr est un tableau de primitives type de données} trie la valeur de arr dans l'ordre croissant. Vous pouvez changer l'ordre naturel en utilisant un Comparateur

Le comparateur peut être utilisé de deux manières:

  • L'un des moyens est de savoir comment DpGeek a montré

  • Une autre façon consiste à utiliser classe anonyme . Par exemple

Arrays.sort(arr, new Comparator<Integer>() {
     public int compare(Integer x, Integer y) {
         return y - x;
     }
});
  • Si vous avez Java8, vous pouvez utiliser l'expression lambda

Arrays.sort(arr, (Integer x, Integer y) -> y - x);

Cela trie le tableau arr dans l'ordre décroissant

1
Anupam Ghosh