web-dev-qa-db-ja.com

Java Min-Maxヒープの実装?

信頼できるJava min-maxヒープの実装、つまりその最小値と最大値を覗くことができるヒープ)を持つ人気のあるライブラリ(Apache、Googleなどのコレクション)を知っていますかO(1)の値とO(log n)の要素を削除するには?

35
Yuval Adam

グアバから: MinMaxPriorityQueue

32
Louis Wasserman

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

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

25
Il-Bhima

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

import Java.util.PriorityQueue;

public class MaxHeapWithPriorityQueue {

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

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

}

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

17
Vahid

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

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

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

2
NamshubWriter

Java.util.TreeSet クラス。

0
Nat