2016-12-02 5 views
1

В моем коде я работаю с различными типами коллекций и часто конвертирую один в другой. Я делаю это легко позвонить toList, toVector, toSet, toArray функции.Преобразование производительности коллекций

Теперь меня интересует выполнение этих операций. Я нахожу информацию о length, head, tail, apply производительность в documentation. Что на самом деле происходит, когда я звоню функции (toList, toVector, toSet, toArray) на List, Set, Array и Vector реализации в Скале?

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 элемента>)». Поэтому в случае, если 'Set' реализован с использованием BST, функция' toSet' будет 'O (n log (n))'. – irundaia

+0

Очень верно :) спасибо за указание на это –