【问题标题】:Preferred Scala collection for progressively removing random items?用于逐步删除随机项目的首选 Scala 集合?
【发布时间】:2011-10-14 15:57:11
【问题描述】:

我有一个算法需要多次迭代,每次迭代都会对集合中的项目进行评分并删除得分最高的项目。

我可以用初始填充填充Vector,不断将其替换为var,或者选择一个可变集合作为val。哪个可变集合最符合要求?

【问题讨论】:

  • 物品的顺序重要吗?
  • 是的 - 它们按优先级顺序排列,但是我必须选择符合其他标准的最高优先级,因此我们可能会在找到要删除的那个之前按照列表的顺序进行操作。
  • 大概有多少次迭代,初始集合有多大?进程会一直运行到集合中只剩下一个元素,还是元素比迭代多得多?
  • 哦,评分函数的计算成本高吗?
  • 另一个要问的问题是您是否真的需要立即删除元素,或者您是否可以忽略已评分的元素然后执行在某个时候进行批量清理。

标签: scala scala-collections


【解决方案1】:

您可以考虑使用DoubleLinkedList,它有一个方便的remove() 方法来删​​除当前列表单元格。

【讨论】:

  • 我没有在我的拖网中看到 DoubleLinkedList - 我认为它最适合一般的订购收集清单,而且价格便宜。如果您删除 ListBuffer 部分,我可以接受答案:-)
  • 好的,我有机会在愤怒中尝试这个,实际上失去头部的并发症意味着它比应该的要复杂得多 - 你必须退回到控股var 中的集合。
【解决方案2】:

我认为Map(或其近亲,Set)可能会做得很好。它没有 indexed 访问权限,但这似乎不是您想要的。如果你选择TreeMap,你甚至会得到一个有序的集合。

但是,我能否指出您的算法似乎需要Heap?堆针对重复查找/删除最大元素(或最小值,如果您反转构建堆的比较)进行了优化。 Scala 没有现成的堆,但堆很容易用数组实现。

【讨论】:

  • 我的问题是无法预先计算最终分数,但我确实有一个初始排序。使用 DoubleLinkedList 时查看堆显示它的性能,谢谢。
  • @dcsobral 如果您指的是二进制堆,Scala 有 mutable.PriorityQueue 类,就是这样。
  • PriorityQueue 等仅允许您从顶部弹出项目,而不是在您有其他条件时搜索。我想到了TreeMap,但它不是可变的。不确定可变对应物是什么,但如果随后没有添加任何项目,我看不出树比排序的 DoubleLinkedList
  • @axel22 我不知道它是作为堆实现的。
猜你喜欢
  • 2015-05-12
  • 2020-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-07
  • 1970-01-01
  • 1970-01-01
  • 2010-12-24
相关资源
最近更新 更多