2016-05-18 3 views
1

Я думаю, что создается новый ImmutableList из N + 1 элементов. Таким образом, его сложность должна быть O (N).Почему ImmutableList имеет сложность O (logN) в методе добавления?

+0

Ну, они решили сделать его более эффективным, чем наивная реализацию. Что в этом плохого? –

+3

Ваша вера в то, что создан новый список с большим количеством элементов, неверен. Помните, что неизменяемость означает, что вы можете * безопасно повторно использовать * части существующей структуры для построения новой структуры. Это повторное использование обеспечивает высокую эффективность во многих сценариях. –

+0

Если вы хотите узнать больше об эффективных чисто функциональных структурах данных, я бы рекомендовал взглянуть на книгу Криса Окасаки. – TheInnerLight

ответ

3

Причина ImmutableList имеет O (журнал N) сложность объясняется here:

Почему неизменные типы более склонны к O (журнал п), где изменяемые типы O (1)? Это следствие внутренних структур данных , которые позволяют совместно использовать экземпляры коллекций. Например, изменяемый HashSet выделяет один массив и сохраняет элементы в , что этот массив имеет индекс, определяемый их хэш-кодом. Это поставщики O (1) время поиска и хранения. Если ImmutableHashSet использовал этот такой же тип хранения данных, то для каждой мутации потребуется , перераспределяющая и копирующая весь массив только для изменения одной записи, , которая бы быстро увеличивала производительность и давление газа, поскольку коллекции стали большими. Вместо этого эти неизменные коллекции используют неизменяемые сбалансированные двоичные деревья для хранения своих данных, , что позволяет очень эффективно использовать обмен данными между мутантными экземплярами коллекций. Однако, как результат , для каждого поиска или изменения требуется обход дерева , который имеет (в худшем случае) алгоритмическую сложность O (log n).

MSDN documentation for ImmutableArray дает некоторое представление и показывает разницу между сложностями ImmutableArray и ImmutableList:

enter image description here

+1

Эта документация находится на 'ImmutableList .Builder.ToImmutable()', который не является обсуждаемым методом. –

+0

Удалена неверная ссылка. Я попытаюсь найти другую документацию MSDN. –

Смежные вопросы