List 获取最大大小列表的有效方法

List 获取最大大小列表的有效方法,list,scala,scala-collections,List,Scala,Scala Collections,我有一个包含字符串和整数列表的scala列表。我只想过滤那些整数列表中最大的。通常从最高和最低排序,然后取n个字符串的方法有一个缺点 var qq = List[(String,List[Int])]() 例如,一个长度为10的列表,有6个列表的大小为65,其余5个列表的大小小于65。现在我需要从向量中检索所有6个列表 方法:传统的方法是对列表进行排序,获取最高列表的大小,并添加具有该大小的过滤条件 var max = qq.sortWith(_._2.size>_._2.size).h

我有一个包含字符串和整数列表的scala列表。我只想过滤那些整数列表中最大的。通常从最高和最低排序,然后取n个字符串的方法有一个缺点

var qq = List[(String,List[Int])]()
例如,一个长度为10的列表,有6个列表的大小为65,其余5个列表的大小小于65。现在我需要从向量中检索所有6个列表

方法:传统的方法是对列表进行排序,获取最高列表的大小,并添加具有该大小的过滤条件

var max = qq.sortWith(_._2.size>_._2.size).head._2.size //get maximum size
var filList = qq.filter(p=>p._2.size>=max) //filter them
我的问题是,在scala中还有其他快速有效的方法吗?因为我会用更大的列表大小完成大约10000-20000次这个过程。

我建议

val sorted = qq.sortBy(_._2.size)
val thresh = sorted.head._2.size  // assume qq is non-empty
val retain = sorted.takeWhile(_._2.size == thresh)
在任何情况下,性能都受到排序过程的约束(当然比O(N)差)


另一种方法是建立结果而不进行排序。只需跟踪最佳结果,并在检测到较大的列表时替换它们

像这样:

type A = (String,List[Int])

((0, List.empty[A]) /: qq) { case (prev @ (bestLen, res), entry @ (_, list)) =>
  val eLen = list.size
  if      (eLen <  bestLen) prev
  else if (eLen == bestLen) (bestLen, entry :: res)
  else                      (eLen, entry :: Nil)
}
type A=(字符串,列表[Int])
((0,List.empty[A])/:qq){case(prev@(bestLen,res),entry@(u,List))=>
val eLen=list.size
if(eLen

性能将是O(N),尽可能好。

对于性能,如果只需要最大值,则不应对整个列表进行排序

其次,在Scala中编写多线程代码非常容易:

  val data = List(("a", List(1, 2, 3)), ("b", List(4, 5)), ("c", List(45, 3, 2)))
  val maxListSize = data.par.map(_._2.size).max
  val largestLists = data.par.filter(_._2.size == maxListSize)
  println(largestLists)

只需添加
.par
(并行收集)即可实现多线程。请注意,除非您有非常大的列表,否则您可能希望删除那些
.par
,因为它们可能会减慢速度。对于大型列表,并行化将提供一个加速因子,即您机器上的内核数。

@totot2-对,尽管存在并行化。但如果我们假设C=核数是一个常数,这仍然是O(N):)真的。Big-O表示法不关心常数:-嗯,它将提供一个不超过可用内核数量的加速。或者,正如广告类型所说的“最多废话废话!”(其中包括零…)。我不知道是否阅读了我的全部帖子,但我确实提到,对于小名单,它实际上可能会减慢速度。如果列表非常大,它将提供一个接近内核数量的加速因子。为什么要讽刺多线程代码?讽刺只针对广告客户,但你的回答并不准确(“是核心数…”),尽管在评论中你说“渐进接近”,你更准确。你能用O(1)长度检索将内部列表切换到集合吗?比如向量。