Scala:以随机顺序迭代集合而不创建副本

时间:2014-08-13 02:55:52

标签: scala random collections iteration traversal

Scala中是否有办法获取不可变集合(例如List或Vector)的流/视图/迭代器,它将以随机顺序遍历集合?据我所知,Random.shuffle(coll)创建了一个副本,它不是一种节省内存的方式。 Random.shuffle(coll.view)(或coll.stream或coll.iterator)是一种更好的方法吗?这是否会产生明显的CPU开销?还是有一些更合适的方式?

2 个答案:

答案 0 :(得分:2)

改组算法需要在集合中随机移动,并且需要以某种方式记住过去的选择。对于O(n)来说,不可变集合的随机访问速度不是很快(O(1)而不是ListO(1)可以说是Vector,但常数因子很大)。

相比之下,复制集合几乎总是明智之举。

答案 1 :(得分:2)

如果考虑集合复制,请考虑将Array个索引混合到感兴趣的Vector,例如,

val myVector: Vector[MyObject] = ...

val shuffledIdx = util.Random.shuffle(0 until myVector.size)

这会复制一系列Int,可能打火机而不是专用对象。然后

shuffledIdx.map { idx => task (myVector(idx)) }

以随机顺序迭代/映射myVector中的每个项目。