Я реализую упорядоченный набор в clojure, где я извлекаю элементы по их рангу. Это означает, что я могу получить 4-й элемент (в соответствии с порядком набора), 3-й или 7-й, все в логарифмическом времени.Как лучше всего интегрироваться с абстракциями clojure?
Для того, чтобы получить свою новую структуру данных интегрированы с общими методами Clojure (или «абстракций»), такие как conj
, get
, nth
и т.д., что это лучший способ сделать это:
- На самом деле реализуйте
conj
, например, в моем протоколе типа данных, или - Внесите богатый Хикки
clojure.lang.IPersistentSet
или какой-нибудь интерфейс.
Первое кажется проще, но также проще испортить семантику функции. Во-вторых, похоже, что я реализую интерфейс, который никогда не должен был быть частью публичного API, а фактические методы, связанные с этим интерфейсом (протоколом), смешиваются по-разному. Например, кажется, что для того, чтобы реализовать conj
с моим набором, я должен реализовать метод cons
clojure.lang.IPersistentSet
, который имеет другое имя. Кажется, у вас мало документации о том, как все это работает, что создает большую проблему при реализации этого ранжированного набора.
Какой из них выбрать? Должен ли я реализовать свои собственные или методы интерфейса clojure.lang
? Если я буду делать последнее, где есть хорошая документация, которая может помочь мне через разводы?
EDIT: Я хочу, чтобы понять, что я пытаюсь сделать набор, из которого вы можете получить любой элемент (или «удалить» его) в логарифмическое время, указав ранга элемента (например, " дайте мне 5-й элемент, mr. set. "). Насколько мне известно, такой набор еще не существует в clojure.
Начиная с версии 0.0.3 карты avl.clj однозначно бывают быстрее для поиска, чем встроенные сортированные карты, и предлагают значительно более быстрое построение больших экземпляров благодаря переходные процессы. Одиночный (непереходный) 'assoc' /' dissoc' медленнее - это затраты на быстрый поиск. –
Как в стороне, почему вы решили использовать дерево AVL над красно-черным деревом? – djhaskin987
@ djhaskin987 Из-за их алгоритмических свойств - деревья AVL предлагают значительно более быстрый поиск за счет более медленных вложений/удалений. Временная поддержка - это способ сделать эти более медленные операции «обновления» приемлемыми в типичных сценариях, связанных с несколькими обновлениями соседних частей дерева. (Разумеется, это компромисс между пространством и временем). –