所以我有这么大的序列,也有很多重复,我需要把它转换成一个没有重复的序列。到目前为止我一直在做的是将序列转换为集合,然后再转换回原始序列。转换到集合摆脱了重复,然后我转换回集合。然而,这是非常缓慢的,因为我已经明白,当转换为set时,每对元素都会被比较,并且使得复杂度为O(n ^ 2),这是不可接受的。因为我可以访问拥有数千个内核的计算机(通过我的大学),所以我想知道并行是否会有所帮助。
最初我以为我会使用scala Futures以下列方式并行化代码。通过哈希码将序列的元素分组为更小的子组。这样,我有一个原始序列的子集合,这样没有元素出现在两个不同的子集合中,并且每个元素都被覆盖。现在我将这些较小的子集合转换为集合,然后返回序列并将它们连接起来。这样我就能保证得到一个没有重复的序列。
但是我想知道在并行序列上应用toSet方法是否已经这样做了。我以为我会在scala解释器中对此进行测试,但是我转换为并行集与转换为非并行集的时间大致相同。 我希望有人可以告诉我转换为并行设置是否有效。我非常感激。感谢。
编辑:在并行集合上执行toSet比在非并行集合上执行toSet更快吗?
答案 0 :(得分:3)
def distinct: Repr = {
val b = newBuilder
val seen = mutable.HashSet[A]()
for (x <- this) {
if (!seen(x)) {
b += x
seen += x
}
}
b.result()
为newBuilder
(自Scala 2.11起)。它使用哈希映射来记录已经看到的内容。通过这种方式,它可以线性地建立一个列表:
<canvas id="myCanvas" width="1300" height="800"></canvas>
(function buildCanvas(settings){
var canvas = document.getElementById('myCanvas');
var context = canvas.getContext('2d');
var ctx = canvas.getContext("2d");
var background = new Image();
background.onload = function() {
context.drawImage(background, 0, 0, 1300, 836);
};
background.src = 'data/skin-army.png';
}
就像一个可变列表。)
答案 1 :(得分:-1)
只是在盒子外思考,你是否有可能阻止这些双重的产生,而不是试图在之后摆脱它们?