在元组中找到最小元素的最佳方法
Best way to find min of element in tuple
我在 scala 中有一个三元组数组:(a:Int, b:Int, val:Double)
,我需要 return 一个数组,所有对 (a, b)
的最小值 [=13] =].我很清楚如何通过转到地图来做到这一点:
a.map(t => ((t._1,t ._2), t._3)).groupBy(_._1).mapValues(_.map(_._2).min).toArray
但出于内存优化的目的,我想避免映射。有没有不使用 Map 的简洁方法?
尝试 groupMapReduce
,它的作用完全相同,但一次通过:
tuples.groupMapReduce(t => (t._1, t._2))(_._3)(_ min _)
可运行示例:
val tuples = List(
(0, 0, 58),
(1, 1, 100),
(0, 0, 1),
(0, 1, 42),
(1, 0, 123),
(1, 0, 3),
(0, 1, 2),
(1, 1, 4)
)
tuples.groupMapReduce(t => (t._1, t._2))(_._3)(_ min _).foreach(println)
输出:
((0,0),1)
((1,1),4)
((1,0),3)
((0,1),2)
与您的解决方案相比,它应该严格减少 GC 的负载,因为它不会为分组值生成任何中间列表,也不会为 [=15= 中的 map
ped 分组值生成任何中间列表]-进入您的原始解决方案。
它并没有完全消除中间Map
,但除非你能提供任何更有效的结构来存储值(例如二维数组,通过限制可能的a
s 和 b
s 相对较小且严格为正),Map
的出现似乎或多或少是不可避免的。
我在 scala 中有一个三元组数组:(a:Int, b:Int, val:Double)
,我需要 return 一个数组,所有对 (a, b)
的最小值 [=13] =].我很清楚如何通过转到地图来做到这一点:
a.map(t => ((t._1,t ._2), t._3)).groupBy(_._1).mapValues(_.map(_._2).min).toArray
但出于内存优化的目的,我想避免映射。有没有不使用 Map 的简洁方法?
尝试 groupMapReduce
,它的作用完全相同,但一次通过:
tuples.groupMapReduce(t => (t._1, t._2))(_._3)(_ min _)
可运行示例:
val tuples = List(
(0, 0, 58),
(1, 1, 100),
(0, 0, 1),
(0, 1, 42),
(1, 0, 123),
(1, 0, 3),
(0, 1, 2),
(1, 1, 4)
)
tuples.groupMapReduce(t => (t._1, t._2))(_._3)(_ min _).foreach(println)
输出:
((0,0),1)
((1,1),4)
((1,0),3)
((0,1),2)
与您的解决方案相比,它应该严格减少 GC 的负载,因为它不会为分组值生成任何中间列表,也不会为 [=15= 中的 map
ped 分组值生成任何中间列表]-进入您的原始解决方案。
它并没有完全消除中间Map
,但除非你能提供任何更有效的结构来存储值(例如二维数组,通过限制可能的a
s 和 b
s 相对较小且严格为正),Map
的出现似乎或多或少是不可避免的。