2016-12-02 50 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

非常真實:)謝謝你指出 –