यह एक संशोधित उत्तर है।
कक्षा संघों का मज़ाकिया है - वे प्रभावी रूप से एक मौजूदा पदानुक्रम के बीच में एक कक्षा डालते हैं, इसलिए अचानक list
का विस्तार करने वाली चीजें listOrNULL
का विस्तार करती हैं।
इसके बजाय मैं एक छोटी कक्षा पदानुक्रम तैयार करता हूं जो "वृक्ष" का प्रतिनिधित्व करता है जो या तो "खाली" या "आंतरिक" हो सकता है। "आंतरिक" वर्ग में डेटा रखने के लिए एक स्लॉट होगा (प्रकार "कोई भी"), साथ ही बाएं और दाएं लिंक, जो "पेड़" तत्व होंगे।
setClass("Tree")
setClass("Empty", contains="Tree")
setClass("Internal", contains="Tree",
representation=representation(elem="ANY", left="Tree", right="Tree"),
prototype=prototype(left=new("Empty"), right=new("Empty")))
मैं एक खाली पेड़ बनाने के लिए विधियों, और एक तत्व से एक पेड़ के साथ साथ छोड़ दिया और सही वंशज के साथ अपने पेड़ के लिए एक निर्माता लिखते हैं, करेंगे।
setGeneric("Tree", function(elem, left, right) standardGeneric("Tree"),
signature="elem")
setMethod(Tree, "missing", function(elem, left, right) new("Empty"))
setMethod(Tree, "ANY", function(elem, left, right) {
new("Internal", elem=elem, left=left, right=right)
})
एक बुनियादी आपरेशन एक पेड़ t
setGeneric("insert", function(x, t) standardGeneric("insert"))
setMethod(insert, c("ANY", "Empty"), function(x, t) {
Tree(x, Tree(), Tree())
})
setMethod(insert, c("ANY", "Internal"), function(x, t) {
if (x < [email protected]) {
l <- insert(x, [email protected])
r <- [email protected]
} else {
l <- [email protected]
r <- insert(x, [email protected])
}
Tree([email protected], l, r)
})
एक और आपरेशन सदस्यता
setGeneric("member", function(x, t) standardGeneric("member"))
setMethod(member, c("ANY", "Empty"), function(x, t) FALSE)
setMethod(member, c("ANY", "Internal"), function(x, t) {
if (x < [email protected]) member(x, [email protected])
else if ([email protected] < x) member(x, [email protected])
else TRUE
})
के लिए एक दिलचस्प, कार्यात्मक, इस कार्यान्वयन की संपत्ति का परीक्षण करने के लिए है में एक तत्व x
डालने के लिए है यह है कि यह लगातार
> t <- Tree()
> t1 <- insert(10, t)
> t2 <- insert(5, t1)
> t3 <- insert(7, t2)
> t4 <- insert(15, t3)
> which(sapply(1:20, member, t4))
[1] 5 7 10 15
> which(sapply(1:20, member, t2))
[1] 5 10
एस 4 वर्ग निर्माण की अक्षमताओं की वजह से बहुत सारे अपडेट होने पर यह प्रभावी नहीं होगा और क्योंकि एक पेड़ को संशोधित करना (उदाहरण के लिए, नोड जोड़ना) नए नोड के पथ में सभी नोड्स की प्रतिलिपि बनाता है। different approach पेड़ को matrix
बाएं, दाएं, मान ट्रिपल के रूप में दर्शाता है। एस 4 कार्यान्वयन में अभी भी खराब प्रदर्शन होगा, क्योंकि इंस्टेंस के अपडेट नए उदाहरण बनाएंगे, सबकुछ डुप्लिकेट करेंगे। तो मैं फ़ील्ड 'वैल्यू' के साथ एक रेफरेंस क्लास में समाप्त हो जाऊंगा (जो भी पेड़ पकड़ना है और matrix
बाएं और दाएं रिश्तों के एक वेक्टर।
यह डेटा विश्लेषण के लिए सॉफ्टवेयर में चैंबर द्वारा अनुशंसित दृष्टिकोण (+1) – Henrik
सही है, धन्यवाद – RockScience
यह पूरी तरह से काम करता है, बहुत धन्यवाद – eblondel