यह मेरी पिछली पोस्ट के one पर एक फॉलो-अप है।scala.xml.RuleTransformer की जटिलता वास्तव में घातीय है?
मैंने यह समझने की कोशिश की कि RuleTransformer प्रदर्शन इतना खराब क्यों है। अब मुझे विश्वास है कि यह बहुत धीमा है क्योंकि इसकी जटिलता ओ (2 एन) है, जहां एन इनपुट एक्सएमएल पेड़ की ऊंचाई है।
मान लीजिए मैं लेबल करने के लिए "बी" सभी तत्वों के सभी लेबल का नाम बदलने की जरूरत है:
import scala.xml._, scala.xml.transform._
val rule: RewriteRule = new RewriteRule() {
override def transform(node: Node): Seq[Node] = node match {
case e: Elem => e.copy(label = "b")
case other => other
}
}
def trans(node: Node): Node = new RuleTransformer(rule).apply(node)
की गिनती करते हैं कि कितनी बार transform
दौरा इनपुट <a3><a2><a1/></a2></a3>
में प्रत्येक नोड।
विज़िट गिनने के लिए हम एक बफर visited
जोड़ते हैं, शुरुआत में इसे शामिल करते हैं, स्टोर नोड्स का दौरा करते हैं, और अंत में प्रिंट करते हैं।
import scala.collection.mutable.ListBuffer
// buffer to store visited nodes
var visited: ListBuffer[Node] = ListBuffer[Node]()
val rule: RewriteRule = new RewriteRule() {
override def transform(n: Node): Seq[Node] = {
visited append (n) // count this visit
n match {
case e: Elem => e.copy(label = "b")
case other => other
}
}
}
def trans(node: Node): Node = {
visited = ListBuffer[Node]() // init the buffer
val r = new RuleTransformer(rule).apply(node)
// print visited nodes and numbers of visits
println(visited.groupBy(identity).mapValues(_.size).toSeq.sortBy(_._2))
r
}
अब यह आरईपीएल में चलाते हैं और देखते हैं visited
scala> val a3 = <a3><a2><a1/></a2></a3>
a3: scala.xml.Elem = <a3><a2><a1/></a2></a3>
scala> trans(a3)
ArrayBuffer((<a3><b><b/></b></a3>,2), (<a2><b/></a2>,4), (<a1/>,8))
res1: scala.xml.Node = <b><b><b/></b></b>
तो a1
दौरा किया आठ बार।
अगर हम बदलने <a4><a3><a2><a1/></a2></a3></a4>
तो a1
के लिए <a5><a4><a3><a2><a1/></a2></a3></a4></a5>
16 बार, का दौरा किया जाएगा -, 32 आदि तो जटिलता घातीय लग रहा है।
क्या यह समझ में आता है? code के विश्लेषण से आप इसे कैसे साबित करेंगे?
विश्लेषण के लिए धन्यवाद। मैं सहमत हूं कि प्रत्येक नोड के लिए 'ट्रांसफॉर्म (एन: नोड)' _twice_ को बुलाया गया है, फिर रिकर्सन 'टी (एन) = 2 * टी (एन -1) 'है और इसलिए समग्र जटिलता घातीय है। – Michael
अब मैं धीरे-धीरे महसूस कर रहा हूं कि _how_ गरीब 'scala-xml' लाइब्रेरी की गुणवत्ता है। – Michael
@ माइकल, सहमत, मैं इन या जिथब इतिहास के आसपास किसी भी तरह की चर्चा करने की कोशिश कर रहा था ताकि इसे कोड किया जा सके (जैसे नोड्स का पुन: उपयोग करना या आदेश को संरक्षित करना, अनुमान लगाने का तरीका) लेकिन कोई भी नहीं मिला। – Biswanath