min-max 힙에 대한 신뢰할 수있는 Java 구현을 갖는 인기있는 라이브러리 (Apache, Google 등)의 컬렉션, 즉 최소값과 최대 값을 엿볼 수있는 힙인 O(1)
을 알고 있습니까? 요소는 O(log n)
에 있습니까?최소 - 최대 힙에 대한 Java 구현?
답변
구아바 출신 : MinMaxPriorityQueue
.
java.util.TreeSet 클래스입니다.
중복 값 지원이 필요합니다.이 설정에서는 "조금"문제가 있습니다. –
-1 TreeSet은 O (log n)에서 대부분의 작업을 구현합니다. 요구 사항은 O (1)의 최소 및 최대를 엿보는 것이 었습니다. – Avi
TreeSet에는 또한 힙의 최종 작업 중 하나 인 reduceKey 또는 increaseKey 작업이 없습니다. http://en.wikipedia.org/wiki/Heap_(data_structure) – NamshubWriter
어때 대략 com.aliasi.util.MinMaxHeap? 이 부분은 LingPipe입니다. 안타깝게도 licensing이 문제 일 수 있습니다.
this related paper을 참조하십시오.
그러나 reduceKey 또는 increaseKey를 구현하지 않습니다.
max-min 힙 대신 동일한 요소가 포함 된 java.util.PriorityQueue의 두 인스턴스를 사용할 수 있습니까? 첫 번째 인스턴스는 머리에 최대 값을 넣는 비교기를 전달하고 두 번째 인스턴스는 머리에 최소값을 가져 오는 비교기를 사용합니다.
두 가지 구조에서 추가, 삭제 등을 수행해야하지만 사용자의 요구 사항을 충족시켜야한다는 단점이 있습니다.
+1.이는 O (1)에서 루트를 엿보고 O (log.n)에서 제거하기위한 명시된 요구 사항에 대한 좋은 대답입니다. 그러나 PriorityQueue는 모든 힙 작업 (예 : decreaseKey, increaseKey)을 구현하지 않습니다. – dty
'remove (Object)'가'O (n)'인 반면, 큐의 머리 부분에서 제거되는 인수가없는'remove()'는'O (log (n))'입니다. 참조 : http://docs.oracle.com/javase/8/docs/api/java/util/PriorityQueue.html – erwaman
제거가 O (log n)이 아니기 때문에 Downvoted. 하나의 대기열에서 최소값을 제거하는 것은 O (log n)이지만 다른 대기열의 끝에있는 동일한 항목을 제거하는 것은 O (n)입니다. –
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;
}
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()+" ");
}
}
}
자세한 내용은 다음 웹 사이트를 방문하십시오
[Collections.reverseOrder()] (https://docs.oracle.com/javase/8/docs/api)를 사용하는 것이 더 편리합니다. /java/util/Collections.html#reverseOrder--)를 MaxHeap 클래스의 PriorityQueue에 대한 인수로 사용합니다. –
더 편리하다는 것은 무엇을 의미합니까? 더 설명해 주시겠습니까? – Mohammad
_reverseOrder_ 메쏘드는'(x, y) -> y-x'와 비교하여 무엇을 읽고 이해하는지 더 명확하게 생각합니다. –
특히 Guava라는 Google 콜렉션에 대한 원래 질문에 대해 물었습니다. –
단 하나의 작은 단점은 표준'Deque' 구현이 부족하다는 것입니다. –
Deque 계약을 만족하지 않으므로 의도 한대로 작동합니다. –