【问题标题】:Java priority queueJava 优先级队列
【发布时间】:2009-03-02 13:54:10
【问题描述】:

Java 的 priority queue 是一种数据结构,对于 put(插入)具有 O(log n) 复杂性,对于 poll(检索和删除 min 元素)具有复杂性 O(log n)

C++ STL 的multimap 具有相同的功能,但O(1) 用于检索和删除最小元素(开始和擦除)的复杂性。 Java中是否有等价物?

【问题讨论】:

  • 您能解释一下队列如何成为多图吗?第一个有一个类型参数,第二个有两个。
  • 使用 Void 作为第二类参数?
  • 如果使用priority_queue,则需要对类型使用自定义运算符google.com/codesearch/p?hl=en#GBlGDoDYBC4/Maude-2.2/src/…

标签: java c++ data-structures priority-queue multimap


【解决方案1】:

Google Collections 提供了 Multimap 实现。具体来说,TreeMultimap 可以使用比较器根据键、值或两者进行排序。

【讨论】:

  • Google Multimaps 不支持键的排序,这似乎暗示了 C++ 之一,对吧?
  • 我已经更新了我的答案,专门参考 TreeMultimap
【解决方案2】:

试试Apache Commons Collections

MultiHashMap 和 MultiValueMap(从该页面链接)实际上实现了接口。

实际上也有一个Priority Queue,但它被贬值了,取而代之的是buffer package

【讨论】:

    【解决方案3】:

    首先,我会检查 C++ 的多重映射是否确实为 删除 min 元素提供了 O(1)。最常见的映射/优先级队列结构是树形结构,其中 查询 最小元素的复杂度为 O(1),但 删除 的复杂度为 O(log n)。

    也就是说,我认为跳过列表(由 Java 的 ConcurrentSkipListMap 实现)可能给你 O(1) 来删除最小元素,但我'我不确定。评估 ConcurrentSkipListMap 性能时的问题之一是遍历操作“整理”先前删除留下的标记。因此,操作的复杂性实际上可能取决于之前的操作是什么。 (另一方面,在某种程度上,几乎所有算法都是如此:某些数据是否在 CPU 缓存中可能取决于先前的操作是否将其放在那里......)

    附:忘了说:看ConcurrentSkipListMap.pollFirstEntry()

    【讨论】:

    • multimap 的 erase(iterator x) 是摊销常数,所以是的。 priority_queue 的 pop 是 O(log N)。
    • Greg -- 你知道他们使用什么结构吗?
    【解决方案4】:

    std:multimap 将是一个树形结构,这意味着一起添加和删除将是 O(log n)。

    【讨论】:

    • 添加和删除是 O(1) 摊销的。
    • O(1) 用于哈希结构。但是对于一棵树呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多