Какую структуру данных использовать для реализации семейного дерева в ruby? - PullRequest
0 голосов
/ 09 октября 2019

Я пытаюсь создать простое генеалогическое дерево в ruby, в которое я мог бы добавлять детей через материнские узлы. Также, когда я даю имя и отношение в качестве входных данных, я должен иметь возможность получать выходные данные в виде имен людей, связанных с данным именем человека. Например, я должен иметь возможность выполнять такие операции, как add_child('Tina', 'bob') // which will add bob as a child node to Tina get_relation(bob, maternal_uncles) // which should output all the siblings of Tina in this case.

Какая структура данных лучше всего подходит для реализации этого и как реализовать это в ruby? В своем исследовании я обнаружил, что график - это хороший подход, и я изучал его реализацию в течение 2 дней, но не смог найти никакого решения.

Я попробовал следующие библиотеки

RubyTree https://github.com/evolve75/RubyTree - Это помогло мне установить отношения с родителями, братьями и сестрами, бабушкой и дедушкой, но я не мог придумать, как я могу использовать это, чтобы установить такие отношения, как братья отца (дядя по отцовской линии), сестры жены (невестка) и т. Д.

weighted graph https://github.com/msayson/weighted_graph - я использовал 0 для представления супруга и 1 для представления детей. Я не мог никуда идти отсюда. Я запутался в том, как получить родителей и детей данного человека.

Я немного изучил вопросы о ruby prefix trees и rgl gem, но не смог применить их к своему заявлению.

Пожалуйста, помогите. Заранее спасибо!

1 Ответ

0 голосов
/ 10 октября 2019

Я мог бы найти способ получить минимальные отношения, используя сам RubyTree. RubyTree имеет встроенные методы, такие как parent, siblings, children и т. Д., А также мы можем передавать контент на узлы. Поэтому я использовал это, чтобы получить то, что я хочу. Например, для создания супруга (супруга) я создал дочерний узел для корневого узла и передал хеш, как {relation: spouse} в содержимом. Таким образом, я могу применять логику, накладывая условия на этот хеш и получая нужные мне отношения

пример:

tina = Tree::TreeNode.new('Tina', {gender: 'female', relation: 'root'})
mike = tina << Tree::TreeNode.new('Mike', {gender: 'male', relation: 'spouse'}) 
sofi = tina << Tree::TreeNode.new('sofi', {gender: 'female', relation: 'child'})
...... #add all children and their children like this

puts "--------siblings of sofi--------"
siblings_of_sofi.each do |sib|
    if sib.content[:relation] == 'child'
        puts sib.name
    end
end

# assume tina has 4 sons and one of them is bob and alice is daughter of bob. 
puts "--------alice paternal uncles--------"
puts alice.parent.name
puts alice.parent.content
if alice.parent.content[:relation] == 'spouse'
    father = alice.parent.parent #as per the question child should be added through mother only, therefore alice is added as a child to bob's wife and bob's wife is added as a child to bob as {relation: spouse}
    uncles = father.siblings
    uncles.each do |uncle|
        puts uncle.name if uncle.content[:gender] == 'male' && uncle.content[:relation] == 'child'
    end

end
...