2009-07-08 19 views
30

min-maxヒープで信頼性の高いJava実装を持っている人気のあるライブラリ(Apache、Googleなど)のことを知っていますか?それは最小値と最大値を覗き見ることができるヒープで、O(1)O(log n)の要素ですか?Min-MaxヒープのJava実装ですか?

答えて

29

グアバから:MinMaxPriorityQueue

+1

特に、元の質問はグーバであるGoogleのコレクションについて尋ねてきました。 –

+0

唯一の小さな欠点は、標準的な 'Deque'実装の欠如です。 –

+0

Deque契約を満たしていないため、意図通りに動作しています。 –

0

java.util.TreeSetクラス。

+1

私は重複した値をサポートする必要があります...この設定では、設定は「少し問題があります」。 –

+2

-1 TreeSetはほとんどの操作をO(log n)で実装しています - 要件はO(1)の最小値と最大値を調べるためのものでした。 – Avi

+0

TreeSetには、ヒープの決定的な操作の1つであるdecrementKeyまたはincreaseKey操作もありません。 http://en.wikipedia.org/wiki/Heap_(data_structure) – NamshubWriter

22

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

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

+5

+1。これは、O(1)のルートを覗いてO(log.n)内のルートを削除するための規定された要件を満たした場合に有効です。ただし、PriorityQueueはすべてのヒープ操作(たとえば、declineKey、increaseKey)を実装していないことに注意してください。 – dty

+4

'remove()'はキューの先頭から削除され、 'O(log(n))'であり、 'remove(Object o)'は 'O(n)'です。参照:http://docs.oracle.com/javase/8/docs/api/java/util/PriorityQueue.html – erwaman

+1

削除はO(ログn)ではなくなるため、下降します。キューの1つから最小値を削除するのはO(log n)ですが、他のキューの最後にある同一のアイテムを削除するのはO(n)です。 –

-7
private void heapifyUp(int current) { 
int parent = (current - 1)/2; 
if (current < 0)return; 
while (current > 0 && arr[current] > arr[parent]) { 
    int temp = arr[parent]; 
    arr[parent] = arr[current]; 
    arr[current] = temp; 
    current = parent; 
    parent = (current - 1)/2; 
} return; 
} 
+0

これはどのようにして質問に答えますか? – LaurentG

+0

を参照してください。http://stackoverflow.com/help/how-to-answer – Paritosh

12

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

} 

は、詳細については、下記をご覧ください:

+5

[Collections.reverseOrder()](https://docs.oracle.com/javase/8/docs/api)を使用する方が便利です。 /java/util/Collections.html#reverseOrder--)をMaxHeapクラスのPriorityQueueの引数として使用します。 –

+0

もっと便利なところはどういう意味ですか?もっと説明していただけますか? – Mohammad

+0

_reverseOrder_メソッドは、(x、y) - > y-x'と比較して何を理解しているかをより明確に理解していると思います。 –