【发布时间】:2011-10-17 10:04:26
【问题描述】:
给定一个 T 类型(例如 Vector 或 List)元素的大型集合(我们称之为“a”)和评估函数“f”(例如,(T) => Double)我想推导出来自“a”的结果集合“b”,其中包含“a”的 N 个元素,这些元素导致 f 下的最大值。集合“a”可能包含重复项。未排序。
也许暂时搁置可并行性(map/reduce 等)的问题,用于编译结果集合“b”的合适 Scala 数据结构是什么?感谢您的任何指示/想法。
注意事项:
(1) 我想我的用例可以最简洁地表达为
val a = Vector( 9,2,6,1,7,5,2,6,9 ) // just an example
val f : (Int)=>Double = (n)=>n // evaluation function
val b = a.sortBy( f ).take( N ) // sort, then clip
除了我不想对整个集合进行排序。
(2) 一个选项可能是对“a”的迭代,它用“手动”大小边界填充 TreeSet(拒绝比集合中最差的项目更糟糕的任何内容,不要让集合增长超过 N)。但是,我想在结果集中保留原始集中存在的重复项,因此这可能行不通。
(3) 如果有序多集是正确的数据结构,是否有 Scala 实现?或者二进制排序的向量或数组,如果结果集相当小?
【问题讨论】:
-
集合应该针对哪些操作进行优化?
-
@Jesper 用于集合'b':O(logN) 插入,O(1) 最后和第一个元素,O(1) 大小。我想带有二进制排序的 Vector 包装器可能会解决问题,因为我希望结果集相对较小(可能 N=100 个元素)。
标签: scala data-structures functional-programming