【问题标题】:Give me a practical use-case of Multi-set给我一个Multi-set的实际用例
【发布时间】:2011-02-01 05:47:36
【问题描述】:

我想知道一些实际用例(如果它们与任何编程语言无关/绑定会更好)。我可以将集合、列表和映射与实际用例相关联。

例如,如果您想要一本书的词汇表,其中您想要的术语按字母顺序列出,并且位置/页码是值,您可以使用集合 TreeMap(OrderedMap 这是一个地图)

不知何故,我无法将 MultiSet 与任何“实用”用例相关联。有人知道有什么用途吗?

http://en.wikipedia.org/wiki/Multiset 没有告诉我足够的信息:)

PS:如果你们认为这应该是社区 wiki 的,那也没关系。我没有这样做的唯一原因是“有一个明确的客观方法可以回答这个问题”。

【问题讨论】:

  • 到目前为止,这里没有答案实际上给出了很好的解释。购物车只是一个映射Item -> Count,一个普通的字典。当我们还发现它们对“集合并集”和“集合交集”的广义定义时,多重集 OTOH 在上下文中变得非常有用。
  • @Kos:我同意没有令人满意的答案,因为人们只能使用 List 而不是 Multiset。但是即使对于联合和交集,多重集不会有O(n*n) 或者如果实施得好,O(n*log n) 比较?它比 List/Array 好在哪里?

标签: collections guava


【解决方案1】:

多重集在很多情况下都非常有用,因为在这些情况下,您本来会拥有地图。以下是三个示例。

假设您有一个带有访问器 getType() 的类 Foo,并且您想知道,对于 Foo 实例的集合,每种类型有多少。

同样,系统可以执行各种操作,您可以使用 Multiset 来跟踪每个操作发生的次数。

最后,判断两个集合是否包含相同的元素,忽略顺序但注意实例重复的频率,只需调用

HashMultiset.create(collection1).equals(HashMultiset.create(collection2))

【讨论】:

    【解决方案2】:

    很多应用程序。例如,想象一个购物车。这可以包含一个项目的多个实例 - 即 2 个 cpu、3 个图形板等。所以它是一个多集。一个简单的实现是同时跟踪每个项目的数量 - 即保持 info 2 cpu、3 个图形板等。

    我相信你可以想到很多其他的应用程序。

    【讨论】:

      【解决方案3】:

      购物车是一个多集。当您想购买多个时,可以将同一商品的多个实例放入购物车。

      【讨论】:

      • 但是地图(例如map<string, int>item -> count 映射)在这里不是更好的选择吗?也许对于一个非常特殊的情况,你肯定知道重复是非常罕见的,这可能比空间消耗更有优势。但对于一般情况,map 更适合。
      • @Sumudu 是的,这就是您通常实现MultiSet 的方式。
      【解决方案4】:

      在数学的某些领域,一个集合被视为一个多重集合。例如,在线性代数中,在测试线性相关性时,将一组向量作为一个多重集。 因此,这些字段的实现应该受益于多集的使用。

      你可能会说线性代数不实用,但这是一个完全不同的争论......

      【讨论】:

        猜你喜欢
        • 2017-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多