हां, आप इस संपीड़न को समय में कर सकते हैं, लेकिन यह आसान नहीं है :) हम पहले कुछ अवलोकन करते हैं और फिर एल्गोरिथ्म प्रस्तुत करते हैं। हम मानते हैं कि पेड़ शुरू में संकुचित नहीं है - यह वास्तव में आवश्यक नहीं है लेकिन विश्लेषण को आसान बनाता है।O(nlogn)
सबसे पहले, हम 'संरचनात्मक समानता' को सक्रिय रूप से चिह्नित करते हैं। बता दें कि और दो (उप) पेड़ हैं। यदि और दोनों अशक्त वृक्ष हैं (बिल्कुल कोई कोने नहीं हैं), तो वे संरचनात्मक रूप से समतुल्य हैं। यदि और दोनों शून्य वृक्ष नहीं हैं, तो वे संरचनात्मक रूप से समान हैं यदि उनके बाएं बच्चे संरचनात्मक रूप से समतुल्य हैं और उनके दाएं बच्चे संरचनात्मक रूप से समतुल्य हैं। The संरचनात्मक समतुल्यता ’इन परिभाषाओं पर न्यूनतम निश्चित बिंदु है।टी ' टी टी ' टी टी 'TT′TT′TT′
उदाहरण के लिए, किसी भी दो पत्ती के नोड्स संरचनात्मक रूप से समतुल्य होते हैं, क्योंकि दोनों में उनके दोनों बच्चों के रूप में अशक्त पेड़ होते हैं, जो संरचनात्मक रूप से समान होते हैं।
जैसा कि यह कहना कष्टप्रद है कि 'उनके बाएं बच्चे संरचनात्मक रूप से समान हैं और इसलिए उनके दाएं बच्चे हैं', हम अक्सर कहेंगे कि 'उनके बच्चे संरचनात्मक रूप से समान हैं' और उसी का इरादा रखते हैं। यह भी ध्यान दें कि हम कभी-कभी 'इस शीर्ष' को कहते हैं, जब हमारा अर्थ होता है 'इस शीर्ष पर स्थित सबट्री'।
उपरोक्त परिभाषा हमें तुरंत एक संकेत देती है कि संपीड़न कैसे किया जाए: यदि हम जानते हैं कि अधिकतम पर गहराई के साथ सभी उपप्रकारों की संरचनात्मक तुल्यता है , तो हम आसानी से गहराई साथ उपप्रकार के संरचनात्मक तुल्यता की गणना कर सकते हैं । हमें इस गणना को स्मार्ट तरीके से रनिंग टाइम से बचने के लिए करना है ।d + 1 O ( n 2 )dd+1O(n2)
एल्गोरिदम अपने निष्पादन के दौरान हर शीर्ष पर पहचानकर्ताओं को असाइन करेगा। एक पहचानकर्ता सेट में एक संख्या है । पहचानकर्ता अद्वितीय हैं और कभी नहीं बदलते हैं: इसलिए हम मान लेते हैं कि हम एल्गोरिथम की शुरुआत में कुछ (वैश्विक) चर को 1 पर सेट करते हैं, और हर बार जब हम कुछ शीर्ष पर पहचानकर्ता को असाइन करते हैं, तो हम उस चर के वर्तमान मूल्य को शीर्ष और वृद्धि के लिए असाइन करते हैं उस चर का मान।{1,2,3,…,n}
हम सबसे पहले इनपुट ट्री को (अधिकांश ) समान गहराई के कोने वाले सूचियों में परिवर्तित करते हैं , साथ में उनके अभिभावक को सूचक भी। यह आसानी से समय में किया जाता है ।ओ ( एन )nO(n)
हम पहले सभी पत्तियों को संपीड़ित करते हैं (हम इन पत्तियों को गहराई में 0 के कोने के साथ सूची में पा सकते हैं) एक ही शीर्ष में। हम इस शीर्ष को एक पहचानकर्ता निर्दिष्ट करते हैं। इसके बजाय दूसरे वर्टेक्स को इंगित करने के लिए या तो शीर्ष के माता-पिता को पुनर्निर्देशित करके दो कोने का संपीड़न किया जाता है।
हम दो अवलोकन करें: पहला, किसी शीर्ष सख्ती से छोटे गहराई के बच्चों की है, और दूसरी बात, अगर हम गहराई से छोटी के सभी कोने पर संपीड़न प्रदर्शन किया है (और उन्हें पहचानकर्ता दे दिया है), तो गहराई के दो कोने संरचना की दृष्टि से बराबर हैं और अपने बच्चों की पहचान करने वालों को संयोग से संकुचित किया जा सकता है। यह अंतिम अवलोकन निम्नलिखित तर्क से होता है: दो कोने संरचनात्मक रूप से समतुल्य होते हैं यदि उनके बच्चे संरचनात्मक रूप से समतुल्य हैं, और संपीडन के बाद इसका मतलब है कि उनके संकेत उसी बच्चों को इंगित कर रहे हैं, जिसका अर्थ है कि उनके बच्चों के पहचानकर्ता समान हैं।ddd
हम छोटी गहराई से बड़ी गहराई तक समान गहराई के नोड्स के साथ सभी सूचियों के माध्यम से पुनरावृति करते हैं। हर स्तर के लिए हम पूर्णांक युग्मों की एक सूची बनाते हैं, जहाँ प्रत्येक जोड़ी उस स्तर पर कुछ शीर्ष के बच्चों के पहचानकर्ताओं से मेल खाती है। हमारे पास उस स्तर के दो कोने संरचनात्मक रूप से बराबर हैं यदि उनके संगत पूर्णांक जोड़े समान हैं। लेक्सिकोग्राफिक ऑर्डरिंग का उपयोग करके, हम इन्हें सॉर्ट कर सकते हैं और पूर्णांक जोड़े के सेट प्राप्त कर सकते हैं जो समान हैं। हम इन सेटों को ऊपर के रूप में एक कोने तक संपीड़ित करते हैं और उन्हें पहचानकर्ता देते हैं।
उपरोक्त टिप्पणियों से साबित होता है कि यह दृष्टिकोण काम करता है और संपीड़ित पेड़ में परिणाम होता है। कुल चलने का समय और साथ ही हमारे द्वारा बनाई गई सूचियों को क्रमबद्ध करने के लिए आवश्यक समय है। जैसा कि पूर्णांक जोड़े की कुल संख्या , यह हमें देता है कि कुल चलने का समय , आवश्यकतानुसार। प्रक्रिया के अंत में हमने कितने नोड्स छोड़े हैं, यह गिनती करना तुच्छ है (बस यह देखें कि हमने कितने पहचानकर्ता सौंपे हैं)।n O ( n लॉग एन )O(n)nO(nlogn)