从 Scala 中的 Seq 中选择元素子集的有效方法

塞尔隆

我有一个序列

val input = Seq(1,3,4,5,9,11...)

我想随机选择它的一个子集。最快的方法是什么。

我目前是这样实现的:

//ratio是子组占全组的百分比

def randomSelect(ratio:Double): Boolean = {

   val rr=scala.util.Random
   if (rr.nextFloat() < ratio) true else false

}



val ratio = 0.3
val result = input.map(x=>(x, randomSelect(ratio))).filter(x._2).map(x=>x._1)

所以我首先为每个元素附加一个真/假标签,并过滤掉那些假元素,并取回序列的子集。

有没有更快/优势的方式?

霍伊兰

所以基本上有两种方法:

  • n随机选择元素
  • 以概率包含或排除每个元素 p

您的解决方案是后者,可以简化为:

l.filter(_ => r.nextFloat < p)

(从现在开始,我正在调用列表、l实例Random r和您的比率p。)

如果你想对n元素进行精确采样,你可以这样做:

r.shuffle(l).take(n)

我比较了从 1000 个元素列表中选择 200 个元素的这些:

scala> val first = time{
 | l.map(x => (x, r.nextFloat < p)).filter(_._2).map(_._1)
 | }
 Elapsed time: 3249507ns

scala> val second = time {
 | r.shuffle(l).take(200)
 | }
 Elapsed time: 10640432ns

scala> val third = time{
 | l.filter(_ => r.nextFloat < p)}
Elapsed time: 1689009ns

删除额外的两个mapss 似乎可以将速度提高大约三分之一(这是完全有道理的)。shuffle-and-take 方法要慢得多,但可以保证你有固定数量的元素。

如果您想进行更严格的调查(即多次试验的平均值,而不是 1),我从这里借用了计时函数

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Scala中从seq到_ *

来自分类Dev

什么是在HashMap中获取元素子集的有效方法?

来自分类Dev

在Scala的Seq中添加项目

来自分类Dev

在Scala中遍历Seq并找到满足条件的元素

来自分类Dev

Scala中Seq()中的不同参数

来自分类Dev

在Scala中获取随机元素的有效方法?

来自分类Dev

在Scala中获取随机元素的有效方法?

来自分类Dev

Scala中的两个Seq比较

来自分类Dev

获取 Option[Seq[Seq]] 中的元素值

来自分类Dev

Scala - 是否有映射 Seq[A] => Seq[Either[Throwable, B]] 的函数?

来自分类Dev

从Java将Scala Seq传递到Scala函数中

来自分类Dev

从Java将Scala Seq传递到Scala函数中

来自分类Dev

通过属性从Scala Seq(列表)获取元素

来自分类Dev

有没有一种简单的方法可以在Scala的嵌套Seq中默认出界?

来自分类Dev

在Scala中决定使用foldleft()还是Seq.newBuilder

来自分类Dev

zipAll Seq后在Scala中反序列化对象

来自分类Dev

如何从nashorn中创建一个Scala Seq [String]()?

来自分类Dev

通过Scala中的另一个Seq更新Seq的特定索引

来自分类Dev

如何在Scala中轻松将IndexedSeq [Array [Int]]转换为Seq [Seq [Int]]?

来自分类Dev

检查可遍历在Scala中是否包含1个以上元素的有效方法

来自分类Dev

Scala:从Seq中删除一个元组的最佳方法,其中一个值为None

来自分类Dev

Scala .seq与.toSeq

来自分类Dev

Scala 选项[Seq[A]] 存在

来自分类Dev

如何转换 Scala 集合类型?如 Seq[Any] 到 Seq[(String, String)] 没有警告

来自分类Dev

使用seq子集r中的奇数行

来自分类Dev

使用seq子集r中的奇数行

来自分类Dev

玩!带有Scala的框架-表单seq(text)绑定

来自分类Dev

如何在Scala中用另一个Seq中的值替换一个Seq中的值?

来自分类Dev

Scala并行Seq不转换为Seq

Related 相关文章

  1. 1

    在Scala中从seq到_ *

  2. 2

    什么是在HashMap中获取元素子集的有效方法?

  3. 3

    在Scala的Seq中添加项目

  4. 4

    在Scala中遍历Seq并找到满足条件的元素

  5. 5

    Scala中Seq()中的不同参数

  6. 6

    在Scala中获取随机元素的有效方法?

  7. 7

    在Scala中获取随机元素的有效方法?

  8. 8

    Scala中的两个Seq比较

  9. 9

    获取 Option[Seq[Seq]] 中的元素值

  10. 10

    Scala - 是否有映射 Seq[A] => Seq[Either[Throwable, B]] 的函数?

  11. 11

    从Java将Scala Seq传递到Scala函数中

  12. 12

    从Java将Scala Seq传递到Scala函数中

  13. 13

    通过属性从Scala Seq(列表)获取元素

  14. 14

    有没有一种简单的方法可以在Scala的嵌套Seq中默认出界?

  15. 15

    在Scala中决定使用foldleft()还是Seq.newBuilder

  16. 16

    zipAll Seq后在Scala中反序列化对象

  17. 17

    如何从nashorn中创建一个Scala Seq [String]()?

  18. 18

    通过Scala中的另一个Seq更新Seq的特定索引

  19. 19

    如何在Scala中轻松将IndexedSeq [Array [Int]]转换为Seq [Seq [Int]]?

  20. 20

    检查可遍历在Scala中是否包含1个以上元素的有效方法

  21. 21

    Scala:从Seq中删除一个元组的最佳方法,其中一个值为None

  22. 22

    Scala .seq与.toSeq

  23. 23

    Scala 选项[Seq[A]] 存在

  24. 24

    如何转换 Scala 集合类型?如 Seq[Any] 到 Seq[(String, String)] 没有警告

  25. 25

    使用seq子集r中的奇数行

  26. 26

    使用seq子集r中的奇数行

  27. 27

    玩!带有Scala的框架-表单seq(text)绑定

  28. 28

    如何在Scala中用另一个Seq中的值替换一个Seq中的值?

  29. 29

    Scala并行Seq不转换为Seq

热门标签

归档