【问题标题】:Deleting min and max from min-max queue class in less than linear time在小于线性的时间内从 min-max 队列类中删除 min 和 max
【发布时间】:2016-06-07 23:07:22
【问题描述】:

我正在实现一个同时具有 popMin 和 popMax 方法的队列类。到目前为止,我已经使用两个优先级队列,但即使删除是 log(n) 时间,我也必须从另一个队列中删除,这是线性的。我知道可以使用二进制堆来实现双端优先级队列,但如果我没记错的话,这需要线性时间来构建吗?有没有办法可以更有效地做到这一点?我也只能使用 Java 库类。

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(); 

    }
}

【问题讨论】:

    标签: java queue big-o minmax-heap


    【解决方案1】:

    A min-max heap 支持 O(1) find-min/max 和 O(log n) delete-min/max。 Guava 的MinMaxPriorityQueue 是最小-最大堆的实现。

    java 标准库中没有最小-最大堆实现。如果您不能使用 3rd 方库,并且您不想实现自己的最小最大堆。你可以试试TreeSet,它是基于红黑树实现的。它有 O(logn) delete-min/max,权衡是 find-min/max 也是 O(logn)。您可以尝试将其设为threaded 以跟踪最小值/最大值,但需要对 TreeSet 进行大量更改。

    如果您坚持使用两个 PriorityQueues 来实现您的最小-最大队列。您可以将其他队列的元素的所有索引跟踪到 HashMap 中,如the answer。因为 PriorityQueue#removeAt(index) 是 O(logn)。但是每个元素的移动都需要更新 HashMap。我强烈建议不要这样做,因为会占用额外的空间并且性能可能很差。

    【讨论】:

      猜你喜欢
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-26
      • 2017-06-10
      • 1970-01-01
      相关资源
      最近更新 更多