Написание структур данных, требующих указателей / ссылок в Clojure? - PullRequest
6 голосов
/ 21 ноября 2010

Я работал над базой данных в Clojure и хотел реализовать B + Tree. Когда я начал думать об этом, я понял, что не может быть способа иметь что-то вроде указателя / ссылки на другие узлы в Clojure. Это не имеет значения для чего-то вроде BST или множества других древовидных структур, поскольку все, что вам нужно, это хранить дочерний узел Node. Но что мне делать в чем-то вроде дерева B +, где я должен иметь возможность ссылаться на брата по узлу?

При поиске решений я наткнулся на сообщение в Группах Google о том, как вы не реализуете дважды связанный список в Clojure, потому что в Clojure есть и другие способы ведения дел.

Что мне делать для дерева B +?

Ответы [ 2 ]

3 голосов
/ 21 ноября 2010

Это не так, что трудно иметь ссылки на объекты в ближайшем будущем;но, как правило, эти ссылки неизменны.Это неизменность, которая делает двусвязный список невозможным, потому что в отличие от односвязного списка, вы не можете изменить какую-либо его часть без создания где-либо мутации.

Чтобы увидеть это, предположим, у меня есть односвязный список,

a -> b -> c

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

a'-> b -> c

Но двусвязные списки невозможны.Поэтому в clojure и других функциональных языках мы иногда используем zipper в таких ситуациях.

Теперь предположим, что вам действительно нужны изменяемые ссылки в Clojure - как это сделать?Ну, в зависимости от того, какая семантика параллелизма вам нужна, у clojure есть переменные , ссылки , атомы и т. Д.

Также с deftype , вы можете создавать объекты, которые имеют изменяемые поля, и эти изменяемые поля могут содержать ссылки на другие объекты.Вы также можете использовать необработанные Java-массивы в clojure для этой же цели.

Будет ли ваша база данных базой данных в памяти или базой данных на диске?Если на диске, я думаю, что проблема свиста указателя сложнее, чем наличие изменяемых ссылок.

Возвращаясь к вопросу о функциональных структурах данных, я считаю, что возможносоздавать B-деревья, которые имеют чисто функциональную семантику.Первая подсказка заключается в том, что это дерево, а деревья - это хлебное масло и мясо функциональных структур данных.Во-вторых, обратите внимание, что существуют базы данных, которые работают только в виде дополнений - например, couchDB.Преимущество в том, что база данных - это собственный журнал, в некотором смысле.Чтобы получить более полное представление о стоимости и преимуществах этого подхода, вы можете посмотреть презентацию Славы Ахмечета .Его компания, RethinkDB, в конечном итоге выбрала своего рода гибридный подход, IIRC.

1 голос
/ 22 ноября 2010

Возможно, вы захотите взглянуть на Деревья пальцев Chouser в Clojure, чтобы увидеть, как функциональность списка с двумя связями может быть реализована с использованием функционального стиля.

В качестве альтернативы вы можете просто сделать шаг назад и спросить себя, почему вы считаете, что B + является хорошим выбором структуры данных для функционального языка.

Если вы не знакомы с альтернативами, вы можете обратиться к книге Криса Окадзаки «Чисто функциональные структуры данных».

...