我想要从数组中选择 n 个唯一的元素,其中数组大小通常为 1000,n 的值为 3。我希望使用迭代算法来实现,在约 3000000 次迭代中,每次迭代必须获取 n 个唯一的元素。下面是我发现的一些可用解决方案,但由于其缺点而不能使用,具体如下。
import scala.util.Random
val l = Seq("a", "b", "c", "d", "e")
val ran = l.map(x => (Random.nextFloat(), x)).sortBy(_._1).map(_._2).take(3)
这种方法比较慢,因为需要创建三个数组并对数组进行排序。
val list = List(1,2,3,4,5,1,2,3,4,5)
val uniq = list.distinct
val shuffled = scala.util.Random.shuffle(uniq)
val sampled = shuffled.take(n)
生成了两个数组,打乱较大的数组的过程速度较慢。
val arr = Array.fill(1000)(math.random )
for (i <- 1 to n; r = (Math.random * xs.size).toInt) yield arr(r)
这是一种更快的技术,但有时会返回相同的元素多次。这是输出结果。
val xs = List(60, 95, 24, 85, 50, 62, 41, 68, 34, 57)
for (i <- 1 to n; r = (Math.random * xs.size).toInt) yield xs(r)
res: scala.collection.immutable.IndexedSeq[Int] = Vector( 24 , 24 , 41)
可以观察到24被返回了2次。
我该如何修改最后的方法以获取唯一元素?有没有其他更优化的方式执行相同的任务?