Почему добавление в список плохо?

я недавно начал изучать скала, а ямы встречаем:: (cons) функция, которая добавляется в список.

В книге "Программирование в Scala " в нем говорится, что функции добавления нет, потому что добавление в список имеет производительность o (n), тогда как предварительное добавление имеет производительность o (1)

Что-то не так в этом утверждении.

Isn»t производительность зависит от реализации? Isn»Можно ли просто реализовать список с прямыми и обратными ссылками и сохранить первый и последний элемент в контейнере?

Второй вопрос, который я предполагаю, что яя должен делать, когда у меня есть список, скажем, 1,2,3, и я хочу добавить 4 в конце? "

 krookedking29 июл. 2014 г., 18:19
Isn»t производительность зависит от реализации? ": don 'забудь этоList является конкретным классом в Scala и не имеет ничего общего с JavaList интерфейс.

Ответы на вопрос(5)

потому что требуется только две операции:

Создать новый узел спискаПусть этот новый узел указывает на существующий список

Для добавления требуется больше операций, потому что вам нужно перейти к концу списка, поскольку у вас есть только указатель на заголовок.

Вы никогда не программировали в Scala раньше, но вы можете попробоватьБуфер списка

 José Andias05 июл. 2018 г., 16:58
Обратите внимание, что по порядкуне пройти до концаможно указатель на хвост. Но чем, вам придется изменить указатель в последнем элементе. Для этого потребуются дополнительные операции (например, копия элемента (ов)), так какList неизменен в Скале, как упоминалось в других ответах.

е много элементов в список в подпрограмме, или если вы создаете список, добавляя элементы, функциональная идиома состоит в том, чтобы создать список в обратном порядке, cons 'Принимая предметы нафронт из списка, затем полностью измените его в конце. Это дает вам производительность O (n) вместо O (n²)).

Стоит отметить, что здесь все изменилось.

Сегодня'S Scala, вы можете просто использоватьxs :+ x добавить элемент в конце любой последовательной коллекции. (Существует такжеx +: xs готовиться. Мнемоника для многих из Scala 'S 2.8+ операций сбора является то, чтоседлоидет рядом сседлоразночтение.)

Это будет O (N) со связанной реализацией по умолчаниюList или жеSeq, но если вы используетеVector или жеIndexedSeqЭто будет эффективно постоянное время. в ScalaVector вероятно Скаласамая полезная спискообразная коллекцияв отличие от JavaVector что в основном бесполезно в наши дни.

Если вы работаете в Scala 2.8 или выше,введение коллекций это абсолют должен читать.

Решение Вопроса

x :: somelist не мутируетsomelist, но вместо этого создает новый список, который содержит х, а затем все элементыsomelist, Это можно сделать за O (1) раз, потому что вам нужно только установитьsomelist как преемникx во вновь созданном, односвязном списке.

Если вместо этого использовались двусвязные списки,x также должен быть установлен в качестве предшественникаsomelistголова, которая изменила быsomelist, Так что, если мы хотим быть в состоянии сделать:: в O (1) без изменения исходного списка мы можем использовать только односвязные списки.

Что касается второго вопроса: вы можете использовать::: объединить одноэлементный список в конец вашего списка. Это операция O (n).

List(1,2,3) ::: List(4)
 Jus1202 сент. 2011 г., 13:35
в чем сложность?:::
 sepp2k02 сент. 2011 г., 13:41
@Jus: сложность во время выполнения::: являетсяO(n) гдеn длина первого списка. Так что ты определенно не долженсделать это в цикле.

ным списком, так какЭто удобный неизменяемый тип коллекции. Когда ты сказал "список" на функциональном языке этообычно это то, что вы имеете в виду (односвязный список, обычно неизменный). Для такого типа append - это O (n), а cons - это O (1).

Ваш ответ на вопрос