2016-12-02 60 views
1

在我的代码中,我使用不同类型的集合并经常将其转换为另一种类型。我可以轻松地拨打toListtoVector,toSet,toArray的功能。转换集合性能

现在我对这个操作的性能感兴趣。我找到有关length,head,tail,applydocumentation表现的信息。当我调用List,Set,ArrayVector执行在scala中的函数(toList,toVector,toSet,toArray)时究竟发生了什么?

P.S.问题只是关于不可变的标准scala集合。

+0

如果你很高兴看到scala源代码:https://github.com/scala/scala/tree/2.12.x/​​src/library/scala/collection – Pavel

+0

@Pavel我尝试阅读它我可以'理解它,一个好的解释会很好,你不这么认为吗?每个人都可以谷歌这个问题,并得到基本的想法,是不是很好? –

+0

如果你不明白任何特定的代码段,你可以自由更新你的答案和更多细节。这里有足够多的人会很乐意提供帮助。请更具体一些。谢谢 – Pavel

回答

2

那么我的建议是:看看你自己的源代码!例如,方法toSet被定义为遵循TraversableOnce性状(由我自己注释):

def to[Col[_]](implicit cbf: CanBuildFrom[Nothing, A, Col[A @uV]]): Col[A @uV] = { 
    val b = cbf() //generic way to build the collection, if it would be a List, it would create an empty List 
    b ++= seq // add all the elements 
    b.result() //transform the result to the target collection 
    } 

因此,这意味着该toSet方法具有O(N)性能,因为你一旦遍历所有列表!我相信所有继承这个特质的集合都使用这个实现。

+2

不完全...如果插入到一个集合将需要一段时间,你会是正确的。所以要完成:需要'O(n * <插入1个元素>的时间)'。因此,如果使用BST实现'Set','toSet'函数将是'O(n log(n))'。 – irundaia

+0

非常真实:)谢谢你指出 –