RubyTree — библиотека для создания древовидных структур данных
ноября 1, 2010 | Published in Ruby Gems | 2 Comments
RubyTree — это библиотека позволяющая создавать и управлять древовидными структурами данных основанными на узлах, где каждый узел является одновременно и значением, и ключем, для доступа к вложенным узлам. Одной из важных особенностей / функций RubyTree является возможность импорта и экспорта в json формат.
Библиотека RubyTree будет интересна для тех, кто разрабатывает какие-либо научные приложения — каталоги, где необходима таксономия, либо приложения, что сейчас набирают популярность, для создания гениалогического дерева и т.д. Кстати, древовидная структура данных используется и во всеми нами любимой Википедии.
Устройство RubyTree.
RubyTree предоставляет модуль Tree, который содержит в себе два класса: TreeNode и BinaryTreeNode, который наследуется от TreeNode и представляет собой ту же структуру, но с ограничением на количество дочерних узлов: их должно быть только 2: левий и правый дочерние узлы.
Установка:
$ gem install rubytree
Примеры использования из официального руководства:
# Начинаем работу с RubyTree. require 'tree' # загружаем библиотеку # Сперва создаем корневой узел. Обратите внимание, что каждый узел обязательно должен иметь имя и (не обязательно) некоторое содержимое. root_node = Tree::TreeNode.new("ROOT", "Содержимое ROOT") # Теперь добавим дочерние узлы. Запомните, что вы можете создавать "цепочки" вложенности любой длины (глубины вложенности). root_node << Tree::TreeNode.new("CHILD1", "Child1 Content") << Tree::TreeNode.new("GRANDCHILD1", "GrandChild1 Content") root_node << Tree::TreeNode.new("CHILD2", "Child2 Content") # Давайте выведем представление нашего дерева на стандартном устройстве вывода (stdout). Это используется прежде всего в целях дебагинга. root_node.print_tree # Теперь давайте непосредственно обратимся к дочерним узлам ROOT и дочерним узлам дочерних узлов ROOT. Здесь мы также можем использовать цепочки любой длины (обращаться к любому уровню иерархии) child1 = root_node["CHILD1"] grand_child1 = root_node["CHILD1"]["GRANDCHILD1"] # Получаем массив всех родных братьев текущего узла. siblings_of_child1 = child1.siblings # Получаем массив всех детей (вложенных узлов первого уровня вложенности) для корня дерева ROOT. children_of_root = root_node.children # Напечатаем "перевернутое" содержимое всех узлов. root_node.each { |node| puts node.content.reverse } # удаляем дочерний узел из корня дерева ROOT root_node.remove!(child1)
RDoc документация по RubyTree
марта 24, 2012 at 14:01 (#)
А есть ли реализация B-деревьев?
марта 27, 2012 at 16:59 (#)
Конкретно в этом геме? Давно не смотрел, но когда им пользовался — не было, да и сейчас их вряд ли добавили. В-деревья как, я понимаю, имеет смысл использовать для хранения данных в БД, а для Ruby зачем они?