【问题标题】:Appropriate collection type for selecting a random element efficiently in Scala在 Scala 中有效选择随机元素的适当集合类型
【发布时间】:2012-01-07 18:06:40
【问题描述】:

对于我正在进行的项目,我需要跟踪多达数千个对象。我选择的集合需要支持随机元素的插入、选择和删除。我的算法多次执行这些操作中的每一个,所以我想要一个可以在恒定时间内完成所有这些操作的集合。

有这样的收藏吗?如果没有,与现有收藏有哪些权衡?我正在使用 Scala 2.9.1。

编辑:“随机”是指数学上/概率上的随机,即我想使用 Random 或其他适当的生成器从集合中随机选择元素。

【问题讨论】:

  • 您的收藏应该能够包含重复项吗?元素的顺序是否相关?
  • @PeterSchmitz,我不会尝试存储重复项,元素的顺序并不重要,因为我只想随机访问它们。
  • 这是performance-wise comparison of scala collections。还要根据您喜欢的编程风格(功能性?“纯”OOP?)以及对您的集合的访问需要有多并行(您是否只有一个线程访问它?)来选择您的选择。
  • 请在您找到可以在恒定时间内完成所有上述操作的集合后告诉我们。
  • 您能否阐明您需要的操作——例如什么是随机元素的插入?如果您在随机索引处添加元素或从随机索引中提取元素,而不是同时要求两者,这还不够吗?因为这样您就可以选择一种支持高效附加或前置以及高效随机访问和删除的数据结构,反之亦然。您需要不可变的还是可变的数据结构?

标签: scala scala-collections


【解决方案1】:

定义“随机”。如果你的意思是索引,那么就没有这样的集合。如果您放弃“随机元素”要求,您可以在恒定时间内进行插入/删除 - 即,您对将被删除或将成为插入点的元素进行非常量的查找。或者,您可以在没有不断插入/删除的情况下进行不断查找。

最能满足该要求的集合是Vector,它为这些操作提供O(log n)

另一方面,如果您有要查找或删除的元素,则只需选择 HashMap。这不是精确恒定时间,但它是一个公平的近似值。只要确保你有一个好的散列函数。

【讨论】:

【解决方案2】:

首先,看看The Scala 2.8 Collections API,尤其是Performance Characteristics

【讨论】:

    猜你喜欢
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 2017-05-17
    • 1970-01-01
    • 2015-01-17
    相关资源
    最近更新 更多