2015-05-12 4 views
15

Являются ли все неизменные структуры данных в Elixir стойкими? Если нет, то какие из них, а какие нет? Кроме того, как они сравниваются с постоянными структурами данных в Clojure?Имеет ли Elixir постоянные структуры данных, подобные Clojure?

+0

Вы имеете в виду это, верно? http://hypirion.com/musings/understanding-persistent-vector-pt-1 – GavinBrelstaff

ответ

20

Да, большинство из них являются постоянными структурами данных.

Например, списки Elixir связаны списки, и связанный список является вырожденным деревом (оно имеет только один филиал):

Elixir: list = [1, 2, 3, 4] 
Tree: 1 -> 2 -> 3 -> 4 

Каждый раз, когда вы предварять элемент в список, он будет делить его хвост:

Elixir: [0|list] 
Tree: 0 -> (1 -> 2 -> 3 -> 4) 

реализация HashSet и HashDict эликсира основана на постоянных структуры данных Clojure и эффективны дерева. There is some write up on Joseph's blog.

Карты также являются постоянными структурами данных, и они очень интересны, потому что их изменение представления зависит от количества ключей. Если у вас есть маленькие карты, скажем:

%{:foo => 1, :bar => 2, :baz => 3} 

Оно представлено как:

 -------------(:foo, :bar, :baz) 
     | 
(map, keys, values) 
       | 
       ------(1, 2, 3) 

Таким образом, каждый раз при обновлении одного ключа, мы разделяем «ключи» ведро и изменить только значение ведро. Это очень эффективно для небольших карт, но как только вы доберетесь до ~ 20 ключей, в Erlang 18, они меняют свое представление на основе Hash Array Mapped Tries, что похоже на Clojure.

Примечание: кортежи не являются постоянными (они представляют собой непрерывное пространство в памяти). Как только вы меняете один элемент в кортеже, создается совершенно новый кортеж. Это делает их отличными для хранения и доступа к нескольким элементам, а также для сопоставления шаблонов, но вы определенно не хотите содержать много элементов.

+0

Спасибо! Поэтому основное отличие заключается в том, что нет постоянных векторов/кортежей. Есть ли запись свойств списка эликсиров? Является ли счет O (1)? Что означает конец? –

+0

Здесь найден ответ, длина O (n), добавление к концу - O (n). Любой план реализации постоянных векторов? –

+2

В настоящее время у вас есть два варианта: используйте модуль «массив» Эрланга или используйте карты как векторы (ключи - это числа). Второй вариант будет недостаточным, если вы хотите сделать очень конкретные векторные операции. Мы обсуждали вопрос о добавлении векторов, но в настоящее время это не относится к «дорожной карте». –

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