2016-06-07 8 views
0

popMin 및 popMax 메서드를 모두 포함하는 대기열 클래스를 구현하고 있습니다. 지금까지 두 개의 우선 순위 대기열을 사용하여 작업을 수행했습니다. 그러나 제거가 log (n) 시간 일지라도 다른 대기열에서도 선형을 제거해야합니다. 바이너리 힙을 사용하여 이중 종료 우선 순위 큐를 구현할 수 있다는 것을 알고 있지만, 빌드하는 데 선형 시간이 걸린다 고 잘못 생각하지 않는다면? 더 효율적으로 할 수있는 방법이 있습니까? Java 라이브러리 클래스도 사용할 수 있습니다.min-max 대기열 클래스에서 min 및 max를 선형 시간보다 짧게 삭제합니다.

static class MinMaxQueue { 

    PriorityQueue<String> MinQueue = new PriorityQueue<String>(); 
    PriorityQueue<String> MaxQueue = new PriorityQueue<String>(Collections.reverseOrder()); 


    void push(String val) { 
     MinQueue.add(val); 
     MaxQueue.add(val); 
    } 

    String popMin() { 
     MaxQueue.remove(MinQueue.peek()); 
     return MinQueue.remove(); 
    } 

    String popMax() { 
     MinQueue.remove(MaxQueue.peek()); 
     return MaxQueue.remove(); 
    } 

    int size() { 
     return MinQueue.size(); 

    } 
} 

답변

3

min-max heap 지원 O (1) 발견 - 최소/최대와 O (로그 n) 삭제 - 최소/최대. Guava의 MinMaxPriorityQueue은 min-max 힙 구현입니다.

Java 표준 라이브러리에는 min-max 힙 구현이 없습니다. 타사 라이브러리를 사용할 수없고 자신의 min-max 힙을 구현하고 싶지 않은 경우. 빨강 - 검정 나무을 기반으로 구현되는 TreeSet을 시도해 볼 수 있습니다. 그것은 O (logn) delete-min/max를 가지며, trade-off는 find-min/max가 O (logn)이기도합니다. threaded을 사용하여 최소/최대를 추적 할 수는 있지만 트리 세트에 대한 변경이 많이 필요합니다.

막대기 인 경우 PriorityQueues 두 개를 사용하여 최소 최대 대기열을 구현하십시오. 다른 대기열 요소의 모든 색인을 HashMap에 추적 할 수 있습니다 (the answer). PriorityQueue # removeAt (index)가 O (logn)이기 때문입니다. 그러나 모든 요소 이동에는 HashMap을 업데이트해야합니다. 여분의 공간을 사용하고 성능이 좋지 않기 때문에이 작업을 수행하지 않는 것이 좋습니다.