web-dev-qa-db-ja.com

JavaのPriorityQueueは最小ヒープとどう違うのですか?

insertWithPriorityができないのに、なぜPriorityQueueと名付けたのですか?ヒープに非常に似ているようです。違いはありますか?違いがない場合、なぜヒープではなくPriorityQueueと命名されたのですか?

46
Jeff Chen

Add()はinsertWithPriorityのように機能します。

コンストラクターを使用して、必要なタイプの優先順位を定義できます。

PriorityQueue(int, Java.util.Comparator)

http://download.Oracle.com/javase/1,5.0/docs/api/Java/util/PriorityQueue.html を見てください

コンパレータが与える順序は、キュー内の優先順位を表します。

23
Marcelo

デフォルトのPriorityQueueはMin-Heapで実装されます。つまり、最上位の要素はヒープ内の最小要素です。

最大ヒープを実装するには、独自のコンパレータを作成できます。

import Java.util.Comparator;

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

そのため、次の方法で最小ヒープと最大ヒープを作成できます。

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

Max-heapには次を使用できます。

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

PriorityQueue JavaDocs から:

優先度ヒープに基づく無制限の優先度キュー。優先度キューの要素は、使用されるコンストラクタに応じて、自然な順序に従って、またはキュー構築時に提供されるComparatorに従って順序付けられます。

優先度は、キュー内のオブジェクトに固有のプロパティであることを意味します。要素は、ある種の比較に基づいて順序付けられます。特定の優先度を持つオブジェクトを挿入するには、オブジェクトのフィールドが順序に影響するものを設定するだけで、 add() itです。


そして、 @ Daniel とコメントしたように、

通常、Javaオブジェクトは、実装方法に基づく名前ではなく、提供する機能に基づいて名前が付けられます。

6
Matt Ball

Javaドキュメント から

balanced binary heapとして表される優先度キュー:queue [n]の2つの子はqueue [2 * n + 1]およびqueue [2 *( n + 1)]。優先度キューは、comparator、または要素の自然順序


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() + " ");
        }
    }
}

サンプル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

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

優先度ヒープに基づく無制限の優先度キュー。優先度キューの要素は、自然順序付け、またはComparatorキュー構築時に提供

整数、long、float、double、character、boolean(つまりプリミティブデータ型)の場合、自然順序付けは昇順であるため、Arrays.sort(arr ){ここで、arrはプリミティブデータ型の配列です} arrの値を昇順で並べ替えます。 Comparatorを使用して、自然順序を変更できます。

コンパレータは、次の2つの方法で使用できます。

  • 方法の1つは、 DpGeek の表示方法です

  • 別の方法は、 匿名クラス を使用することです。例えば

_Arrays.sort(arr, new Comparator<Integer>() {
     public int compare(Integer x, Integer y) {
         return y - x;
     }
});
_
  • Java8がある場合、ラムダ式を使用できます

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

これは、配列arrを降順に並べ替えます

1
Anupam Ghosh