【发布时间】:2014-12-29 10:22:27
【问题描述】:
所以首先,我完全意识到突变是一个坏主意,但我需要将对象创建降至最低,因为我有大量数据要处理(保持 GC 挂起时间并加快我的代码)。
我想要的是一个 scala 集合,它具有类似distinct 或类似方法的方法,或者可能是一个库或代码 sn-p(但首选本机 scala),以便该方法对集合产生副作用/变异 而不是创建一个新集合。
我已经探索了像ArrayBuffer、mutable.List、Array、MutableList、Vector 这样的常见嫌疑犯,它们都从原始序列“创建一个新序列”,而不是在适当的位置改变原始序列。我是否试图找到不存在的东西?我只需要自己写吗??
我认为这存在于 C++ http://www.cplusplus.com/reference/algorithm/unique/
此外,如果有某种令人敬畏的尾递归方式来执行此操作,那么创建的任何簿记结构都保存在单个堆栈帧中,因此一旦方法退出,该堆栈帧就会从内存中释放。这将是超级酷的原因是,即使该方法创建了一些实例来执行删除重复项,这些实例也不需要被垃圾收集,因此不会导致大量 GC 挂起。它不一定是递归,只要它可能导致对象进入堆栈(参见这里的逃逸分析http://www.ibm.com/developerworks/java/library/j-jtp09275/index.html)
(另外,如果我可以指定并修复集合的容量(内存大小),那就太好了)
【问题讨论】:
-
我认为您必须创建自己的 - 但如果您要使用 Arrays,它可能不会像您希望的那样高效,因为您需要将其余元素是否可以缩小已删除元素的差距?
-
除非您对 O(N^2) 算法感到满意,否则内务处理也不太可能保存在单个堆栈帧中。一般来说,跟踪我们已经看到的元素是 O(N) 并且必须放在某个地方......
-
您需要集合具有哪些属性(例如 O(1) 前置/追加、随机访问...)
-
我只需要它来保存唯一性,以便稍后我可以致电
size以查看有多少个唯一性。我可以使用某种Set,但是这种区分可能会经常发生(可能在每个+上),这是低效的,它只需要在达到某个后备阵列的容量时发生。澄清一下,我希望 distinct 操作更快,但集合本身可能只有几个 100 个整数,但实际上我需要数十亿个这样的集合。 -
@samthebest "...区分可能会经常发生(可能在每个 + 上)..." 是的,但是使用哈希键在树中查找最大深度为 5 的元素是没那么贵。
标签: scala