अपने आप में मदद नहीं करता है। लॉक-फ्री डेटा संरचना में आपके डेटा संरचना को बदलने के लिए एकल परमाणु उदाहरण होने की आवश्यकता होती है। परमाणुनिरूपण केतुरंत पहले और तुरंत बाद दोनोंप्रतिनिधित्वकरनेवाले आक्रमणकारियोंको लागू होने की आवश्यकता है।O(1)
इसका मतलब है कि यदि आप डेटा संरचना में संशोधन कर रहे हैं तो महत्वपूर्ण विशेषता यह है कि आप निजी डेटा संरचना पर सभी मॉड्स कर सकते हैं और फिर एकल परमाणु निर्देश में संशोधनों में स्वैप कर सकते हैं।
लॉक-फ्रीडम आमतौर पर सबसे आसान होता है जब आपके डेटा स्ट्रक्चर होते हैं अपरिवर्तनीय ( विशुद्ध रूप से कार्यात्मक ) होती हैं। आप केवल डेटा संरचना के वर्तमान संस्करण के लिए एक वैश्विक सूचक रखते हैं। पाठकों को कुछ भी लॉक करने की आवश्यकता नहीं है। डेटा-संरचना में संशोधन वैश्विक सूचक को एक अपरिवर्तनीय डेटा संरचना को दूसरे में स्वैप करने से प्रभावित होता है।
उदाहरण के लिए: यदि आपके पास विशुद्ध रूप से कार्यात्मक पेड़ संतुलित वृक्ष है:
- वर्तमान वैश्विक पॉइंटर को पेड़ की जड़ में रिकॉर्ड करें।
- एक नया पेड़ बनाएं जो एक नोड को सम्मिलित करता है या हटाता है। (यह पेड़ में वर्तमान में नोड्स की संख्या में समय और स्थान में लघुगणक है, और संशोधन बिंदु से जड़ तक नए नोड बनाना शामिल है, और डेटा संरचना के पिछले संस्करण के पुराने भागों में बस सब कुछ नया इंगित करता है। )
- वैश्विक पॉइंटर को मूल रूप से तुलना और स्वैप करें। (ध्यान दें कि यदि आप पुराने रूट पॉइंटर को रिकॉर्ड करते समय और अब के बीच एक और संशोधन हुआ है तो यह विफल हो सकता है। यदि ऐसा होता है तो आप चरण 1 पर वापस जाते हैं और फिर से प्रयास करते हैं। यह तथाकथित "आशावादी संगामिति नियंत्रण है।")
ध्यान दें कि सबसे महत्वपूर्ण हिस्सा है जो मैंने उपर्युक्त प्रतिनिधित्वकर्ता को बनाए रखने की आवश्यकता के बारे में कहा था। आमतौर पर एक एल्गोरिथ्म होना पर्याप्त नहीं है जो पेड़ के बीच में परमाणु परिवर्तन करता है। क्यों? उदाहरण के लिए: आपके पास एक रीडर थ्रेड हो सकता है जो ट्री के प्रीऑर्डर ट्रैवर्स करने की प्रक्रिया में है। यदि आप एक नोड को संशोधित करते हैं जो उस नोड के पूर्वज हैं जो वे वर्तमान में पढ़ रहे हैं तो आप उन पूर्व शर्तों को अमान्य करने जा रहे हैं जो उन्होंने सोचा था कि वे लागू किए गए थे। पाठक को डेटा संरचना के साथ ठीक उसी तरह काम करने में सक्षम होना चाहिए, जैसा कि आपने अपना परिवर्तन करने से पहले किया था, या ठीक वैसा ही जैसा कि आपके परिवर्तन के बाद होगा। बीच में कुछ नहीं।
O(log(N))O(N)