Я читал, что векторы - это не последовательности, а списки. Я не уверен, в чем причина использования одного над другим. Кажется, что чаще всего используются векторы, но есть ли для этого причина?
Когда в Clojure следует использовать вектор поверх списка и наоборот?
Ответы (5)
И снова, похоже, я ответил на свой вопрос, проявив нетерпение и задав его в #clojure на Freenode. На Stackoverflow.com рекомендуется отвечать на собственные вопросы: D
Я быстро поговорил с Ричем Хики, и вот его суть.
[12:21] <Raynes> Vectors aren't seqs, right?
[12:21] <rhickey> Raynes: no, but they are sequential
[12:21] <rhickey> ,(sequential? [1 2 3])
[12:21] <clojurebot> true
[12:22] <Raynes> When would you want to use a list over a vector?
[12:22] <rhickey> when generating code, when generating back-to-front
[12:23] <rhickey> not too often in Clojure
Если вы много занимались программированием на Java и знакомы со средой сбора данных Java, подумайте о списках, таких как LinkedList
, и векторах, таких как ArrayList
. Таким образом, вы можете выбирать контейнеры таким же образом.
Для дальнейшего пояснения: если вы намереваетесь добавлять элементы по отдельности в начале или в конце последовательности, связанный список намного лучше, чем вектор, потому что элементы не нужно каждый раз перемещать. Однако, если вы хотите часто обращаться к определенным элементам (не в начале или в конце списка) (т. Е. Произвольный доступ), вам следует использовать вектор.
Кстати, векторы легко превратить в seqs.
user=> (def v (vector 1 2 3))
#'user/v
user=> v
[1 2 3]
user=> (seq v)
(1 2 3)
user=> (rseq v)
(3 2 1)
ArrayList
без эффективной реализации ArrayDeque
самостоятельно.
- person Chris Jester-Young; 20.01.2015
Векторы имеют время произвольного доступа O (1), но они должны быть заранее выделены. Списки можно расширять динамически, но доступ к случайному элементу составляет O (n).
Когда использовать вектор:
- Производительность индексированного доступа - вы получаете ~ O (1) стоимость для индексированного доступа по сравнению с O (n) для списков
- Добавление - с конгидом ~ O (1)
- Удобные обозначения - мне легче набирать и читать [1 2 3], чем '(1 2 3) для буквального списка в обстоятельствах, когда любой из них будет работать.
Когда использовать список:
- Если вы хотите получить к нему доступ как к последовательности (поскольку списки напрямую поддерживают seq без необходимости выделять новые объекты)
- Преобразование - добавление в начало списка с помощью минусов или, желательно, константы O (1)
~O(1)
, для тех, кому это объяснение стоимости может быть полезно - stackoverflow.com / questions / 200384 / constant-amortized-time
- person Merlyn Morgan-Graham; 29.03.2016
just a quick side note:
"I read that Vectors are not seqs, but Lists are."
последовательности являются более универсальными, чем списки или векторы (или карты или наборы).
К сожалению, REPL печатает списки и последовательности одинаково, потому что это действительно делает вид, будто списки являются последовательностями, даже если они разные. функция (seq) будет создавать последовательность из множества разных вещей, включая списки, и затем вы можете передать эту последовательность любой из множества функций, которые делают отличные вещи с помощью seqs.
user> (class (list 1 2 3))
clojure.lang.PersistentList
user> (class (seq (list 1 2 3)))
clojure.lang.PersistentList
user> (class (seq [1 2 3]))
clojure.lang.PersistentVector$ChunkedSeq
У Sec есть ярлык, который возвращает свой аргумент, если это уже seq:
user> (let [alist (list 1 2 3)] (identical? alist (seq alist)))
true
user> (identical? (list 1 2 3) (seq (list 1 2 3)))
false
static public ISeq seq(Object coll){
if(coll instanceof ASeq)
return (ASeq) coll;
else if(coll instanceof LazySeq)
return ((LazySeq) coll).seq();
else
return seqFrom(coll);
}
списки - это последовательности, хотя есть и другие вещи, и не все последовательности являются списками.
class
вместо class?
?
- person qerub; 04.08.2012
clojure.lang.PersistentList
для меня. Полагаю, вы хотели написать class
, а не class?
.
- person Adrian Mouat; 25.10.2013
class
возвращает один и тот же PersistentList для обоих упомянутых вами выражений, это означает, что последовательности и списки действительно одно и то же?
- person johnbakers; 03.01.2014