विसंधित-सेट डेटा संरचना: Difference between revisions
No edit summary |
No edit summary |
||
(23 intermediate revisions by 4 users not shown) | |||
Line 15: | Line 15: | ||
[[File:Dsu disjoint sets init.svg|thumb|360px|<code>MakeSet</code> 8 सिंगलटन बनाता है।]] | [[File:Dsu disjoint sets init.svg|thumb|360px|<code>MakeSet</code> 8 सिंगलटन बनाता है।]] | ||
[[File:Dsu disjoint sets final.svg|thumb|360px|के कुछ संचालन के | [[File:Dsu disjoint sets final.svg|thumb|360px|के कुछ संचालन के पश्चात <code>Union</code>, कुछ उपसमुच्चय साथ में समूहीकृत किए जाते हैं।]]कंप्यूटर विज्ञान में, '''विसंधित-सेट [[डेटा संरचना]]''', जिसे संघ-शोध डेटा संरचना या मर्ज-शोध उपसमुच्चय भी कहा जाता है, डेटा संरचना है जो भिन्न-भिन्न उपसमुच्चय (गैर-ओवरलैपिंग) [[सेट (गणित)|उपसमुच्चय (गणित)]] का संग्रह संग्रहीत करती है। समतुल्य रूप से, यह उपसमुच्चय के विभाजन को असंबद्ध उपसमुच्चय में संग्रहीत करता है। यह नए उपसमुच्चय जोड़ने, विलय करने वाले उपसमुच्चय (उन्हें उनके [[संघ (सेट सिद्धांत)|संघ (उपसमुच्चय सिद्धांत)]] द्वारा प्रतिस्थापित करने) एवं उपसमुच्चय के प्रतिनिधि सदस्य का शोधन करने के लिए संचालन प्रदान करता है। अंतिम संक्रिया कुशलतापूर्वक यह यह ज्ञात करने के लिए संभव बनाती है कि क्या कोई दो तत्व भिन्न-भिन्न उपसमुच्चय में हैं। | ||
जबकि असंयुक्त-उपसमुच्चय डेटा संरचनाओं को प्रारम्भ करने की कई प्रविधि हैं, व्यवहार में उन्हें प्रायः विशेष कार्यान्वयन के साथ पहचाना जाता है जिसे | जबकि असंयुक्त-उपसमुच्चय डेटा संरचनाओं को प्रारम्भ करने की कई प्रविधि हैं, व्यवहार में उन्हें प्रायः विशेष कार्यान्वयन के साथ पहचाना जाता है जिसे विसंधित-उपसमुच्चय वन कहा जाता है। यह विशेष प्रकार का [[वन (ग्राफ सिद्धांत)]] है जो संघों को निष्पादित करता है एवं निकट-निरंतर [[परिशोधित विश्लेषण]] में मिलता है। {{mvar|m}} के लिए जोड़ का क्रम करने, संघ, या विसंधित-उपसमुच्चय वन पर संचालन {{mvar|n}} ग्रंथि्स को कुल समय की आवश्यकता होती है। {{math|[[Big O notation|''O'']](''m''α(''n''))}}, जहाँ {{math|α(''n'')}} अधिकतम मंद गति से बढ़ने [[व्युत्क्रम एकरमैन समारोह|व्युत्क्रम एकरमैन फंक्शन]] है। विसंधित वन प्रति-कार्रवाई के आधार पर इस प्रदर्शन का उत्तरदायित्व नहीं देते हैं। व्यक्तिगत संघ एवं शोध संचालन स्थिर समय से अधिक समय ले सकते हैं। {{math|α(''n'')}} समय, किन्तु प्रत्येक संचालन विभिन्न उपसमुच्चय वन को स्वयं को समायोजित करने का कारण बनता है, जिससे क्रमिक संचालन तीव्र हो। विसंधित-उपसमुच्चय वन विसंधित रूप से इष्टतम एवं व्यावहारिक रूप से कुशल दोनों हैं। | ||
ग्राफ़ के न्यूनतम विस्तृत | ग्राफ़ के न्यूनतम विस्तृत वृक्ष को शोधने के लिए क्रुस्कल के एल्गोरिदम में भिन्न-भिन्न उपसमुच्चय डेटा संरचनाएं महत्वपूर्ण भूमिका निभाती हैं। न्यूनतम विस्तृत हुए वृक्षों के महत्व का अर्थ है कि भिन्न-भिन्न उपसमुच्चय डेटा संरचनाएं विभिन्न प्रकार के एल्गोरिदम के अंतर्गत आती हैं। इसके अतिरिक्त भिन्न-भिन्न उपसमुच्चय डेटा संरचनाओं में प्रतीकात्मक संगणना के साथ-साथ संकलक में भी अनुप्रयोग होते हैं। | ||
== इतिहास == | == इतिहास == | ||
1964 में बर्नार्ड ए. गैलर एवं माइकल जे. फिशर द्वारा संधि भंग-उपसमुच्चय वनों का प्रथम बार वर्णन किया गया था।<ref name="Galler1964">{{cite journal|first1=Bernard A.|last1=Galler|author1-link=Bernard A. Galler|first2=Michael J.|last2=Fischer|author2-link=Michael J. Fischer|title=एक बेहतर तुल्यता एल्गोरिथ्म|journal=[[Communications of the ACM]]|volume=7|issue=5|date=May 1964|pages=301–303|doi=10.1145/364099.364331|s2cid=9034016 |doi-access=free}}. The paper originating disjoint-set forests.</ref> 1973 में, उनकी समय जटिलता को सीमित कर दिया गया था <math>O(\log^{*}(n))</math>, का [[पुनरावृत्त लघुगणक]] <math>n</math>, [[जॉन हॉपक्रॉफ्ट]] एवं [[जेफरी उल्मैन]] द्वारा<ref name="Hopcroft1973">{{cite journal|last1=Hopcroft|first1=J. E.|author1-link=John Hopcroft|last2=Ullman|first2=J. D.|author2-link=Jeffrey Ullman|year=1973|title=मर्जिंग एल्गोरिदम सेट करें|journal=SIAM Journal on Computing|volume=2|issue=4|pages=294–303|doi=10.1137/0202024}}</ref> 1975 में, [[रॉबर्ट टार्जन]] प्रमाणित करने वाले प्रथम व्यक्ति थे। <math>O(m\alpha(n))</math> एल्गोरिथम की समय जटिलता पर ऊपरी सीमा,<ref name="Tarjan1984">{{cite journal|first1=Robert E.|last1=Tarjan|author1-link=Robert E. Tarjan|first2=Jan|last2=van Leeuwen|author2-link=Jan van Leeuwen|title=सेट यूनियन एल्गोरिथम का वर्स्ट-केस विश्लेषण|journal=Journal of the ACM|volume=31|issue=2|pages=245–281|year=1984|doi= 10.1145/62.2160|s2cid=5363073 |doi-access=free}}</ref> एवं, 1979 में, दिखाया कि यह प्रतिबंधित विषय के लिए निचली सीमा थी।<ref name="Tarjan1979">{{cite journal|first=Robert Endre|last=Tarjan|author-link=Robert E. Tarjan|year=1979|title=एल्गोरिद्म का एक वर्ग जिसे असंयुक्त सेट बनाए रखने के लिए गैर-रैखिक समय की आवश्यकता होती है|journal=Journal of Computer and System Sciences|volume=18|issue=2|pages=110–127|doi=10.1016/0022-0000(79)90042-4|doi-access=free }}</ref> 1989 में, [[माइकल फ्रेडमैन]] एवं [[माइकल सक्स (गणितज्ञ)]] <math>\Omega(\alpha(n))</math> ने इसे दिखाया। (परिशोधित) शब्दों को किसी भी | 1964 में बर्नार्ड ए. गैलर एवं माइकल जे. फिशर द्वारा संधि भंग-उपसमुच्चय वनों का प्रथम बार वर्णन किया गया था।<ref name="Galler1964">{{cite journal|first1=Bernard A.|last1=Galler|author1-link=Bernard A. Galler|first2=Michael J.|last2=Fischer|author2-link=Michael J. Fischer|title=एक बेहतर तुल्यता एल्गोरिथ्म|journal=[[Communications of the ACM]]|volume=7|issue=5|date=May 1964|pages=301–303|doi=10.1145/364099.364331|s2cid=9034016 |doi-access=free}}. The paper originating disjoint-set forests.</ref> 1973 में, उनकी समय जटिलता को सीमित कर दिया गया था <math>O(\log^{*}(n))</math>, का [[पुनरावृत्त लघुगणक]] <math>n</math>, [[जॉन हॉपक्रॉफ्ट]] एवं [[जेफरी उल्मैन]] द्वारा<ref name="Hopcroft1973">{{cite journal|last1=Hopcroft|first1=J. E.|author1-link=John Hopcroft|last2=Ullman|first2=J. D.|author2-link=Jeffrey Ullman|year=1973|title=मर्जिंग एल्गोरिदम सेट करें|journal=SIAM Journal on Computing|volume=2|issue=4|pages=294–303|doi=10.1137/0202024}}</ref> 1975 में, [[रॉबर्ट टार्जन]] प्रमाणित करने वाले प्रथम व्यक्ति थे। <math>O(m\alpha(n))</math> एल्गोरिथम की समय जटिलता पर ऊपरी सीमा,<ref name="Tarjan1984">{{cite journal|first1=Robert E.|last1=Tarjan|author1-link=Robert E. Tarjan|first2=Jan|last2=van Leeuwen|author2-link=Jan van Leeuwen|title=सेट यूनियन एल्गोरिथम का वर्स्ट-केस विश्लेषण|journal=Journal of the ACM|volume=31|issue=2|pages=245–281|year=1984|doi= 10.1145/62.2160|s2cid=5363073 |doi-access=free}}</ref> एवं, 1979 में, दिखाया कि यह प्रतिबंधित विषय के लिए निचली सीमा थी।<ref name="Tarjan1979">{{cite journal|first=Robert Endre|last=Tarjan|author-link=Robert E. Tarjan|year=1979|title=एल्गोरिद्म का एक वर्ग जिसे असंयुक्त सेट बनाए रखने के लिए गैर-रैखिक समय की आवश्यकता होती है|journal=Journal of Computer and System Sciences|volume=18|issue=2|pages=110–127|doi=10.1016/0022-0000(79)90042-4|doi-access=free }}</ref> 1989 में, [[माइकल फ्रेडमैन]] एवं [[माइकल सक्स (गणितज्ञ)]] <math>\Omega(\alpha(n))</math> ने इसे दिखाया। (परिशोधित) शब्दों को किसी भी विसंधित-उपसमुच्चय डेटा संरचना प्रति संचालन द्वारा एक्सेस किया जाना चाहिए,<ref name="Fredman1989">{{cite journal|first1=M.|last1=Fredman|author-link=Michael Fredman|first2=M.|last2=Saks|title=गतिशील डेटा संरचनाओं की सेल जांच जटिलता|journal=Proceedings of the Twenty-First Annual ACM Symposium on Theory of Computing|pages=345–354|date=May 1989|doi=10.1145/73007.73040|isbn=0897913078|s2cid=13470414|quote=Theorem 5: Any CPROBE(log ''n'') implementation of the set union problem requires Ω(''m'' α(''m'', ''n'')) time to execute ''m'' Find's and ''n''−1 Union's, beginning with ''n'' singleton sets. |doi-access=free}}</ref> जिससे डेटा संरचना की इष्टतमता प्रमाणित होती है। | ||
1991 में, गैलील एवं इटालियनो ने भिन्न-भिन्न उपसमुच्चयों के लिए डेटा संरचनाओं का सर्वेक्षण प्रकाशित किया।<ref name="Galil1991">{{cite journal|first1=Z.|last1=Galil|first2=G.|last2=Italiano|title=असंयुक्त सेट संघ समस्याओं के लिए डेटा संरचनाएं और एल्गोरिदम।|journal=ACM Computing Surveys|volume=23|issue=3|pages=319–344|year=1991|doi=10.1145/116873.116878|s2cid=207160759 }}</ref> 1994 में, रिचर्ड जे. एंडरसन एवं हीथर वोल ने यूनियन-फाइंड के समानांतर संस्करण का वर्णन किया जिसे कभी ब्लॉक करने की आवश्यकता नहीं है।<ref name="Anderson1994">{{cite conference|first1=Richard J.|last1=Anderson|first2=Heather|last2=Woll|title=संघ-खोज समस्या के लिए प्रतीक्षा-मुक्त समानांतर एल्गोरिदम|conference=23rd ACM Symposium on Theory of Computing|year=1994|pages=370–380}}</ref> 2007 में, सिल्वेन कॉनचॉन एवं जीन-क्रिस्टोफ़ फ़िलिआट्रे ने असंयुक्त-उपसमुच्चय वन डेटा संरचना का अर्ध-स्थायी डेटा संरचना संस्करण विकसित किया एवं [[सबूत सहायक|प्रमाण सहायक]] [[Coq]] का उपयोग करके इसकी शुद्धता को औपचारिक रूप दिया।<ref name="Conchon2007">{{cite conference|first1=Sylvain|last1=Conchon|first2=Jean-Christophe|last2=Filliâtre|contribution=A Persistent Union-Find Data Structure|title=एमएल पर एसीएम सिगप्लान वर्कशॉप|location=Freiburg, Germany|date=October 2007|url=https://www.lri.fr/~filliatr/puf/}}</ref> सेमी-पर्सिस्टेंट का अर्थ है कि संरचना के पूर्व संस्करणों को कुशलता से बनाए रखा जाता है, किन्तु डेटा संरचना के पूर्व संस्करणों तक पहुंच पश्चात के संस्करणों को अमान्य कर देती है। उनका सबसे तीव्र कार्यान्वयन गैर-स्थायी एल्गोरिदम के रूप में लगभग उतना ही कुशल प्रदर्शन प्राप्त करता है। वे जटिलता विश्लेषण नहीं करते हैं। | 1991 में, गैलील एवं इटालियनो ने भिन्न-भिन्न उपसमुच्चयों के लिए डेटा संरचनाओं का सर्वेक्षण प्रकाशित किया।<ref name="Galil1991">{{cite journal|first1=Z.|last1=Galil|first2=G.|last2=Italiano|title=असंयुक्त सेट संघ समस्याओं के लिए डेटा संरचनाएं और एल्गोरिदम।|journal=ACM Computing Surveys|volume=23|issue=3|pages=319–344|year=1991|doi=10.1145/116873.116878|s2cid=207160759 }}</ref> 1994 में, रिचर्ड जे. एंडरसन एवं हीथर वोल ने यूनियन-फाइंड के समानांतर संस्करण का वर्णन किया जिसे कभी ब्लॉक करने की आवश्यकता नहीं है।<ref name="Anderson1994">{{cite conference|first1=Richard J.|last1=Anderson|first2=Heather|last2=Woll|title=संघ-खोज समस्या के लिए प्रतीक्षा-मुक्त समानांतर एल्गोरिदम|conference=23rd ACM Symposium on Theory of Computing|year=1994|pages=370–380}}</ref> 2007 में, सिल्वेन कॉनचॉन एवं जीन-क्रिस्टोफ़ फ़िलिआट्रे ने असंयुक्त-उपसमुच्चय वन डेटा संरचना का अर्ध-स्थायी डेटा संरचना संस्करण विकसित किया एवं [[सबूत सहायक|प्रमाण सहायक]] [[Coq]] का उपयोग करके इसकी शुद्धता को औपचारिक रूप दिया।<ref name="Conchon2007">{{cite conference|first1=Sylvain|last1=Conchon|first2=Jean-Christophe|last2=Filliâtre|contribution=A Persistent Union-Find Data Structure|title=एमएल पर एसीएम सिगप्लान वर्कशॉप|location=Freiburg, Germany|date=October 2007|url=https://www.lri.fr/~filliatr/puf/}}</ref> सेमी-पर्सिस्टेंट का अर्थ है कि संरचना के पूर्व संस्करणों को कुशलता से बनाए रखा जाता है, किन्तु डेटा संरचना के पूर्व संस्करणों तक पहुंच पश्चात के संस्करणों को अमान्य कर देती है। उनका सबसे तीव्र कार्यान्वयन गैर-स्थायी एल्गोरिदम के रूप में लगभग उतना ही कुशल प्रदर्शन प्राप्त करता है। वे जटिलता विश्लेषण नहीं करते हैं। | ||
Line 32: | Line 32: | ||
== प्रतिनिधित्व == | == प्रतिनिधित्व == | ||
असंयुक्त-उपसमुच्चय वन में प्रत्येक ग्रंथि में सूचक एवं कुछ सहायक जानकारी होती है, या तो आकार या रैंक (किन्तु दोनों नहीं)। | असंयुक्त-उपसमुच्चय वन में प्रत्येक ग्रंथि में सूचक एवं कुछ सहायक जानकारी होती है, या तो आकार या रैंक (किन्तु दोनों नहीं)। सूचक्स का उपयोग [[पैरेंट पॉइंटर ट्री|जनक सूचक वृक्ष]] बनाने के लिए किया जाता है, जहाँ प्रत्येक ग्रंथि जो वृक्ष की जड़ नहीं है, स्वयं जनक को इंगित करता है। मूल ग्रंथि्स को दूसरों से भिन्न करने के लिए, उनके जनक सूचक्स में अमान्य मान होते हैं, जैसे कि ग्रंथि या प्रप्रत्येकी मान के लिए परिपत्र संदर्भ प्रत्येक वृक्ष वन में संग्रहीत उपसमुच्चय का प्रतिनिधित्व करता है, जिसमें उपसमुच्चय के सदस्य वृक्ष में ग्रंथि होते हैं। मूल ग्रंथि उपसमुच्चय प्रतिनिधि प्रदान करते हैं: दो ग्रंथि उपसमुच्चय में होते हैं यदि ग्रंथि्स वाले वृक्षों की जड़ें समान होती हैं। | ||
वन में ग्रंथियो को किसी भी प्रकार से प्रयोग के लिए सुविधाजनक रूप से संग्रहीत किया जा सकता है, किन्तु सामान्य प्रक्रिया उन्हें सरणी में संग्रहीत करना है। इस विषय में, माता-पिता को उनके सरणी सूचकांक द्वारा इंगित किया जा सकता है। प्रत्येक सरणी प्रविष्टि की आवश्यकता होती है, पेरेंट | वन में ग्रंथियो को किसी भी प्रकार से प्रयोग के लिए सुविधाजनक रूप से संग्रहीत किया जा सकता है, किन्तु सामान्य प्रक्रिया उन्हें सरणी में संग्रहीत करना है। इस विषय में, माता-पिता को उनके सरणी सूचकांक द्वारा इंगित किया जा सकता है। प्रत्येक सरणी प्रविष्टि की आवश्यकता होती है, पेरेंट सूचक के लिए एकत्रेज के बिट्स {{math|Θ(log ''n'')}} शेष प्रविष्टि के लिए तुलनात्मक या अर्घ्य मात्रा में संग्रहण की आवश्यकता होती है, इसलिए वन को संग्रहीत करने के लिए आवश्यक बिट्स की संख्या {{math|Θ(''n'' log ''n'')}} है, यदि कोई कार्यान्वयन निश्चित आकार के ग्रंथियो का उपयोग करता है (जिससे वन के अधिकतम आकार को सीमित किया जा सकता है), तो आवश्यक भंडारण रैखिक {{mvar|n}} होता है। | ||
== संचालन == | == संचालन == | ||
Line 42: | Line 42: | ||
<code>MakeSet</code> संचालन नए तत्व को नए उपसमुच्चय में जोड़ता है जिसमें केवल नया तत्व होता है, एवं नया उपसमुच्चय डेटा संरचना में जोड़ा जाता है। यदि डेटा संरचना को उपसमुच्चय के विभाजन के रूप में देखा जाता है, तो <code>MakeSet</code> संचालन नए तत्व को जोड़कर उपसमुच्चय को बढ़ाता है, एवं यह नए तत्व को केवल नए तत्व वाले नए उपसमुच्चय में डालकर उपस्थित विभाजन का विस्तार करता है। | <code>MakeSet</code> संचालन नए तत्व को नए उपसमुच्चय में जोड़ता है जिसमें केवल नया तत्व होता है, एवं नया उपसमुच्चय डेटा संरचना में जोड़ा जाता है। यदि डेटा संरचना को उपसमुच्चय के विभाजन के रूप में देखा जाता है, तो <code>MakeSet</code> संचालन नए तत्व को जोड़कर उपसमुच्चय को बढ़ाता है, एवं यह नए तत्व को केवल नए तत्व वाले नए उपसमुच्चय में डालकर उपस्थित विभाजन का विस्तार करता है। | ||
असंबद्ध वन में, <code>MakeSet</code> | असंबद्ध वन में, <code>MakeSet</code> ग्रंथि के जनक सूचक एवं ग्रंथि के आकार या रैंक को आवाक्षरित करता है। यदि जड़ को ग्रंथि द्वारा दर्शाया जाता है जो स्वयं को इंगित करता है, तो निम्नलिखित स्यूडोकोड का उपयोग करके तत्व जोड़ना वर्णित किया जा सकता है। | ||
'''function''' MakeSet(''x'') '''is''' | '''function''' MakeSet(''x'') '''is''' | ||
Line 53: | Line 53: | ||
'''end function''' | '''end function''' | ||
इस संचालन में निरंतर समय जटिलता है। विशेष रूप से, प्रारंभ a असंबद्ध उपसमुच्चय वन के साथ {{mvar|n}} | इस संचालन में निरंतर समय जटिलता है। विशेष रूप से, प्रारंभ a असंबद्ध उपसमुच्चय वन के साथ {{mvar|n}} ग्रंथि्स की आवश्यकता {{math|''O''(''n'')}} है। | ||
व्यवहार में, <code>MakeSet</code> संचालन से पूर्व होना चाहिए जो मेमोरी को होल्ड करने के लिए {{math|x}} आवंटित करता है, जब तक स्मृति आवंटन परिशोधित निरंतर-समय का संचालन है, यह उचित [[गतिशील सरणी]] कार्यान्वयन के लिए है, यह यादृच्छिक-उपसमुच्चय वन के स्पर्शोन्मुख प्रदर्शन को परिवर्तित नहीं करता है। | व्यवहार में, <code>MakeSet</code> संचालन से पूर्व होना चाहिए जो मेमोरी को होल्ड करने के लिए {{math|x}} आवंटित करता है, जब तक स्मृति आवंटन परिशोधित निरंतर-समय का संचालन है, यह उचित [[गतिशील सरणी]] कार्यान्वयन के लिए है, यह यादृच्छिक-उपसमुच्चय वन के स्पर्शोन्मुख प्रदर्शन को परिवर्तित नहीं करता है। | ||
=== उपसमुच्चय प्रतिनिधि शोधन === <code>Find</code> ई> संचालन निर्दिष्ट क्वेरी | === उपसमुच्चय प्रतिनिधि शोधन === <code>Find</code> ई> संचालन निर्दिष्ट क्वेरी ग्रंथि से जनक सूचक्स की श्रृंखला {{mvar|x}} का अनुसरण करता है, जब तक यह मूल तत्व तक नहीं पहुंच जाता। यह मूल तत्व उस उपसमुच्चय {{mvar|x}} का प्रतिनिधित्व करता है {{mvar|x}} स्वयं <code>Find</code> यह जिस मूल तत्व तक पहुंचता है उसे वापस कर देता है। | ||
<code>Find</code> प्रदर्शन कर रहा है, संचालन वन में सुधार के लिए महत्वपूर्ण अवसर प्रस्तुत करता है। a में समय <code>Find</code> संचालन | <code>Find</code> प्रदर्शन कर रहा है, संचालन वन में सुधार के लिए महत्वपूर्ण अवसर प्रस्तुत करता है। a में समय <code>Find</code> संचालन जनक सूचक्स का पीछा करते हुए <code>Find</code> संचालन व्यय किया जाता है, इसलिए अनुनय वाला वृक्ष तीव्रता से आगे बढ़ता है । जब <code>Find</code> निष्पादित किया जाता है, उत्तराधिकार में प्रत्येक जनक सूचक का अनुसरण करने की तुलना में मूल तक पहुंचने की कोई तीव्र प्रक्रिया नहीं होती है। चूंकि, इस शोध के समय देखे गए जनक सूचक्स को मूल के निकट इंगित करने के लिए अद्यतन किया जा सकता है। चूँकि मूल के मार्ग में देखा गया प्रत्येक तत्व उसी उपसमुच्चय का भाग होता है, इससे वन में संग्रहीत उपसमुच्चय परिवर्तित नहीं होते हैं। किन्तु यह भविष्य बनाता है <code>Find</code> संचालन तीव्रता से, न केवल क्वेरी ग्रंथि एवं मूल के मध्य के ग्रंथि्स के लिए, जबकि उनके वंशजों के लिए भी यह अद्यतन असंबद्ध-उपसमुच्चय वन की परिशोधित प्रदर्शन आश्वाशन का महत्वपूर्ण भाग है। | ||
<code>Find</code> के लिए कई एल्गोरिदम हैं, जो विषम रूप से इष्टतम समय जटिलता प्राप्त करते हैं। एल्गोरिदम का परिवार, जिसे पथ संपीड़न के रूप में जाना जाता है, प्रत्येक ग्रंथि को क्वेरी ग्रंथि एवं मूल बिंदु से मूल के मध्य बनाता है। पथ संपीड़न को साधारण पुनरावर्तन का उपयोग करके निम्नानुसार कार्यान्वित किया जा सकता है। | |||
'''function''' Find(''x'') '''is''' | |||
'''if''' ''x''.parent ≠ ''x'' '''then''' | |||
''x''. | ''x''.parent := Find(''x''.parent) | ||
'''return''' ''x''.parent | |||
'''else''' | |||
'''return''' ''x'' | |||
'''end if''' | |||
यह कार्यान्वयन दो मार्ग बनाता है, | '''end function''' | ||
यह कार्यान्वयन दो मार्ग बनाता है, वृक्ष के ऊपर एवं पीछे की ओर, क्वेरी ग्रंथि से मूल तक पथ को संग्रहीत करने के लिए पर्याप्त स्क्रैच मेमोरी की आवश्यकता होती है (उपरोक्त स्यूडोकोड में, कॉल स्टैक का उपयोग करके पथ को स्पष्ट रूप से दर्शाया गया है)। इसे दिशा में दोनों निकट करके स्मृति की निरंतर मात्रा में घटाया जा सकता है। निरंतर मेमोरी कार्यान्वयन क्वेरी ग्रंथि से मूल तक दो बार चलता है, प्रथम बार मूल को शोध करने के लिए एवं दूसरी बार सूचक्स को अद्यतन करने के लिए होता है। | |||
'''function''' Find(''x'') '''is''' | |||
'' | ''root'' := ''x'' | ||
'''while''' ''root''.parent ≠ ''root'' '''do''' | |||
'' | ''root'' := ''root''.parent | ||
'''end while''' | |||
'''while''' ''x''.parent ≠ ''root'' '''do''' | |||
'' | ''parent'' := ''x''.parent | ||
''x''. | ''x''.parent := ''root'' | ||
'' | ''x'' := ''parent'' | ||
'''end while''' | |||
'''return''' ''root'' | |||
रॉबर्ट ई. टारजन एवं [[जॉन वैन लीउवेन]] ने भी | '''end function''' | ||
रॉबर्ट ई. टारजन एवं [[जॉन वैन लीउवेन]] ने भी <code>Find</code> वन-पास विकसित किया, एल्गोरिदम जो सबसे निकृष्ट स्थिति वाली जटिलता को बनाए रखते हैं, किन्तु व्यवहार में अधिक कुशल होते हैं।<ref name="Tarjan1984" /> इन्हें पथ विभाजन एवं पथ आधान कहा जाता है। ये दोनों क्वेरी ग्रंथि एवं मूल के मध्य के पथ पर ग्रंथियों के जनक सूचकों को अद्यतन करते हैं। पथ विभाजन प्रत्येक जनक सूचक को उस पथ पर सूचक द्वारा ग्रंथि के दादा-दादी के लिए परिवर्तित कर देता है। | |||
'''function''' Find(''x'') '''is''' | |||
'''while''' ''x''.parent ≠ ''x'' '''do''' | |||
(''x'', ''x''.parent) := (''x''.parent, ''x''.parent.parent) | (''x'', ''x''.parent) := (''x''.parent, ''x''.parent.parent) | ||
'''end while''' | |||
'''return''' ''x'' | |||
'''end function''' | |||
पथ जोड़ समान रूप से कार्य करता है, किन्तु केवल प्रत्येक दूसरे जनक सूचक को परिवर्तित करता है। | |||
'''function''' Find(''x'') '''is''' | |||
'''while''' ''x''.parent ≠ ''x'' '''do''' | |||
''x''. | ''x''.parent := ''x''.parent.parent | ||
''x'' := ''x''.parent | ''x'' := ''x''.parent | ||
'''end while''' | |||
'''return''' ''x'' | |||
'''end function''' | |||
=== दो उपसमुच्चयों का विलय === | === दो उपसमुच्चयों का विलय === | ||
संचालन <code>Union(''x'', ''y'')</code> युक्त उपसमुच्चय को प्रतिस्थापित करता है {{mvar|x}} एवं उपसमुच्चय युक्त {{mvar|y}} उनके संघ | संचालन <code>Union(''x'', ''y'')</code> युक्त उपसमुच्चय को प्रतिस्थापित करता है प्रथम {{mvar|x}} एवं उपसमुच्चय युक्त {{mvar|y}} उनके संघ <code>Union</code>के साथ उपयोग करता है, <code>Find</code> युक्त वृक्षों की जड़ों का निर्धारण करने के लिए {{mvar|x}} एवं {{mvar|y}}. यदि जड़ें समान हैं, तो कुछ करने को नहीं है। अन्यथा, दो वृक्षों को मिला देना चाहिए। यह या तो जनक सूचक उपसमुच्चय करके किया जाता है {{mvar|x}} की जड़ {{mvar|y}}'s, या के जनक सूचक {{mvar|y}} की जड़ {{mvar|x}}'s को उपसमुच्चय करना हैं। | ||
कौन सा | कौन सा ग्रंथि माता-पिता बनने का विकल्प वृक्ष पर भविष्य के संचालन की जटिलता के परिणाम हैं। यदि इसे असावधानी से किया जाए तो वृक्ष अत्यधिक ऊंचे हो सकते हैं। उदाप्रत्येकण के लिए, मान लीजिए <code>Union</code> सदैव वृक्ष युक्त बनाया {{mvar|x}} युक्त वृक्ष का सबवृक्ष {{mvar|y}} ऐसे वन से प्रारम्भ करें, जिसे अभी-अभी तत्वों के साथ आरंभ किया गया है <math>1, 2, 3, \ldots, n,</math> एवं , <code>{{math|Union(1, 2)}}</code>, <code>{{math|Union(2, 3)}}</code>, ..., <code>{{math|Union(''n'' - 1, ''n'')}}</code>. परिणामी वन में वृक्ष होता है जिसकी जड़ {{mvar|n}} होती है, एवं 1 से पथ {{mvar|n}} वृक्ष में प्रत्येक ग्रंथि से होकर प्रवाहित होती है। इस वन के लिए, चलाने का समय <code>Find(1){{math|''O''(''n'')}}</code> है। | ||
कुशल कार्यान्वयन में, वृक्ष की ऊंचाई को आकार या संघ द्वारा रैंक द्वारा संघ का उपयोग करके नियंत्रित किया जाता है। इन दोनों को स्वयं जनक सूचक के अतिरिक्त सूचनाओं को एकत्र करने के लिए ग्रंथि की आवश्यकता होती है। इस जानकारी का उपयोग यह निर्धारित करने के लिए किया जाता है कि कौन सा मूल नया जनक बनता है। दोनों रणनीतियाँ सुनिश्चित करती हैं। | |||
==== आकार से संघ ==== | ==== आकार से संघ ==== | ||
आकार के संघ | आकार के संघ की स्थिति में, ग्रंथि स्वयं आकार को संग्रहीत करता है, जो केवल इसके वंशजों की संख्या है (ग्रंथि सहित)। जब वृक्ष जड़ों के साथ {{mvar|x}} एवं {{mvar|y}} विलय किए जाते हैं, तो अधिक असंतोष वाला ग्रंथि जनक बन जाता है। यदि दो ग्रंथियों के वंशजों की संख्या समान है, तो कोई भी माता-पिता बन सकता है। दोनों ही स्थितियों में, नए जनक ग्रंथि का आकार उसके वंशजों की नई कुल संख्या पर उपसमुच्चय होता है। | ||
'''function''' Union(''x'', ''y'') '''is''' | |||
'' // | ''// Replace nodes by roots'' | ||
''x'' := Find(''x'') | ''x'' := Find(''x'') | ||
'' | ''y'' := Find(''y'') | ||
'''if''' ''x'' = ''y'' '''then''' | |||
'''return''' ''// x and y are already in the same set'' | |||
'''end if''' | |||
''// | ''// If necessary, swap variables to ensure that'' | ||
''// x | ''// x has at least as many descendants as y'' | ||
'''if''' ''x''.size < ''y''.size '''then''' | |||
(''x'', ''y'') := (''y'', ''x'') | (''x'', ''y'') := (''y'', ''x'') | ||
'''end if''' | |||
'' // | ''// Make x the new root'' | ||
'' | ''y''.parent := ''x'' | ||
'' // x | ''// Update the size of x'' | ||
'' | ''x''.size := ''x''.size + ''y''.size | ||
आकार को | '''end function''' | ||
आकार को एकत्र करने के लिए आवश्यक बिट्स की संख्या स्पष्ट रूप से एकत्र करने के लिए आवश्यक बिट्स की संख्या {{mvar|n}} है, यह वन के आवश्यक भंडारण में स्थिर कारक जोड़ता है। | |||
==== रैंक द्वारा संघ ==== | ==== रैंक द्वारा संघ ==== | ||
रैंक द्वारा संघ के लिए, | रैंक द्वारा संघ के लिए, ग्रंथि इसे संग्रहीत करता है {{em|rank}}, जो इसकी ऊंचाई के लिए ऊपरी सीमा है। जब ग्रंथि को आरंभीकृत किया जाता है, तो उसकी रैंक शून्य पर उपसमुच्चय हो जाती है। वृक्षों को जड़ों से मिलाने के लिए {{mvar|x}} एवं {{mvar|y}}, पूर्व उनके रैंकों की तुलना करें। यदि रैंक भिन्न हैं, तो बड़ा रैंक वृक्ष माता-पिता बन जाता है, एवं रैंक {{mvar|x}} एवं {{mvar|y}} परिवर्तित नहीं होते है। यदि रैंक समान हैं, तो कोई भी माता-पिता बन सकता है, किन्तु नए माता-पिता की रैंक में वृद्धि होती है। जबकि ग्रंथि का रैंक स्पष्ट रूप से इसकी ऊंचाई से संबंधित होता है, रैंकों को संग्रहित करना ऊंचाइयों को संग्रहित करने से अधिक कुशल होता है। ग्रंथि की ऊंचाई समय परिवर्तित कर सकती है <code>Find</code> संचालन, इसलिए रैंकों को संग्रहित करने से ऊंचाई को सही रखने के अतिरिक्त प्रयत्नों से बचा जाता है। स्यूडोकोड में, रैंक द्वारा संघ है। | ||
'''function''' Union(''x'', ''y'') '''is''' | |||
'' // | ''// Replace nodes by roots'' | ||
''x'' := Find(''x'') | ''x'' := Find(''x'') | ||
'' | ''y'' := Find(''y'') | ||
'''if''' ''x'' = ''y'' '''then''' | |||
'''return''' ''// x and y are already in the same set'' | |||
'''end if''' | |||
''// | ''// If necessary, rename variables to ensure that'' | ||
''// x | ''// x has rank at least as large as that of y'' | ||
'''if''' ''x''.rank < ''y''.rank '''then''' | |||
(''x'', ''y'') := (''y'', ''x'') | (''x'', ''y'') := (''y'', ''x'') | ||
'''end if''' | |||
'' // | ''// Make x the new root'' | ||
'' | ''y''.parent := ''x'' | ||
''// | ''// If necessary, increment the rank of x'' | ||
'''if''' ''x''.rank = ''y''.rank '''then''' | |||
''x''. | ''x''.rank := ''x''.rank + 1 | ||
'''end if''' | |||
यह दिखाया जा सकता है कि प्रत्येक | '''end function''' | ||
यह दिखाया जा सकता है कि प्रत्येक ग्रंथि में रैंक<math>\lfloor \log n \rfloor</math> है ।<ref name="Cormen2009" /> परिणाम स्वरुप प्रत्येक रैंक में {{math|''O''(log log ''n'')}} संग्रहीत किया जा सकता है, बिट्स एवं सभी रैंकों को एकत्र किया जा सकता है {{math|''O''(''n'' log log ''n'')}} बिट्स,यह रैंकों को वन के आकार का विषम रूप से नगण्य भाग बनाता है। | |||
उपरोक्त कार्यान्वयन से यह स्पष्ट है कि | उपरोक्त कार्यान्वयन से यह स्पष्ट है कि ग्रंथि का आकार एवं रैंक तब तक महत्व नहीं रखता जब तक कि ग्रंथि वृक्ष की जड़ न हो। जब ग्रंथि एक बच्चा बन जाता है, तो इसका आकार एवं रैंक तत्पश्चात कभी नहीं देखा जाता है। | ||
== समय जटिलता == | == समय जटिलता == | ||
विसंधित-उपसमुच्चय वन कार्यान्वयन जिसमें <code>Find</code> जनक सूचक्स को अद्यतन नहीं करता है, एवं जिसमें <code>Union</code> वृक्ष की ऊंचाई को नियंत्रित करने का प्रयत्न नहीं करता, {{math|''O''(''n'')}} ऊंचाई वाले वृक्ष हो सकते हैं, ऐसी स्थिति में द <code>Find</code> एवं <code>Union</code> संचालन की आवश्यकता है। | |||
यदि कोई कार्यान्वयन अकेले पथ संपीड़न का उपयोग करता है, तो | यदि कोई कार्यान्वयन अकेले पथ संपीड़न का उपयोग करता है, तो क्रम {{mvar|n}} <code>MakeSet</code> संचालन, उसके पश्चात तक {{math|''n'' − 1}} <code>Union</code> संचालन एवं {{math|''f''}} <code>Find</code> संचालन, <math>\Theta(n+f \cdot \left(1 + \log_{2+f/n} n\right))</math>का सबसे निकृष्ट समय चल रहा है।<ref name="Cormen2009">{{cite book|first1=Thomas H.|last1=Cormen| author1-link=Thomas H. Cormen|first2=Charles E.|last2=Leiserson|author2-link=Charles E. Leiserson|first3=Ronald L.|last3=Rivest| author3-link=Ronald L. Rivest|first4=Clifford|last4=Stein|author4-link=Clifford Stein|title=एल्गोरिदम का परिचय| edition=Third|publisher=MIT Press|chapter=Chapter 21: Data structures for Disjoint Sets|pages=571–572| isbn=978-0-262-03384-8| year=2009|title-link=एल्गोरिदम का परिचय }}</ref> रैंक द्वारा संघ का उपयोग करना, किन्तु माता-पिता सूचक्स को अद्यतन किए बिना <code>Find</code>, का चलने का समय देता है <math>\Theta(m \log n)</math> के लिए {{mvar|m}} किसी भी प्रकार का संचालन, तक {{mvar|n}} जिनमें से <code>MakeSet</code> संचालन हैं ।<ref name="Cormen2009"/> | ||
रैंक द्वारा संघ का उपयोग करना, किन्तु माता-पिता | |||
आकार या रैंक द्वारा संघ के साथ पथ संपीड़न, विभाजन, | आकार या रैंक द्वारा संघ के साथ पथ संपीड़न, विभाजन, करने का संयोजन, चलने के समय को अर्घ्य करता है, {{mvar|m}} किसी भी प्रकार का संचालन, तक जिनमें से {{mvar|n}} हैं <code>MakeSet</code> संचालन <math>\Theta(m\alpha(n))</math> करने के लिए,<ref name="Tarjan1984"/><ref name="Tarjan1979"/> यह प्रत्येक संचालन का परिशोधन विश्लेषण करता है <math>\Theta(\alpha(n))</math>. यह विसंधित रूप से इष्टतम है, जिसका अर्थ है कि प्रत्येक विसंधित उपसमुच्चय डेटा संरचना का उपयोग करना चाहिए <math>\Omega(\alpha(n))</math> प्रति संचालन परिशोधित समय।<ref name="Fredman1989"/> यहाँ, फंक्शन <math>\alpha(n)</math> एकरमैन फ़ंक्शन # उलटा है। व्युत्क्रम एकरमैन फ़ंक्शन असाधारण रूप से मंद-मंद बढ़ता है, इसलिए यह कारक है {{math|4}} या किसी के लिए अर्घ्य {{mvar|n}} जो वास्तव में भौतिक ब्रह्मांड में लिखा जा सकता है। यह असंबद्ध-उपसमुच्चय संचालन को व्यावहारिक रूप से परिशोधित स्थिर समय बनाता है। | ||
=== यूनियन- | विसंधित-उपसमुच्चय वन के प्रदर्शन का स्थिर विश्लेषण कुछ कठिन है। चूंकि, अधिक सरल विश्लेषण है जो यह प्रमाणित करता है कि किसी के लिए परिशोधित समय {{mvar|m}} <code>Find</code> या <code>Union</code> विसंधित-उपसमुच्चय वन युक्त पर संचालन {{mvar|n}} वस्तुएं हैं. {{math|''O''(mlog<sup>*</sup> ''n'')}}, जहाँ {{math|log<sup>*</sup>}} पुनरावृत्त लघुगणक को दर्शाता है।<ref>[[Raimund Seidel]], Micha Sharir. "Top-down analysis of path compression", SIAM J. Comput. 34(3):515–525, 2005</ref><ref>{{cite journal|last1=Tarjan|first1=Robert Endre|year=1975|title=एक अच्छे लेकिन रैखिक सेट यूनियन एल्गोरिथम की दक्षता|url=http://portal.acm.org/citation.cfm?id=321884|journal=Journal of the ACM|volume=22| issue=2| pages=215–225 | doi=10.1145/321879.321884|hdl=1813/5942|s2cid=11105749|hdl-access=free}}</ref><ref>{{cite journal| last1=Hopcroft|first1=J. E.| last2=Ullman|first2=J. D.|year=1973|title=मर्जिंग एल्गोरिदम सेट करें|journal=SIAM Journal on Computing|volume=2| issue=4| pages=294–303 | doi=10.1137/0202024}}</ref><ref>[[Robert E. Tarjan]] and [[Jan van Leeuwen]]. Worst-case analysis of set union algorithms. Journal of the ACM, 31(2):245–281, 1984.</ref> | ||
प्रमेयिका 1: जैसे-जैसे डिसजॉइंट-उपसमुच्चय डेटा संरचना संबंध उपसमुच्चय वन मूल के साथ-साथ पथ का अनुसरण करता है, ग्रंथि का रैंक बढ़ता जा रहा है। | |||
{{ | {{math proof| प्रमाण करते हैं कि डेटा समुच्चय पर फाइंड और यूनियन संचालन प्रारम्भ होते हैं, यह तथ्य समय के साथ सही रहता है। प्रारंभ में जब प्रत्येक नोड स्वयं के वृक्ष की जड़ है, तो यह तुच्छ रूप से सत्य है। एकमात्र विषय जब नोड का रैंक परिवर्तित किया जा सकता है, जब कार्यवाही प्रारम्भ होती है। इस विषय में, अल्प रैंक वाले वृक्ष को बड़े रैंक वाले वृक्ष से जोड़ा जाएगा, और शोध कार्यवाही के समय, पथ के साथ देखे गए सभी नोड रूट से जुड़े होंगे, जिसकी रैंक उसके बच्चों से बड़ी है, इसलिए यह कार्यवाही इस तथ्य को भी परिवर्तित नहीं करेगी।}} | ||
{{ | लेम्मा 2: ग्रंथि {{mvar|u}} जो रैंक के साथ सब वृक्ष का मूल {{mvar|r}} अर्घ्य से <math>2^r</math> ग्रंथि् है। | ||
< | {{math proof|प्रारंभ में जब प्रत्येक ग्रंथि स्वयं के वृक्ष की जड़ है, तो यह तुच्छ रूप से सत्य है। मान लें कि r रैंक वाले नोड u में कम से कम 2r नोड हैं। फिर जब रैंक r वाले दो पेड़ों को ऑपरेशन यूनियन द्वारा रैंक का उपयोग करके विलय कर दिया जाता है, रैंक r + 1 परिणाम वाला पेड़, जिसकी जड़ में कम से कम <math>2^r + 2^r = 2^{r + 1}</math> ग्रंथि होती है।}}लेम्मा 3: रैंक के नोड्स की अधिकतम संख्या {{mvar|r}} अधिकतम से अधिकतम <math>\frac{n}{2^r}</math>है। | ||
{{math proof| | {{math proof|लेम्मा 2 से, हम जानते हैं, कि ग्रंथि u जो कि रैंक r के साथ सबवृक्ष की जड़ है, कम से कम है{{mvar|r}} has at least <math>2^r</math> ग्रंथि है। हमें रैंक आर के ग्रंथि की अधिकतम संख्या तब मिलेगी जब रैंक आर वाला प्रत्येक ग्रंथि पेड़ की जड़ है जिसमें बिल्कुल है {{mvar|r}} <math>2^r</math> इस स्थितिमें, रैंक आर के ग्रंथि की संख्या {{mvar|r}} is <math>\frac{n}{2^r}.</math>है।}} | ||
सुविधा के लिए, हम यहां बकेट को परिभाषित करते हैं: बकेट उपसमुच्चय है जिसमें विशेष रैंक वाले वर्टिकल होते हैं। | |||
हम कुछ बकेट बनाते हैं एवं उनके रैंक के अनुसार बाल्टियों में वर्टिकल डालते हैं। अर्थात, रैंक 0 वाले कोने शून्य बकेट में जाते हैं, रैंक 1 वाले वर्टिकल प्रथम बकेट में जाते हैं, रैंक 2 एवं 3 वाले वर्टिकल दूसरी बकेट में जाते हैं। यदि {{mvar|B}}-थ बकेट में अंतराल से रैंक वाले वर्टिकल होते हैं <math>\left[r, 2^r - 1\right] = [r, R - 1]</math> तब (B+1)st बकेट में अंतराल से रैंक वाले शीर्ष होंगे <math>\left[R, 2^R - 1\right].</math>होंगे। | |||
[[File:Proof_of_O(log*n)_Union_Find.jpg|center|frame|का सबूत <math>O(\log^*n)</math> संघ शोधें]]हम बाल्टियों के विषय में दो अवलोकन कर सकते हैं। | |||
# बकेट की कुल संख्या अधिक से अधिक {{math|log<sup>*</sup>''n''}} है। | |||
#: प्रमाण: जब हम बाल्टी से दूसरी बाल्टी में जाते हैं, तो हम शक्ति में दो जोड़ देते हैं, अर्थात आगामी बाल्टी <math>\left[B, 2^B - 1\right]</math> <math>\left[2^B, 2^{2^B} - 1\right]</math>होगा। | |||
# बाल्टी में तत्वों की अधिकतम संख्या <math>\left[B, 2^B - 1\right]</math> अधिक से अधिक <math>\frac{2n}{2^B}</math> है। | |||
# | #: प्रमाण: बाल्टी में तत्वों की अधिकतम संख्या <math>\left[B, 2^B - 1\right]</math> अधिक से अधिक <math>\frac{n}{2^B} + \frac{n}{2^{B+1}} + \frac{n}{2^{B+2}} + \cdots + \frac{n}{2^{2^B - 1}} \leq \frac{2n}{2^B}.</math>है। | ||
#: प्रमाण: जब हम | {{mvar|F}} प्रदर्शन किए गए कार्यों की सूची का प्रतिनिधित्व करते हैं, एवं जाने दें, | ||
# | |||
#: | |||
<math display=block>T_1 = \sum_F\text{(link to the root)}</math> | <math display=block>T_1 = \sum_F\text{(link to the root)}</math> | ||
<math display=block>T_2 = \sum_F\text{(number of links traversed where the buckets are different)}</math> | <math display=block>T_2 = \sum_F\text{(number of links traversed where the buckets are different)}</math> | ||
<math display=block>T_3 = \sum_F\text{(number of links traversed where the buckets are the same).}</math> | <math display=block>T_3 = \sum_F\text{(number of links traversed where the buckets are the same).}</math> | ||
{{mvar|m}} तत्पश्चात कुल वित्त <math>T = T_1 + T_2 + T_3.</math> पाता है, चूंकि प्रत्येक शोध संचालन ठीक ट्रैवर्सल बनाता है जो मूल की ओर जाता है, हमारे पास {{math|1=''T''<sub>1</sub> = ''O''(''m'')}} है। | |||
चूंकि प्रत्येक शोध संचालन ठीक | |||
इसके अतिरिक्त, ऊपर की सीमा से बाल्टियों की संख्या पर, हमारे पास | इसके अतिरिक्त, ऊपर की सीमा से बाल्टियों की संख्या पर, हमारे पास {{math|1=''T''<sub>2</sub> = ''O''(''m''log<sup>*</sup>''n'')}} है। | ||
{{mvar|T<sub>3</sub>}} के लिए, मान लीजिए कि हम सीमा से निकल रहे हैं {{mvar|u}} को {{mvar|v}}, जहाँ {{mvar|u}} एवं {{mvar|v}} बकेट में रैंक {{math|[''B'', 2<sup>''B''</sup> − 1]}} है एवं {{mvar|v}} मूल नहीं है. हल करना {{mvar|u}} एवं <math>v_1, v_2, \ldots, v_k</math> अनुक्रम पर विचार करें, कि विभिन्न शोध कार्यों में {{mvar|v}} भूमिका निभाएं। पथ संपीड़न के कारण एवं किनारे को मूल के लिए लेखांकन नहीं करने के कारण, इस अनुक्रम में केवल भिन्न-भिन्न ग्रंथि होते हैं एवं बढ़ती रैंक लेम्मा के कारण हम जानते हैं कि इस क्रम में ग्रंथि् की रैंक सख्ती से बढ़ रही है। बकेट में दोनों ग्रंथि् होने से हम यह निष्कर्ष निकाल सकते हैं कि लंबाई {{mvar|k}} अनुक्रम का बाल्टियों में रैंकों की अधिकतम संख्या {{mvar|B}} है, अर्थात अधिक से अधिक <math>2^B - 1 - B < 2^B.</math>हैं, इसलिए, <math>T_3 \leq \sum_{[B, 2^B - 1]} \sum_u 2^B.</math>टिप्पणियों से अधिकतम बाल्टियाँ एवं अधिकतम बकेट आकार, हम यह निष्कर्ष निकाल सकते हैं ।<math display="inline">T_3 \leq \sum_{B} 2^B \frac{2n}{2^B} \leq 2 n \log^* n.</math> | |||
इसलिए, <math>T_3 \leq \sum_{[B, 2^B - 1]} \sum_u 2^B.</math> | |||
टिप्पणियों से | |||
इसलिए, <math>T = T_1 + T_2 + T_3 = O(m \log^*n).</math> | इसलिए, <math>T = T_1 + T_2 + T_3 = O(m \log^*n).</math> | ||
== अनुप्रयोग == | == अनुप्रयोग == | ||
[[File:UnionFindKruskalDemo.gif|250px|thumb|न्यूनतम विस्तृत | [[File:UnionFindKruskalDemo.gif|250px|thumb|न्यूनतम विस्तृत वृक्ष का शोधन करने के लिए क्रुस्कल के एल्गोरिदम का उपयोग करते समय संघ-शोध के लिए डेमो।]]असंयुक्त-उपसमुच्चय डेटा संरचनाएं उपसमुच्चय के विभाजन को चित्रित करती हैं, उदाहरण के लिए [[अप्रत्यक्ष ग्राफ]] के सम्बद्ध घटक (ग्राफ सिद्धांत) का ट्रैक रखने के लिए इस आकार का उपयोग तब यह निर्धारित करने के लिए किया जा सकता है कि क्या दो कोने घटक से संबंधित हैं, या क्या उनके मध्य किनारा जोड़ने से चक्र बन जाएगा। यूनियन-फाइंड एल्गोरिथम का उपयोग [[एकीकरण (कंप्यूटर विज्ञान)]] के उच्च-प्रदर्शन कार्यान्वयन में किया जाता है।<ref name="Knight1989">{{cite journal|last1=Knight|first1=Kevin|year=1989|title=Unification: A multidisciplinary survey|journal=ACM Computing Surveys|pages=93–124|doi=10.1145/62029.62030|volume=21|s2cid=14619034|url=http://www.isi.edu/natural-language/people/unification-knight.pdf }}</ref> | ||
इस डेटा संरचना का उपयोग [[बूस्ट ग्राफ लाइब्रेरी]] द्वारा इसकी [http://www.boost.org/libs/graph/doc/incremental_components.html इंक्रीमेंटल कनेक्टेड कंपोनेंट्स] कार्यक्षमता को | इस डेटा संरचना का उपयोग [[बूस्ट ग्राफ लाइब्रेरी]] द्वारा इसकी [http://www.boost.org/libs/graph/doc/incremental_components.html इंक्रीमेंटल कनेक्टेड कंपोनेंट्स] कार्यक्षमता को प्रारम्भ करने के लिए किया जाता है। ग्राफ़ के न्यूनतम विस्तृत वृक्ष का शोधन करने के लिए क्रस्कल के एल्गोरिदम को प्रारम्भ करने में यह महत्वपूर्ण घटक भी है। | ||
ध्यान दें कि असंयुक्त-उपसमुच्चय वनों के रूप में नियमित कार्यान्वयन किनारों को | ध्यान दें कि असंयुक्त-उपसमुच्चय वनों के रूप में नियमित कार्यान्वयन किनारों को विस्थापित करने की अनुमति नहीं देता है, यहां तक कि पथ संपीड़न या रैंक हेयुरिस्टिक के बिना भी चूंकि, आधुनिक कार्यान्वयन उपस्थित हैं जो निरंतर-समय के विलोपन की अनुमति देते हैं।<ref>{{Cite book |url=https://www.worldcat.org/oclc/262681795 |title=Automata, languages and programming : 32nd international colloquium, ICALP 2005, Lisbon, Portugal, July 11-15, 2005 ; proceedings |date=2005 |publisher=Springer |others=Luís. Caires, European Association for Theoretical Computer Science |isbn=978-3-540-31691-6 |location=Berlin |oclc=262681795}}</ref> | ||
शारीर एवं अग्रवाल ने | शारीर एवं अग्रवाल ने संबंध -उपसमुच्चय के सबसे निकृष्ट स्थिति वाले व्यवहार एवं डेवनपोर्ट-शिनज़ेल अनुक्रम की लंबाई के मध्य संबंध की रिपोर्ट की डेवनपोर्ट-शिनज़ेल अनुक्रम, मिश्रित ज्यामिति से संयोजन संरचना<ref name="Sharir1995">{{cite book|first1=M.|last1=Sharir|first2=P.|last2=Agarwal|title=डेवनपोर्ट-सिनजेल अनुक्रम और उनके ज्यामितीय अनुप्रयोग|title-link= Davenport–Schinzel Sequences and Their Geometric Applications|publisher=Cambridge University Press|year=1995}}</ref> एल्गोरिथम में यूनियन-फाइंड का उपयोग करता है। | ||
== यह भी देखें == | == यह भी देखें == | ||
* {{annotated link| | * {{annotated link|विभाजन शोधन}}, असंयुक्त उपसमुच्चय को बनाए रखने के लिए भिन्न डेटा संरचना, ऐसे अद्यतन के साथ जो उपसमुच्चय को साथ मिलाने के अतिरिक्त भिन्न कर देता है | ||
* {{annotated link| | * {{annotated link|गतिशील संयोजकता}} | ||
== संदर्भ == | == संदर्भ == | ||
Line 242: | Line 237: | ||
== | == बाप्रत्येकी संबंध == | ||
* [https://www.boost.org/doc/libs/1_31_0/libs/disjoint_sets/disjoint_sets.html C++ implementation], part of the [[Boost C++ libraries]] | * [https://www.boost.org/doc/libs/1_31_0/libs/disjoint_sets/disjoint_sets.html C++ implementation], part of the [[Boost C++ libraries]] | ||
Line 250: | Line 245: | ||
* [http://www.mathblog.dk/disjoint-set-data-structure/ Visual explanation and C# code] | * [http://www.mathblog.dk/disjoint-set-data-structure/ Visual explanation and C# code] | ||
[[Category:CS1 maint]] | |||
[[Category:Collapse templates]] | |||
[[Category: | |||
[[Category:Created On 13/05/2023]] | [[Category:Created On 13/05/2023]] | ||
[[Category:Lua-based templates]] | |||
[[Category:Machine Translated Page]] | |||
[[Category:Navigational boxes| ]] | |||
[[Category:Navigational boxes without horizontal lists]] | |||
[[Category:Pages with script errors]] | |||
[[Category:Sidebars with styles needing conversion]] | |||
[[Category:Template documentation pages|Documentation/doc]] | |||
[[Category:Templates Vigyan Ready]] | |||
[[Category:Templates generating microformats]] | |||
[[Category:Templates that add a tracking category]] | |||
[[Category:Templates that are not mobile friendly]] | |||
[[Category:Templates that generate short descriptions]] | |||
[[Category:Templates using TemplateData]] | |||
[[Category:Wikipedia metatemplates]] | |||
[[Category:खोज एल्गोरिदम]] | |||
[[Category:परिशोधित डेटा संरचनाएं]] | |||
[[Category:स्यूडोकोड के उदाहरण वाले लेख]] |
Latest revision as of 16:07, 30 October 2023
Disjoint-set/Union-find Forest | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Type | multiway tree | ||||||||||||
Invented | 1964 | ||||||||||||
Invented by | Bernard A. Galler and Michael J. Fischer | ||||||||||||
Time complexity in big O notation | |||||||||||||
|
कंप्यूटर विज्ञान में, विसंधित-सेट डेटा संरचना, जिसे संघ-शोध डेटा संरचना या मर्ज-शोध उपसमुच्चय भी कहा जाता है, डेटा संरचना है जो भिन्न-भिन्न उपसमुच्चय (गैर-ओवरलैपिंग) उपसमुच्चय (गणित) का संग्रह संग्रहीत करती है। समतुल्य रूप से, यह उपसमुच्चय के विभाजन को असंबद्ध उपसमुच्चय में संग्रहीत करता है। यह नए उपसमुच्चय जोड़ने, विलय करने वाले उपसमुच्चय (उन्हें उनके संघ (उपसमुच्चय सिद्धांत) द्वारा प्रतिस्थापित करने) एवं उपसमुच्चय के प्रतिनिधि सदस्य का शोधन करने के लिए संचालन प्रदान करता है। अंतिम संक्रिया कुशलतापूर्वक यह यह ज्ञात करने के लिए संभव बनाती है कि क्या कोई दो तत्व भिन्न-भिन्न उपसमुच्चय में हैं।
जबकि असंयुक्त-उपसमुच्चय डेटा संरचनाओं को प्रारम्भ करने की कई प्रविधि हैं, व्यवहार में उन्हें प्रायः विशेष कार्यान्वयन के साथ पहचाना जाता है जिसे विसंधित-उपसमुच्चय वन कहा जाता है। यह विशेष प्रकार का वन (ग्राफ सिद्धांत) है जो संघों को निष्पादित करता है एवं निकट-निरंतर परिशोधित विश्लेषण में मिलता है। m के लिए जोड़ का क्रम करने, संघ, या विसंधित-उपसमुच्चय वन पर संचालन n ग्रंथि्स को कुल समय की आवश्यकता होती है। O(mα(n)), जहाँ α(n) अधिकतम मंद गति से बढ़ने व्युत्क्रम एकरमैन फंक्शन है। विसंधित वन प्रति-कार्रवाई के आधार पर इस प्रदर्शन का उत्तरदायित्व नहीं देते हैं। व्यक्तिगत संघ एवं शोध संचालन स्थिर समय से अधिक समय ले सकते हैं। α(n) समय, किन्तु प्रत्येक संचालन विभिन्न उपसमुच्चय वन को स्वयं को समायोजित करने का कारण बनता है, जिससे क्रमिक संचालन तीव्र हो। विसंधित-उपसमुच्चय वन विसंधित रूप से इष्टतम एवं व्यावहारिक रूप से कुशल दोनों हैं।
ग्राफ़ के न्यूनतम विस्तृत वृक्ष को शोधने के लिए क्रुस्कल के एल्गोरिदम में भिन्न-भिन्न उपसमुच्चय डेटा संरचनाएं महत्वपूर्ण भूमिका निभाती हैं। न्यूनतम विस्तृत हुए वृक्षों के महत्व का अर्थ है कि भिन्न-भिन्न उपसमुच्चय डेटा संरचनाएं विभिन्न प्रकार के एल्गोरिदम के अंतर्गत आती हैं। इसके अतिरिक्त भिन्न-भिन्न उपसमुच्चय डेटा संरचनाओं में प्रतीकात्मक संगणना के साथ-साथ संकलक में भी अनुप्रयोग होते हैं।
इतिहास
1964 में बर्नार्ड ए. गैलर एवं माइकल जे. फिशर द्वारा संधि भंग-उपसमुच्चय वनों का प्रथम बार वर्णन किया गया था।[2] 1973 में, उनकी समय जटिलता को सीमित कर दिया गया था , का पुनरावृत्त लघुगणक , जॉन हॉपक्रॉफ्ट एवं जेफरी उल्मैन द्वारा[3] 1975 में, रॉबर्ट टार्जन प्रमाणित करने वाले प्रथम व्यक्ति थे। एल्गोरिथम की समय जटिलता पर ऊपरी सीमा,[4] एवं, 1979 में, दिखाया कि यह प्रतिबंधित विषय के लिए निचली सीमा थी।[5] 1989 में, माइकल फ्रेडमैन एवं माइकल सक्स (गणितज्ञ) ने इसे दिखाया। (परिशोधित) शब्दों को किसी भी विसंधित-उपसमुच्चय डेटा संरचना प्रति संचालन द्वारा एक्सेस किया जाना चाहिए,[6] जिससे डेटा संरचना की इष्टतमता प्रमाणित होती है।
1991 में, गैलील एवं इटालियनो ने भिन्न-भिन्न उपसमुच्चयों के लिए डेटा संरचनाओं का सर्वेक्षण प्रकाशित किया।[7] 1994 में, रिचर्ड जे. एंडरसन एवं हीथर वोल ने यूनियन-फाइंड के समानांतर संस्करण का वर्णन किया जिसे कभी ब्लॉक करने की आवश्यकता नहीं है।[8] 2007 में, सिल्वेन कॉनचॉन एवं जीन-क्रिस्टोफ़ फ़िलिआट्रे ने असंयुक्त-उपसमुच्चय वन डेटा संरचना का अर्ध-स्थायी डेटा संरचना संस्करण विकसित किया एवं प्रमाण सहायक Coq का उपयोग करके इसकी शुद्धता को औपचारिक रूप दिया।[9] सेमी-पर्सिस्टेंट का अर्थ है कि संरचना के पूर्व संस्करणों को कुशलता से बनाए रखा जाता है, किन्तु डेटा संरचना के पूर्व संस्करणों तक पहुंच पश्चात के संस्करणों को अमान्य कर देती है। उनका सबसे तीव्र कार्यान्वयन गैर-स्थायी एल्गोरिदम के रूप में लगभग उतना ही कुशल प्रदर्शन प्राप्त करता है। वे जटिलता विश्लेषण नहीं करते हैं।
समस्याओं के प्रतिबंधित वर्ग पर उत्तम प्रदर्शन के साथ भिन्न-भिन्न उपसमुच्चय डेटा संरचनाओं के रूपों पर भी विचार किया गया है। गैबो एवं टारजन ने दिखाया कि यदि संभावित संघों को कुछ खास प्रविधियों से प्रतिबंधित किया जाता है, तो वास्तव में रैखिक समय एल्गोरिथम संभव है।[10]
प्रतिनिधित्व
असंयुक्त-उपसमुच्चय वन में प्रत्येक ग्रंथि में सूचक एवं कुछ सहायक जानकारी होती है, या तो आकार या रैंक (किन्तु दोनों नहीं)। सूचक्स का उपयोग जनक सूचक वृक्ष बनाने के लिए किया जाता है, जहाँ प्रत्येक ग्रंथि जो वृक्ष की जड़ नहीं है, स्वयं जनक को इंगित करता है। मूल ग्रंथि्स को दूसरों से भिन्न करने के लिए, उनके जनक सूचक्स में अमान्य मान होते हैं, जैसे कि ग्रंथि या प्रप्रत्येकी मान के लिए परिपत्र संदर्भ प्रत्येक वृक्ष वन में संग्रहीत उपसमुच्चय का प्रतिनिधित्व करता है, जिसमें उपसमुच्चय के सदस्य वृक्ष में ग्रंथि होते हैं। मूल ग्रंथि उपसमुच्चय प्रतिनिधि प्रदान करते हैं: दो ग्रंथि उपसमुच्चय में होते हैं यदि ग्रंथि्स वाले वृक्षों की जड़ें समान होती हैं।
वन में ग्रंथियो को किसी भी प्रकार से प्रयोग के लिए सुविधाजनक रूप से संग्रहीत किया जा सकता है, किन्तु सामान्य प्रक्रिया उन्हें सरणी में संग्रहीत करना है। इस विषय में, माता-पिता को उनके सरणी सूचकांक द्वारा इंगित किया जा सकता है। प्रत्येक सरणी प्रविष्टि की आवश्यकता होती है, पेरेंट सूचक के लिए एकत्रेज के बिट्स Θ(log n) शेष प्रविष्टि के लिए तुलनात्मक या अर्घ्य मात्रा में संग्रहण की आवश्यकता होती है, इसलिए वन को संग्रहीत करने के लिए आवश्यक बिट्स की संख्या Θ(n log n) है, यदि कोई कार्यान्वयन निश्चित आकार के ग्रंथियो का उपयोग करता है (जिससे वन के अधिकतम आकार को सीमित किया जा सकता है), तो आवश्यक भंडारण रैखिक n होता है।
संचालन
डिसजॉइंट-उपसमुच्चय डेटा स्ट्रक्चर्स तीन संचालनों का समर्थन करते हैं, नया उपसमुच्चय बनाना जिसमें नया तत्व होता है; किसी दिए गए तत्व वाले उपसमुच्चय के प्रतिनिधि को शोधन; एवं दो उपसमुच्चयों का विलय करना।
MakeSet
संचालन नए तत्व को नए उपसमुच्चय में जोड़ता है जिसमें केवल नया तत्व होता है, एवं नया उपसमुच्चय डेटा संरचना में जोड़ा जाता है। यदि डेटा संरचना को उपसमुच्चय के विभाजन के रूप में देखा जाता है, तो MakeSet
संचालन नए तत्व को जोड़कर उपसमुच्चय को बढ़ाता है, एवं यह नए तत्व को केवल नए तत्व वाले नए उपसमुच्चय में डालकर उपस्थित विभाजन का विस्तार करता है।
असंबद्ध वन में, MakeSet
ग्रंथि के जनक सूचक एवं ग्रंथि के आकार या रैंक को आवाक्षरित करता है। यदि जड़ को ग्रंथि द्वारा दर्शाया जाता है जो स्वयं को इंगित करता है, तो निम्नलिखित स्यूडोकोड का उपयोग करके तत्व जोड़ना वर्णित किया जा सकता है।
function MakeSet(x) is if x is not already in the forest then x.parent := x x.size := 1 // if nodes store size x.rank := 0 // if nodes store rank end if
end function
इस संचालन में निरंतर समय जटिलता है। विशेष रूप से, प्रारंभ a असंबद्ध उपसमुच्चय वन के साथ n ग्रंथि्स की आवश्यकता O(n) है।
व्यवहार में, MakeSet
संचालन से पूर्व होना चाहिए जो मेमोरी को होल्ड करने के लिए x आवंटित करता है, जब तक स्मृति आवंटन परिशोधित निरंतर-समय का संचालन है, यह उचित गतिशील सरणी कार्यान्वयन के लिए है, यह यादृच्छिक-उपसमुच्चय वन के स्पर्शोन्मुख प्रदर्शन को परिवर्तित नहीं करता है।
=== उपसमुच्चय प्रतिनिधि शोधन === Find
ई> संचालन निर्दिष्ट क्वेरी ग्रंथि से जनक सूचक्स की श्रृंखला x का अनुसरण करता है, जब तक यह मूल तत्व तक नहीं पहुंच जाता। यह मूल तत्व उस उपसमुच्चय x का प्रतिनिधित्व करता है x स्वयं Find
यह जिस मूल तत्व तक पहुंचता है उसे वापस कर देता है।
Find
प्रदर्शन कर रहा है, संचालन वन में सुधार के लिए महत्वपूर्ण अवसर प्रस्तुत करता है। a में समय Find
संचालन जनक सूचक्स का पीछा करते हुए Find
संचालन व्यय किया जाता है, इसलिए अनुनय वाला वृक्ष तीव्रता से आगे बढ़ता है । जब Find
निष्पादित किया जाता है, उत्तराधिकार में प्रत्येक जनक सूचक का अनुसरण करने की तुलना में मूल तक पहुंचने की कोई तीव्र प्रक्रिया नहीं होती है। चूंकि, इस शोध के समय देखे गए जनक सूचक्स को मूल के निकट इंगित करने के लिए अद्यतन किया जा सकता है। चूँकि मूल के मार्ग में देखा गया प्रत्येक तत्व उसी उपसमुच्चय का भाग होता है, इससे वन में संग्रहीत उपसमुच्चय परिवर्तित नहीं होते हैं। किन्तु यह भविष्य बनाता है Find
संचालन तीव्रता से, न केवल क्वेरी ग्रंथि एवं मूल के मध्य के ग्रंथि्स के लिए, जबकि उनके वंशजों के लिए भी यह अद्यतन असंबद्ध-उपसमुच्चय वन की परिशोधित प्रदर्शन आश्वाशन का महत्वपूर्ण भाग है।
Find
के लिए कई एल्गोरिदम हैं, जो विषम रूप से इष्टतम समय जटिलता प्राप्त करते हैं। एल्गोरिदम का परिवार, जिसे पथ संपीड़न के रूप में जाना जाता है, प्रत्येक ग्रंथि को क्वेरी ग्रंथि एवं मूल बिंदु से मूल के मध्य बनाता है। पथ संपीड़न को साधारण पुनरावर्तन का उपयोग करके निम्नानुसार कार्यान्वित किया जा सकता है।
function Find(x) is if x.parent ≠ x then x.parent := Find(x.parent) return x.parent else return x end if
end function
यह कार्यान्वयन दो मार्ग बनाता है, वृक्ष के ऊपर एवं पीछे की ओर, क्वेरी ग्रंथि से मूल तक पथ को संग्रहीत करने के लिए पर्याप्त स्क्रैच मेमोरी की आवश्यकता होती है (उपरोक्त स्यूडोकोड में, कॉल स्टैक का उपयोग करके पथ को स्पष्ट रूप से दर्शाया गया है)। इसे दिशा में दोनों निकट करके स्मृति की निरंतर मात्रा में घटाया जा सकता है। निरंतर मेमोरी कार्यान्वयन क्वेरी ग्रंथि से मूल तक दो बार चलता है, प्रथम बार मूल को शोध करने के लिए एवं दूसरी बार सूचक्स को अद्यतन करने के लिए होता है।
function Find(x) is root := x while root.parent ≠ root do root := root.parent end while while x.parent ≠ root do parent := x.parent x.parent := root x := parent end while return root
end function
रॉबर्ट ई. टारजन एवं जॉन वैन लीउवेन ने भी Find
वन-पास विकसित किया, एल्गोरिदम जो सबसे निकृष्ट स्थिति वाली जटिलता को बनाए रखते हैं, किन्तु व्यवहार में अधिक कुशल होते हैं।[4] इन्हें पथ विभाजन एवं पथ आधान कहा जाता है। ये दोनों क्वेरी ग्रंथि एवं मूल के मध्य के पथ पर ग्रंथियों के जनक सूचकों को अद्यतन करते हैं। पथ विभाजन प्रत्येक जनक सूचक को उस पथ पर सूचक द्वारा ग्रंथि के दादा-दादी के लिए परिवर्तित कर देता है।
function Find(x) is while x.parent ≠ x do (x, x.parent) := (x.parent, x.parent.parent) end while return x
end function
पथ जोड़ समान रूप से कार्य करता है, किन्तु केवल प्रत्येक दूसरे जनक सूचक को परिवर्तित करता है।
function Find(x) is while x.parent ≠ x do x.parent := x.parent.parent x := x.parent end while return x
end function
दो उपसमुच्चयों का विलय
संचालन Union(x, y)
युक्त उपसमुच्चय को प्रतिस्थापित करता है प्रथम x एवं उपसमुच्चय युक्त y उनके संघ Union
के साथ उपयोग करता है, Find
युक्त वृक्षों की जड़ों का निर्धारण करने के लिए x एवं y. यदि जड़ें समान हैं, तो कुछ करने को नहीं है। अन्यथा, दो वृक्षों को मिला देना चाहिए। यह या तो जनक सूचक उपसमुच्चय करके किया जाता है x की जड़ y's, या के जनक सूचक y की जड़ x's को उपसमुच्चय करना हैं।
कौन सा ग्रंथि माता-पिता बनने का विकल्प वृक्ष पर भविष्य के संचालन की जटिलता के परिणाम हैं। यदि इसे असावधानी से किया जाए तो वृक्ष अत्यधिक ऊंचे हो सकते हैं। उदाप्रत्येकण के लिए, मान लीजिए Union
सदैव वृक्ष युक्त बनाया x युक्त वृक्ष का सबवृक्ष y ऐसे वन से प्रारम्भ करें, जिसे अभी-अभी तत्वों के साथ आरंभ किया गया है एवं , Union(1, 2)
, Union(2, 3)
, ..., Union(n - 1, n)
. परिणामी वन में वृक्ष होता है जिसकी जड़ n होती है, एवं 1 से पथ n वृक्ष में प्रत्येक ग्रंथि से होकर प्रवाहित होती है। इस वन के लिए, चलाने का समय Find(1)O(n)
है।
कुशल कार्यान्वयन में, वृक्ष की ऊंचाई को आकार या संघ द्वारा रैंक द्वारा संघ का उपयोग करके नियंत्रित किया जाता है। इन दोनों को स्वयं जनक सूचक के अतिरिक्त सूचनाओं को एकत्र करने के लिए ग्रंथि की आवश्यकता होती है। इस जानकारी का उपयोग यह निर्धारित करने के लिए किया जाता है कि कौन सा मूल नया जनक बनता है। दोनों रणनीतियाँ सुनिश्चित करती हैं।
आकार से संघ
आकार के संघ की स्थिति में, ग्रंथि स्वयं आकार को संग्रहीत करता है, जो केवल इसके वंशजों की संख्या है (ग्रंथि सहित)। जब वृक्ष जड़ों के साथ x एवं y विलय किए जाते हैं, तो अधिक असंतोष वाला ग्रंथि जनक बन जाता है। यदि दो ग्रंथियों के वंशजों की संख्या समान है, तो कोई भी माता-पिता बन सकता है। दोनों ही स्थितियों में, नए जनक ग्रंथि का आकार उसके वंशजों की नई कुल संख्या पर उपसमुच्चय होता है।
function Union(x, y) is // Replace nodes by roots x := Find(x) y := Find(y) if x = y then return // x and y are already in the same set end if // If necessary, swap variables to ensure that // x has at least as many descendants as y if x.size < y.size then (x, y) := (y, x) end if // Make x the new root y.parent := x // Update the size of x x.size := x.size + y.size
end function
आकार को एकत्र करने के लिए आवश्यक बिट्स की संख्या स्पष्ट रूप से एकत्र करने के लिए आवश्यक बिट्स की संख्या n है, यह वन के आवश्यक भंडारण में स्थिर कारक जोड़ता है।
रैंक द्वारा संघ
रैंक द्वारा संघ के लिए, ग्रंथि इसे संग्रहीत करता है rank, जो इसकी ऊंचाई के लिए ऊपरी सीमा है। जब ग्रंथि को आरंभीकृत किया जाता है, तो उसकी रैंक शून्य पर उपसमुच्चय हो जाती है। वृक्षों को जड़ों से मिलाने के लिए x एवं y, पूर्व उनके रैंकों की तुलना करें। यदि रैंक भिन्न हैं, तो बड़ा रैंक वृक्ष माता-पिता बन जाता है, एवं रैंक x एवं y परिवर्तित नहीं होते है। यदि रैंक समान हैं, तो कोई भी माता-पिता बन सकता है, किन्तु नए माता-पिता की रैंक में वृद्धि होती है। जबकि ग्रंथि का रैंक स्पष्ट रूप से इसकी ऊंचाई से संबंधित होता है, रैंकों को संग्रहित करना ऊंचाइयों को संग्रहित करने से अधिक कुशल होता है। ग्रंथि की ऊंचाई समय परिवर्तित कर सकती है Find
संचालन, इसलिए रैंकों को संग्रहित करने से ऊंचाई को सही रखने के अतिरिक्त प्रयत्नों से बचा जाता है। स्यूडोकोड में, रैंक द्वारा संघ है।
function Union(x, y) is // Replace nodes by roots x := Find(x) y := Find(y) if x = y then return // x and y are already in the same set end if // If necessary, rename variables to ensure that // x has rank at least as large as that of y if x.rank < y.rank then (x, y) := (y, x) end if // Make x the new root y.parent := x // If necessary, increment the rank of x if x.rank = y.rank then x.rank := x.rank + 1 end if
end function
यह दिखाया जा सकता है कि प्रत्येक ग्रंथि में रैंक है ।[11] परिणाम स्वरुप प्रत्येक रैंक में O(log log n) संग्रहीत किया जा सकता है, बिट्स एवं सभी रैंकों को एकत्र किया जा सकता है O(n log log n) बिट्स,यह रैंकों को वन के आकार का विषम रूप से नगण्य भाग बनाता है।
उपरोक्त कार्यान्वयन से यह स्पष्ट है कि ग्रंथि का आकार एवं रैंक तब तक महत्व नहीं रखता जब तक कि ग्रंथि वृक्ष की जड़ न हो। जब ग्रंथि एक बच्चा बन जाता है, तो इसका आकार एवं रैंक तत्पश्चात कभी नहीं देखा जाता है।
समय जटिलता
विसंधित-उपसमुच्चय वन कार्यान्वयन जिसमें Find
जनक सूचक्स को अद्यतन नहीं करता है, एवं जिसमें Union
वृक्ष की ऊंचाई को नियंत्रित करने का प्रयत्न नहीं करता, O(n) ऊंचाई वाले वृक्ष हो सकते हैं, ऐसी स्थिति में द Find
एवं Union
संचालन की आवश्यकता है।
यदि कोई कार्यान्वयन अकेले पथ संपीड़न का उपयोग करता है, तो क्रम n MakeSet
संचालन, उसके पश्चात तक n − 1 Union
संचालन एवं f Find
संचालन, का सबसे निकृष्ट समय चल रहा है।[11] रैंक द्वारा संघ का उपयोग करना, किन्तु माता-पिता सूचक्स को अद्यतन किए बिना Find
, का चलने का समय देता है के लिए m किसी भी प्रकार का संचालन, तक n जिनमें से MakeSet
संचालन हैं ।[11]
आकार या रैंक द्वारा संघ के साथ पथ संपीड़न, विभाजन, करने का संयोजन, चलने के समय को अर्घ्य करता है, m किसी भी प्रकार का संचालन, तक जिनमें से n हैं MakeSet
संचालन करने के लिए,[4][5] यह प्रत्येक संचालन का परिशोधन विश्लेषण करता है . यह विसंधित रूप से इष्टतम है, जिसका अर्थ है कि प्रत्येक विसंधित उपसमुच्चय डेटा संरचना का उपयोग करना चाहिए प्रति संचालन परिशोधित समय।[6] यहाँ, फंक्शन एकरमैन फ़ंक्शन # उलटा है। व्युत्क्रम एकरमैन फ़ंक्शन असाधारण रूप से मंद-मंद बढ़ता है, इसलिए यह कारक है 4 या किसी के लिए अर्घ्य n जो वास्तव में भौतिक ब्रह्मांड में लिखा जा सकता है। यह असंबद्ध-उपसमुच्चय संचालन को व्यावहारिक रूप से परिशोधित स्थिर समय बनाता है।
विसंधित-उपसमुच्चय वन के प्रदर्शन का स्थिर विश्लेषण कुछ कठिन है। चूंकि, अधिक सरल विश्लेषण है जो यह प्रमाणित करता है कि किसी के लिए परिशोधित समय m Find
या Union
विसंधित-उपसमुच्चय वन युक्त पर संचालन n वस्तुएं हैं. O(mlog* n), जहाँ log* पुनरावृत्त लघुगणक को दर्शाता है।[12][13][14][15]
प्रमेयिका 1: जैसे-जैसे डिसजॉइंट-उपसमुच्चय डेटा संरचना संबंध उपसमुच्चय वन मूल के साथ-साथ पथ का अनुसरण करता है, ग्रंथि का रैंक बढ़ता जा रहा है।
प्रमाण करते हैं कि डेटा समुच्चय पर फाइंड और यूनियन संचालन प्रारम्भ होते हैं, यह तथ्य समय के साथ सही रहता है। प्रारंभ में जब प्रत्येक नोड स्वयं के वृक्ष की जड़ है, तो यह तुच्छ रूप से सत्य है। एकमात्र विषय जब नोड का रैंक परिवर्तित किया जा सकता है, जब कार्यवाही प्रारम्भ होती है। इस विषय में, अल्प रैंक वाले वृक्ष को बड़े रैंक वाले वृक्ष से जोड़ा जाएगा, और शोध कार्यवाही के समय, पथ के साथ देखे गए सभी नोड रूट से जुड़े होंगे, जिसकी रैंक उसके बच्चों से बड़ी है, इसलिए यह कार्यवाही इस तथ्य को भी परिवर्तित नहीं करेगी।
लेम्मा 2: ग्रंथि u जो रैंक के साथ सब वृक्ष का मूल r अर्घ्य से ग्रंथि् है।
प्रारंभ में जब प्रत्येक ग्रंथि स्वयं के वृक्ष की जड़ है, तो यह तुच्छ रूप से सत्य है। मान लें कि r रैंक वाले नोड u में कम से कम 2r नोड हैं। फिर जब रैंक r वाले दो पेड़ों को ऑपरेशन यूनियन द्वारा रैंक का उपयोग करके विलय कर दिया जाता है, रैंक r + 1 परिणाम वाला पेड़, जिसकी जड़ में कम से कम ग्रंथि होती है।
लेम्मा 3: रैंक के नोड्स की अधिकतम संख्या r अधिकतम से अधिकतम है।
लेम्मा 2 से, हम जानते हैं, कि ग्रंथि u जो कि रैंक r के साथ सबवृक्ष की जड़ है, कम से कम हैr has at least ग्रंथि है। हमें रैंक आर के ग्रंथि की अधिकतम संख्या तब मिलेगी जब रैंक आर वाला प्रत्येक ग्रंथि पेड़ की जड़ है जिसमें बिल्कुल है r इस स्थितिमें, रैंक आर के ग्रंथि की संख्या r is है।
सुविधा के लिए, हम यहां बकेट को परिभाषित करते हैं: बकेट उपसमुच्चय है जिसमें विशेष रैंक वाले वर्टिकल होते हैं।
हम कुछ बकेट बनाते हैं एवं उनके रैंक के अनुसार बाल्टियों में वर्टिकल डालते हैं। अर्थात, रैंक 0 वाले कोने शून्य बकेट में जाते हैं, रैंक 1 वाले वर्टिकल प्रथम बकेट में जाते हैं, रैंक 2 एवं 3 वाले वर्टिकल दूसरी बकेट में जाते हैं। यदि B-थ बकेट में अंतराल से रैंक वाले वर्टिकल होते हैं तब (B+1)st बकेट में अंतराल से रैंक वाले शीर्ष होंगे होंगे।
हम बाल्टियों के विषय में दो अवलोकन कर सकते हैं।
- बकेट की कुल संख्या अधिक से अधिक log*n है।
- प्रमाण: जब हम बाल्टी से दूसरी बाल्टी में जाते हैं, तो हम शक्ति में दो जोड़ देते हैं, अर्थात आगामी बाल्टी होगा।
- बाल्टी में तत्वों की अधिकतम संख्या अधिक से अधिक है।
- प्रमाण: बाल्टी में तत्वों की अधिकतम संख्या अधिक से अधिक है।
F प्रदर्शन किए गए कार्यों की सूची का प्रतिनिधित्व करते हैं, एवं जाने दें,
इसके अतिरिक्त, ऊपर की सीमा से बाल्टियों की संख्या पर, हमारे पास T2 = O(mlog*n) है।
T3 के लिए, मान लीजिए कि हम सीमा से निकल रहे हैं u को v, जहाँ u एवं v बकेट में रैंक [B, 2B − 1] है एवं v मूल नहीं है. हल करना u एवं अनुक्रम पर विचार करें, कि विभिन्न शोध कार्यों में v भूमिका निभाएं। पथ संपीड़न के कारण एवं किनारे को मूल के लिए लेखांकन नहीं करने के कारण, इस अनुक्रम में केवल भिन्न-भिन्न ग्रंथि होते हैं एवं बढ़ती रैंक लेम्मा के कारण हम जानते हैं कि इस क्रम में ग्रंथि् की रैंक सख्ती से बढ़ रही है। बकेट में दोनों ग्रंथि् होने से हम यह निष्कर्ष निकाल सकते हैं कि लंबाई k अनुक्रम का बाल्टियों में रैंकों की अधिकतम संख्या B है, अर्थात अधिक से अधिक हैं, इसलिए, टिप्पणियों से अधिकतम बाल्टियाँ एवं अधिकतम बकेट आकार, हम यह निष्कर्ष निकाल सकते हैं । इसलिए,
अनुप्रयोग
असंयुक्त-उपसमुच्चय डेटा संरचनाएं उपसमुच्चय के विभाजन को चित्रित करती हैं, उदाहरण के लिए अप्रत्यक्ष ग्राफ के सम्बद्ध घटक (ग्राफ सिद्धांत) का ट्रैक रखने के लिए इस आकार का उपयोग तब यह निर्धारित करने के लिए किया जा सकता है कि क्या दो कोने घटक से संबंधित हैं, या क्या उनके मध्य किनारा जोड़ने से चक्र बन जाएगा। यूनियन-फाइंड एल्गोरिथम का उपयोग एकीकरण (कंप्यूटर विज्ञान) के उच्च-प्रदर्शन कार्यान्वयन में किया जाता है।[16]
इस डेटा संरचना का उपयोग बूस्ट ग्राफ लाइब्रेरी द्वारा इसकी इंक्रीमेंटल कनेक्टेड कंपोनेंट्स कार्यक्षमता को प्रारम्भ करने के लिए किया जाता है। ग्राफ़ के न्यूनतम विस्तृत वृक्ष का शोधन करने के लिए क्रस्कल के एल्गोरिदम को प्रारम्भ करने में यह महत्वपूर्ण घटक भी है।
ध्यान दें कि असंयुक्त-उपसमुच्चय वनों के रूप में नियमित कार्यान्वयन किनारों को विस्थापित करने की अनुमति नहीं देता है, यहां तक कि पथ संपीड़न या रैंक हेयुरिस्टिक के बिना भी चूंकि, आधुनिक कार्यान्वयन उपस्थित हैं जो निरंतर-समय के विलोपन की अनुमति देते हैं।[17]
शारीर एवं अग्रवाल ने संबंध -उपसमुच्चय के सबसे निकृष्ट स्थिति वाले व्यवहार एवं डेवनपोर्ट-शिनज़ेल अनुक्रम की लंबाई के मध्य संबंध की रिपोर्ट की डेवनपोर्ट-शिनज़ेल अनुक्रम, मिश्रित ज्यामिति से संयोजन संरचना[18] एल्गोरिथम में यूनियन-फाइंड का उपयोग करता है।
यह भी देखें
- विभाजन शोधन, असंयुक्त उपसमुच्चय को बनाए रखने के लिए भिन्न डेटा संरचना, ऐसे अद्यतन के साथ जो उपसमुच्चय को साथ मिलाने के अतिरिक्त भिन्न कर देता है
- गतिशील संयोजकता
संदर्भ
- ↑ 1.0 1.1 1.2 1.3 1.4 1.5 Tarjan, Robert Endre (1975). "Efficiency of a Good But Not Linear Set Union Algorithm". Journal of the ACM. 22 (2): 215–225. doi:10.1145/321879.321884. hdl:1813/5942. S2CID 11105749.
- ↑ Galler, Bernard A.; Fischer, Michael J. (May 1964). "एक बेहतर तुल्यता एल्गोरिथ्म". Communications of the ACM. 7 (5): 301–303. doi:10.1145/364099.364331. S2CID 9034016.. The paper originating disjoint-set forests.
- ↑ Hopcroft, J. E.; Ullman, J. D. (1973). "मर्जिंग एल्गोरिदम सेट करें". SIAM Journal on Computing. 2 (4): 294–303. doi:10.1137/0202024.
- ↑ 4.0 4.1 4.2 Tarjan, Robert E.; van Leeuwen, Jan (1984). "सेट यूनियन एल्गोरिथम का वर्स्ट-केस विश्लेषण". Journal of the ACM. 31 (2): 245–281. doi:10.1145/62.2160. S2CID 5363073.
- ↑ 5.0 5.1 Tarjan, Robert Endre (1979). "एल्गोरिद्म का एक वर्ग जिसे असंयुक्त सेट बनाए रखने के लिए गैर-रैखिक समय की आवश्यकता होती है". Journal of Computer and System Sciences. 18 (2): 110–127. doi:10.1016/0022-0000(79)90042-4.
- ↑ 6.0 6.1 Fredman, M.; Saks, M. (May 1989). "गतिशील डेटा संरचनाओं की सेल जांच जटिलता". Proceedings of the Twenty-First Annual ACM Symposium on Theory of Computing: 345–354. doi:10.1145/73007.73040. ISBN 0897913078. S2CID 13470414.
Theorem 5: Any CPROBE(log n) implementation of the set union problem requires Ω(m α(m, n)) time to execute m Find's and n−1 Union's, beginning with n singleton sets.
- ↑ Galil, Z.; Italiano, G. (1991). "असंयुक्त सेट संघ समस्याओं के लिए डेटा संरचनाएं और एल्गोरिदम।". ACM Computing Surveys. 23 (3): 319–344. doi:10.1145/116873.116878. S2CID 207160759.
- ↑ Anderson, Richard J.; Woll, Heather (1994). संघ-खोज समस्या के लिए प्रतीक्षा-मुक्त समानांतर एल्गोरिदम. 23rd ACM Symposium on Theory of Computing. pp. 370–380.
- ↑ Conchon, Sylvain; Filliâtre, Jean-Christophe (October 2007). "A Persistent Union-Find Data Structure". एमएल पर एसीएम सिगप्लान वर्कशॉप. Freiburg, Germany.
- ↑ Harold N. Gabow, Robert Endre Tarjan, "A linear-time algorithm for a special case of disjoint set union," Journal of Computer and System Sciences, Volume 30, Issue 2, 1985, pp. 209–221, ISSN 0022-0000, https://doi.org/10.1016/0022-0000(85)90014-5
- ↑ 11.0 11.1 11.2 Cormen, Thomas H.; Leiserson, Charles E.; Rivest, Ronald L.; Stein, Clifford (2009). "Chapter 21: Data structures for Disjoint Sets". एल्गोरिदम का परिचय (Third ed.). MIT Press. pp. 571–572. ISBN 978-0-262-03384-8.
- ↑ Raimund Seidel, Micha Sharir. "Top-down analysis of path compression", SIAM J. Comput. 34(3):515–525, 2005
- ↑ Tarjan, Robert Endre (1975). "एक अच्छे लेकिन रैखिक सेट यूनियन एल्गोरिथम की दक्षता". Journal of the ACM. 22 (2): 215–225. doi:10.1145/321879.321884. hdl:1813/5942. S2CID 11105749.
- ↑ Hopcroft, J. E.; Ullman, J. D. (1973). "मर्जिंग एल्गोरिदम सेट करें". SIAM Journal on Computing. 2 (4): 294–303. doi:10.1137/0202024.
- ↑ Robert E. Tarjan and Jan van Leeuwen. Worst-case analysis of set union algorithms. Journal of the ACM, 31(2):245–281, 1984.
- ↑ Knight, Kevin (1989). "Unification: A multidisciplinary survey" (PDF). ACM Computing Surveys. 21: 93–124. doi:10.1145/62029.62030. S2CID 14619034.
- ↑ Automata, languages and programming : 32nd international colloquium, ICALP 2005, Lisbon, Portugal, July 11-15, 2005 ; proceedings. Luís. Caires, European Association for Theoretical Computer Science. Berlin: Springer. 2005. ISBN 978-3-540-31691-6. OCLC 262681795.
{{cite book}}
: CS1 maint: others (link) - ↑ Sharir, M.; Agarwal, P. (1995). डेवनपोर्ट-सिनजेल अनुक्रम और उनके ज्यामितीय अनुप्रयोग. Cambridge University Press.