Scala中是否有办法获取不可变集合(例如List或Vector)的流/视图/迭代器,它将以随机顺序遍历集合?据我所知,Random.shuffle(coll)创建了一个副本,它不是一种节省内存的方式。 Random.shuffle(coll.view)(或coll.stream或coll.iterator)是一种更好的方法吗?这是否会产生明显的CPU开销?还是有一些更合适的方式?
答案 0 :(得分:2)
改组算法需要在集合中随机移动,并且需要以某种方式记住过去的选择。对于O(n)
来说,不可变集合的随机访问速度不是很快(O(1)
而不是List
,O(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
中的每个项目。