बाइनरी पेड़
एक बाइनरी ट्री तीन प्रकार के नोड्स वाला एक पेड़ है:
- टर्मिनल नोड्स, जिनके कोई बच्चे नहीं हैं
- एकतरफा नोड्स, जिनमें से प्रत्येक में एक बच्चा है
- बाइनरी नोड्स, जिनके दो बच्चे हैं
हम बीएनएफ (बैकस-नौर फॉर्म) में दिए गए निम्नलिखित व्याकरण के साथ उनका प्रतिनिधित्व कर सकते हैं :
<e> ::=
<terminal>
| <unary>
| <binary>
<terminal> ::=
"0"
<unary> ::=
"(1" <e> ")"
<binary> ::=
"(2" <e> " " <e> ")"
इस व्याकरण में नोड्स को प्रीऑर्डर में दिया गया है और प्रत्येक नोड को एक अंक द्वारा दर्शाया गया है जो कि इसके बच्चों की संख्या है।
मोटकिन संख्या
मोटज़किन संख्या ( OEIS ) ( विकिपीडिया ) की कई व्याख्याएँ हैं, लेकिन एक व्याख्या यह है कि n
वें Motzkin संख्या n
नोड्स के साथ अलग-अलग द्विआधारी पेड़ों की संख्या है । मोटज़किन संख्याओं की एक तालिका शुरू होती है
N Motzkin number M(N)
1 1
2 1
3 2
4 4
5 9
6 21
7 51
8 127
...
उदाहरण M(5)
9 है, और 5 नोड्स वाले नौ अलग-अलग बाइनरी पेड़ हैं
1 (1 (1 (1 (1 0))))
2 (1 (1 (2 0 0)))
3 (1 (2 0 (1 0)))
4 (1 (2 (1 0) 0))
5 (2 0 (1 (1 0)))
6 (2 0 (2 0 0))
7 (2 (1 0) (1 0))
8 (2 (1 (1 0)) 0)
9 (2 (2 0 0) 0)
कार्य
नोड्स के n
साथ सभी अलग-अलग बाइनरी पेड़ों के इनपुट और आउटपुट के रूप में एक ही सकारात्मक पूर्णांक लें n
।
n
1 से 5 के लिए उदाहरण कोष्ठक के साथ पठनीयता के लिए शामिल किया गया है
0
(1 0)
(1 (1 0))
(2 0 0)
(1 (1 (1 0)))
(1 (2 0 0))
(2 0 (1 0))
(2 (1 0) 0)
(1 (1 (1 (1 0))))
(1 (1 (2 0 0)))
(1 (2 0 (1 0)))
(1 (2 (1 0) 0))
(2 0 (1 (1 0)))
(2 0 (2 0 0))
(2 (1 0) (1 0))
(2 (1 (1 0)) 0)
(2 (2 0 0) 0)
इनपुट
इनपुट एक धनात्मक पूर्णांक होगा।
उत्पादन
आउटपुट को कई बाइनरी नोड्स के साथ अलग-अलग बाइनरी पेड़ों का एक समझदार प्रतिनिधित्व होना चाहिए। बीएनएफ व्याकरण द्वारा दिए गए सटीक स्ट्रिंग का उपयोग करना अनिवार्य नहीं है: यह पर्याप्त है कि इस्तेमाल किया गया वाक्यविन्यास पेड़ों का एक स्पष्ट प्रतिनिधित्व देता है। जैसे आप []
इसके बजाय उपयोग कर सकते हैं , बाहरी ()
कोष्ठक के [[]]
बजाय कोष्ठक का एक अतिरिक्त स्तर []
मौजूद है या गायब है, अतिरिक्त अल्पविराम या कोई अल्पविराम, अतिरिक्त स्थान, लघुकोष्ठक या कोई लघुकोष्ठक, आदि।
ये सभी समतुल्य हैं:
(1 (2 (1 0) 0))
[1 [2 [1 0] 0]]
1 2 1 0 0
12100
(1 [2 (1 0) 0])
.:.--
*%*55
(- (+ (- 1) 1))
-+-11
इसके अलावा एक टिप्पणी में @xnor द्वारा निर्धारित विविधता। चूंकि इसे एक प्रारूप में अनुवाद करने का एक तरीका है जिसे समझा जा सकता है कि यह स्वीकार्य है।
[[[]][]] is (2 (1 0) 0)
इसे समझने में आसानी करने के लिए कुछ को इस तरह []
से बदलना()
[([])()]
अब अगर आप साथ शुरू करते हैं
[]
फिर एक बाइनरी डालें जिसमें आपको दो अभिव्यक्तियाँ मिलें
[()()] which is 2
और फिर पहले के लिए () एक यूनरी डालें जिसमें आपको प्राप्त होने वाली एक अभिव्यक्ति की आवश्यकता हो
[([])()] which is 21
लेकिन चूंकि []
या ()
कोई आंतरिक ब्रैकेटिंग 0 का प्रतिनिधित्व नहीं कर सकती है, जिसके लिए आपको और अधिक अभिव्यक्ति की आवश्यकता नहीं है जो आप इसकी व्याख्या कर सकते हैं
2100
ध्यान दें कि उत्तर को अनंत स्मृति के साथ सैद्धांतिक रूप से काम करना चाहिए, लेकिन स्पष्ट रूप से कार्यान्वयन-निर्भर परिमित इनपुट के लिए स्मृति से बाहर चलेगा।
आउटपुट की भिन्नता
BNF xnor Christian Ben
b(t, b(t, t)) [{}{{}{}}] (0(00)) (1, -1, 1, -1)
b(t, u(u(t))) [{}{(())}] (0((0))) (1, -1, 0, 0)
b(u(t), u(t)) [{()}{()}] ((0)(0)) (1, 0, -1, 0)
b(b(t, t), t) [{{}{}}{}] ((00)0) (1, 1, -1, -1)
b(u(u(t)), t) [{(())}{}] (((0))0) (1, 0, 0, -1)
u(b(t, u(t))) [({}{()})] ((0(0))) (0, 1, -1, 0)
u(b(u(t), t)) [({()}{})] (((0)0)) (0, 1, 0, -1)
u(u(b(t, t))) [(({}{}))] (((00))) (0, 0, 1, -1)
u(u(u(u(t)))) [(((())))] ((((0)))) (0, 0, 0, 0)
डुप्लीकेट पेड़ों की जांच के लिए एक संभावित स्थान
डुप्लिकेट की जांच करने के लिए एक जगह M (5) के साथ है।
इस एक पेड़ को M (4) पेड़ों से M (5) के लिए दो बार उत्पन्न किया गया था
(2 (1 0) (1 0))
के लिए एक यूनीरी शाखा जोड़कर पहला
(2 (1 0) 0)
और दूसरा एक अनार्य शाखा को जोड़कर
(2 0 (1 0))
बीएनएफ को समझना
BNF सरल नियमों से बना है:
<symbol> ::= expression
बाईं ओर जहां एक प्रतीक नाम है, जो चारों ओर से घिरा हुआ है <>
।
सही पर प्रतीक के निर्माण के लिए अभिव्यक्ति है। कुछ नियम निर्माण में अन्य नियमों का उपयोग करते हैं, जैसे
<e> ::= <terminal>
e
a हो सकता है terminal
और कुछ नियमों में ऐसे अक्षर होते हैं जिनका उपयोग प्रतीक के निर्माण में किया जाता है, जैसे
<terminal> ::= "0"
terminal
सिर्फ चरित्र शून्य है।
कुछ नियमों के निर्माण के कई तरीके हैं, उदाहरण के लिए
<e> ::=
<terminal>
| <unary>
| <binary>
एक या एक या एक e
हो सकता है ।<terminal>
<unary>
<binary>
और कुछ नियम भागों का एक क्रम है, उदाहरण के लिए
<unary> ::= "(1" <e> ")"
ए unary
अक्षर है (1
जिसके बाद निर्माण e
किया जा सकता है उसके बाद के लिए )
।
आप हमेशा शुरुआती नियम से शुरू करते हैं, जो इसके लिए है <e>
।
कुछ सरल उदाहरण:
सबसे सरल क्रम बस है 0
। इसलिए हम शुरुआती नियम से शुरू करते हैं <e>
और देखते हैं कि तीन विकल्प हैं:
<terminal>
| <unary>
| <binary>
तो पहले वाला ले लो <terminal>
। अब एक टर्मिनल के पास कोई विकल्प नहीं है और है 0
। तो बदलने के <terminal>
साथ 0
में <e>
शासन और आपका काम हो गया।
फिर अगला है (1 0)
। के साथ शुरू करो <e>
और उपयोग नियम <unary>
है जो
"(1" <e> ")"
अब इसकी जरूरत है <e>
ताकि हम वापस जाएं <e>
और तीन में से एक का चुनाव करें, इस बार चुनने का, <terminal>
जो देता है 0
। जगह 0
में (1 <e> )
देता है (1 0)
, और यह बदल दिया जाता है में <unary>
तो <e>
है (1 0)
।