43

O(1)最小値と最大値をのぞき見し、の要素を削除できるヒープである、最小-最大ヒープの信頼性の高いJava実装を備えた人気のあるライブラリ(Apache、Googleなどのコレクション)を知っていますO(log n)か?

4

6 に答える 6

39

グアバから:MinMaxPriorityQueue

于 2012-02-02T20:45:54.067 に答える
28

max-minヒープの代わりに、同じ要素を含むjava.util.PriorityQueueの2つのインスタンスを使用できますか?最初のインスタンスには、最大値を先頭に置くコンパレータが渡され、2番目のインスタンスには、最小値を先頭に置くコンパレータが渡されます。

欠点は、追加、削除などを両方の構造で実行する必要があることですが、要件を満たす必要があります。

于 2009-07-08T14:26:17.200 に答える
27

Javaには、最小ヒープと最大ヒープを実装するための優れたツールがあります。私の提案は、これらのヒープを実装するために優先キューのデータ構造を使用することです。優先キューを使用して最大ヒープを実装するには、次のことを試してください。

import java.util.PriorityQueue;

public class MaxHeapWithPriorityQueue {

    public static void main(String args[]) {
    // create priority queue
    PriorityQueue<Integer> prq = new PriorityQueue<>((a,b)->b-a);

    // insert values in the queue
    prq.add(6);
    prq.add(9);
    prq.add(5);
    prq.add(64);
    prq.add(6);

    //print values
    while (!prq.isEmpty()) {
        System.out.print(prq.poll()+" ");
    }
    }

}

優先キューを使用して最小ヒープを実装するには、次のことを試してください。

import java.util.PriorityQueue;

public class MinHeapWithPriorityQueue {

    public static void main(String args[]) {
        // create priority queue
        PriorityQueue< Integer > prq = new PriorityQueue <> ();

        // insert values in the queue
        prq.add(6);
        prq.add(9);
        prq.add(5);
        prq.add(64);
        prq.add(6);

        //print values
        while (!prq.isEmpty()) {
            System.out.print(prq.poll()+" ");
        }
    }

}

詳細については、以下をご覧ください。

于 2016-09-24T21:51:06.060 に答える
5

最小ヒープ: PriorityQueue minHeap = new PriorityQueue <>();

最大ヒープ PriorityQueuemaxHeap= new PriorityQueue <>(Comparator.reverseOrder());

于 2021-01-16T06:55:17.837 に答える
3

com.aliasi.util.MinMaxHeapはどうですか?これはLingPipeの一部です; 残念ながら、ライセンスが問題になる可能性があります。

この関連論文を参照してください。

ただし、decreaseKeyまたはincreaseKeyは実装していません。

于 2009-07-08T14:25:44.173 に答える
0

java.util.TreeSetクラス。

于 2009-07-08T14:03:40.380 に答える