मेरे पास एक शाखा मॉडल है जिसमें parent_id और child_id शामिल हैं। मैं अपने बच्चों के लिए प्रत्येक माता-पिता से पूछताछ किए बिना माता-पिता/बच्चों के संबंधों की एक सरणी प्राप्त करना चाहता हूं।

इस तालिका के लिए:

Parent_id | Child_id
1         | 2
1         | 6
1         | 9
2         | 3
3         | 10
4         | 7

मैं 1 के बच्चे और उसके बच्चों के बच्चे इस तरह प्राप्त करना चाहता हूं:

{2 => {3 => {10}}, 6, 9}

अपने बच्चों के लिए प्रत्येक माता-पिता से पूछे बिना।

क्या इसे कुशलता से हासिल करने के लिए कोई एल्गोरिदम है या क्या मुझे प्रत्येक माता-पिता के माध्यम से जाने की ज़रूरत है? धन्यवाद।

4
Gal 6 नवम्बर 2011, 19:51
[2 => [3 => [10]], 6, 9] रूबी मान्य नहीं है। ऐरे या हैश?
 – 
tokland
6 नवम्बर 2011, 20:00
कोई फर्क नहीं पड़ता, मैं या तो हैश/सरणी प्रतिनिधित्व की तलाश में हूं।
 – 
Gal
6 नवम्बर 2011, 20:02
1
अच्छा सवाल और अच्छे जवाब!
 – 
Zabba
6 नवम्बर 2011, 20:41

2 जवाब

सबसे बढ़िया उत्तर

एक सांस-पहली खोज काम करेगी।

def build_tree(i, edges)
    list = {}
    out_nodes = edges.select {|e| e[0] == i}.map {|e| e[1]}.uniq
    out_nodes.each {|n| list[n] = build_tree(n, edges)}
    list
end

edges = [[1,2],[1,6],[1,9],[2,3],[3,10],[4,7]]
puts build_tree(1, edges)
# {2=>{3=>{10=>{}}}, 6=>{}, 9=>{}}
5
ZelluX 6 नवम्बर 2011, 20:36
ज़माने को समझ लिया। यह 3.6 सेकंड में, 100,000 बार तेजी से चलता है। बेंचमार्क पेस्टी
 – 
Zabba
6 नवम्बर 2011, 21:02

एक कार्यात्मक और पुनरावर्ती दृष्टिकोण:

require 'facets'

def create_tree(pairs, root)
  relationships = pairs.map_by { |parent, child| [parent, child] }  
  get_children = proc do |parent|
    (relationships[parent] || []).mash do |child| 
      [child, get_children.call(child)]
    end
  end  
  get_children.call(root)
end

pairs = [[1, 2], [1, 6], [1, 9], [2, 3], [3, 10], [4, 7]]
p create_tree(pairs, 1)
#=> {6=>{}, 2=>{3=>{10=>{}}}, 9=>{}}

[संपादित करें] बिना पहलुओं के (और अब आप देखेंगे कि मैं इसका उपयोग क्यों करता हूं!):

def create_tree(pairs, root)
  relationships = Hash[pairs.group_by { |p, c| p }.map { |p, ary| [p, ary.map { |p, c| c }] }]
  get_children = proc do |parent|
    Hash[(relationships[parent] || []).map do |child| 
      [child, get_children.call(child)]
    end]
  end  
  get_children.call(root)
end
2
tokland 6 नवम्बर 2011, 20:43
पहलू मेरे लिए काम नहीं कर रहा है (मुझे 500 त्रुटि मिलती है)। तुम जानते हो क्यों?
 – 
Gal
6 नवम्बर 2011, 20:32
क्या आपने gem install facets की कोशिश की?
 – 
Zabba
6 नवम्बर 2011, 20:33
मेरे पास यह मेरे जेमफाइल में है (मैं रेल का उपयोग कर रहा हूं), बंडल चला गया।
 – 
Gal
6 नवम्बर 2011, 20:34
ज़माने को समझ लिया। पहला कोड 5 सेकंड का है, 100,000 बार चलाएँ।
 – 
Zabba
6 नवम्बर 2011, 20:45
@ ज़ब्बा, बेंचमार्किंग के लिए धन्यवाद। तो क्या यह कोड अनिवार्य से तेज है? यह थोड़ा आश्चर्य की बात है, शायद ज़ेलुएक्स का कोड सबसे तेज़ कार्यान्वयन नहीं है।
 – 
tokland
6 नवम्बर 2011, 20:47