2009-07-08 6 views
30

min-max 힙에 대한 신뢰할 수있는 Java 구현을 갖는 인기있는 라이브러리 (Apache, Google 등)의 컬렉션, 즉 최소값과 최대 값을 엿볼 수있는 힙인 O(1)을 알고 있습니까? 요소는 O(log n)에 있습니까?최소 - 최대 힙에 대한 Java 구현?

답변

29

구아바 출신 : MinMaxPriorityQueue.

+1

특히 Guava라는 Google 콜렉션에 대한 원래 질문에 대해 물었습니다. –

+0

단 하나의 작은 단점은 표준'Deque' 구현이 부족하다는 것입니다. –

+0

Deque 계약을 만족하지 않으므로 의도 한대로 작동합니다. –

0

java.util.TreeSet 클래스입니다.

+1

중복 값 지원이 필요합니다.이 설정에서는 "조금"문제가 있습니다. –

+2

-1 TreeSet은 O (log n)에서 대부분의 작업을 구현합니다. 요구 사항은 O (1)의 최소 및 최대를 엿보는 것이 었습니다. – Avi

+0

TreeSet에는 또한 힙의 최종 작업 중 하나 인 reduceKey 또는 increaseKey 작업이 없습니다. http://en.wikipedia.org/wiki/Heap_(data_structure) – NamshubWriter

22

max-min 힙 대신 동일한 요소가 포함 된 java.util.PriorityQueue의 두 인스턴스를 사용할 수 있습니까? 첫 번째 인스턴스는 머리에 최대 값을 넣는 비교기를 전달하고 두 번째 인스턴스는 머리에 최소값을 가져 오는 비교기를 사용합니다.

두 가지 구조에서 추가, 삭제 등을 수행해야하지만 사용자의 요구 사항을 충족시켜야한다는 단점이 있습니다.

+5

+1.이는 O (1)에서 루트를 엿보고 O (log.n)에서 제거하기위한 명시된 요구 사항에 대한 좋은 대답입니다. 그러나 PriorityQueue는 모든 힙 작업 (예 : decreaseKey, increaseKey)을 구현하지 않습니다. – dty

+4

'remove (Object)'가'O (n)'인 반면, 큐의 머리 부분에서 제거되는 인수가없는'remove()'는'O (log (n))'입니다. 참조 : http://docs.oracle.com/javase/8/docs/api/java/util/PriorityQueue.html – erwaman

+1

제거가 O (log n)이 아니기 때문에 Downvoted. 하나의 대기열에서 최소값을 제거하는 것은 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'와 비교하여 무엇을 읽고 이해하는지 더 명확하게 생각합니다. –