2011-12-25 3 views
2

Отредактировано после примечания Алекса Таггарта ниже.Простой обход дерева и быстрый доступ к случайным узлам

Я использую молнию, чтобы легко перемещаться и редактировать дерево, которое может вырасти до многих тысяч узлов. Каждый узел является неполным, когда он сначала создается. Данные будут добавляться/удаляться все время в случайных позициях, листовые узлы будут заменены ветвями и т. Д.

Дерево может быть очень неуравновешенное. Быстрый случайный доступ к узлу также важен.

Реализация должна состоять в том, чтобы пересечь дерево с помощью застежки-молнии и создать хеш-таблицу узлов, проиндексированных ключом. Само собой разумеется, выше было бы крайне неэффективно, как: должны быть созданы

  • любые изменения

    • 2 копии каждого узла должны быть последовательно отражается между структурами данных (2 дерева и HashMap).

    Вкратце, есть ли эффективный способ времени/пространства для объединения легкости перемещения/обновления с помощью молнии и быстрого доступа к хеш-таблице в clojure?

  • +0

    Застежка-молния не является структурой данных, это способ перемещения и изменения структуры данных. Учитывая, что ваш вопрос не совсем понятен. Кроме того, «эффективный» не определен. –

    +0

    «Эффективный», поскольку он не имеет нескольких копий того же самого, что есть в памяти и не требует обновления двух структур данных для каждого редактирования. – kliron

    ответ

    2

    Структуры данных Clojure являются постоянными и используют структурное разделение. Это означает, что операции, такие как добавление, удаление или накопление, не так эффективны, как вы описываете. Стоимость памяти будет минимальной, поскольку вы не дублируете то, что уже есть.

    По умолчанию структуры данных Clojure неизменяемы. Таким образом, узлы в вашей структуре, подобной дереву, не будут обновляться, если вы не используете какой-то ссылочный тип (например, Var). Я не знаю достаточно о вашем конкретном случае использования, чтобы советоваться о наилучшем способе доступа к узлам. Один из способов доступа к узлам во вложенной структуре - это get-in function, где вы указываете путь к узлу, чтобы вернуть его значение.

    Надеюсь, это поможет решить вашу проблему.

    +0

    Да, я знал о структурном разделении и всей неизменности. приезд оказался ближе всего к тому, что мне нужно было сделать. Это был глупый вопрос, потому что я использовал неправильный инструмент для выполнения этой задачи. – kliron

    +0

    Просто любопытно, какой инструмент вы в конечном итоге использовали? И почему это было лучше? –

    +0

    Проблема заключалась в реструктуризации произвольно больших XML-деревьев, где требовался мелкозернистый контроль (извлечение определенных атрибутов на определенных позициях и реструктуризация документа путем сортировки значений определенных атрибутов при определенных условиях.) Использование застежек-молний для разбора/извлечения было бит переборки. Использование XPath/XSLT было лучше подходит и дало приемлемую производительность. Рад, что я потратил время на это. – kliron