स्वैप (कंप्यूटर प्रोग्रामिंग): Difference between revisions
No edit summary |
|||
Line 18: | Line 18: | ||
जबकि यह वैचारिक रूप से सरल है और कई विषयो में दो चर स्वैप करने का एकमात्र सुविधाजनक विधि है, यह अतिरिक्त मेमोरी का उपयोग करता है। यद्यपि यह अधिकांश अनुप्रयोगों में एक समस्या नहीं होनी चाहिए, अदला-बदली किए जाने वाले मानों का आकार बहुत बड़ा हो सकता है, जिसका अर्थ है कि [[अस्थायी चर]] बहुत अधिक मेमोरी भी ले सकते हैं, या स्वैप ऑपरेशन को कई बार करने की आवश्यकता हो सकती है, जैसा कि वर्गीकरण कलन विधि में। | जबकि यह वैचारिक रूप से सरल है और कई विषयो में दो चर स्वैप करने का एकमात्र सुविधाजनक विधि है, यह अतिरिक्त मेमोरी का उपयोग करता है। यद्यपि यह अधिकांश अनुप्रयोगों में एक समस्या नहीं होनी चाहिए, अदला-बदली किए जाने वाले मानों का आकार बहुत बड़ा हो सकता है, जिसका अर्थ है कि [[अस्थायी चर]] बहुत अधिक मेमोरी भी ले सकते हैं, या स्वैप ऑपरेशन को कई बार करने की आवश्यकता हो सकती है, जैसा कि वर्गीकरण कलन विधि में। | ||
इसके अतिरिकी, [[ ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग |वस्तु उन्मुख प्रोग्रामिंग]] में दो चर राशि की अदला-बदली वस्तु के उन्मुख | इसके अतिरिकी, [[ ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग |वस्तु उन्मुख प्रोग्रामिंग]] में दो चर राशि की अदला-बदली वस्तु के उन्मुख भाषाओ जैसे C++ में अस्थायी चर राशि के लिए [[ कक्षा (कंप्यूटर विज्ञान) | कक्षा (कंप्यूटर विज्ञान)]] [[कंस्ट्रक्टर (कंप्यूटर साइंस)]] और [[ विध्वंसक (कंप्यूटर विज्ञान) | विध्वंसक (कंप्यूटर विज्ञान)]] के लिए एक कॉल और तीन कॉल शामिल हो सकते हैं। वस्तु जीवनकाल निर्माण विधियाँ। कुछ वर्ग कंस्ट्रक्टर में मेमोरी आवंटित कर सकते हैं और इसे डिस्ट्रक्टर में हटा सकते हैं, इस प्रकार सिस्टम को महंगी कॉल बना सकते हैं। बहुत अधिक डेटा वाली कक्षाओं के लिए कॉपी कंस्ट्रक्टर, उदा। एक [[सरणी डेटा संरचना]] में, डेटा को मैन्युअल रूप से कॉपी करने की आवश्यकता भी हो सकती है। | ||
== एक्सओआर स्वैप == | == एक्सओआर स्वैप == |
Revision as of 10:10, 31 March 2023
कंप्यूटर प्रोग्रामिंग में, दो चर की अदला-बदली का कार्य चर के मूल्यों के परस्पर आदान-प्रदान को संदर्भित करता है। सामान्यतः, यह कंप्यूटर भंडारण में डेटा के साथ किया जाता है। उदाहरण के लिए, एक कंप्यूटर प्रोग्राम में, दो चर राशि को इस प्रकार परिभाषित किया जा सकता है:
data_item x:= 1
data_item y: = 0 swap (x, y)
स्वैप करने के बाद, x में 0 मान होगा और y में 1 होगा; उनके मूल्यों का आदान-प्रदान किया गया है। इस ऑपरेशन को अन्य प्रकार के मानों के लिए सामान्यीकृत किया जा सकता है, जैसे कि स्ट्रिंग और एकत्रित डेटा प्रकार। तुलनात्मक डेटा की स्थिति बदलने के लिए स्वैप का उपयोग करते हैं।
कई प्रोग्रामिंग भाषाओं में स्वैप अंतर्निर्मित होता है। सी ++ में, फंक्शन अधिभार प्रदान की जाती है जिससे ओ (1) समय में कुछ बड़ी संरचनाओं का आदान-प्रदान करने के लिए std:: स्वैप की अनुमति मिलती है।
एक अस्थायी का उपयोग करना
दो चर राशि को स्वैप करने के लिए सबसे सरल और सबसे व्यापक रूप से प्रयोग की जाने वाली विधि तीसरे अस्थायी चर राशि का उपयोग करना है
अस्थायी: = x एक्स:= य वाई: = अस्थायी
जबकि यह वैचारिक रूप से सरल है और कई विषयो में दो चर स्वैप करने का एकमात्र सुविधाजनक विधि है, यह अतिरिक्त मेमोरी का उपयोग करता है। यद्यपि यह अधिकांश अनुप्रयोगों में एक समस्या नहीं होनी चाहिए, अदला-बदली किए जाने वाले मानों का आकार बहुत बड़ा हो सकता है, जिसका अर्थ है कि अस्थायी चर बहुत अधिक मेमोरी भी ले सकते हैं, या स्वैप ऑपरेशन को कई बार करने की आवश्यकता हो सकती है, जैसा कि वर्गीकरण कलन विधि में।
इसके अतिरिकी, वस्तु उन्मुख प्रोग्रामिंग में दो चर राशि की अदला-बदली वस्तु के उन्मुख भाषाओ जैसे C++ में अस्थायी चर राशि के लिए कक्षा (कंप्यूटर विज्ञान) कंस्ट्रक्टर (कंप्यूटर साइंस) और विध्वंसक (कंप्यूटर विज्ञान) के लिए एक कॉल और तीन कॉल शामिल हो सकते हैं। वस्तु जीवनकाल निर्माण विधियाँ। कुछ वर्ग कंस्ट्रक्टर में मेमोरी आवंटित कर सकते हैं और इसे डिस्ट्रक्टर में हटा सकते हैं, इस प्रकार सिस्टम को महंगी कॉल बना सकते हैं। बहुत अधिक डेटा वाली कक्षाओं के लिए कॉपी कंस्ट्रक्टर, उदा। एक सरणी डेटा संरचना में, डेटा को मैन्युअल रूप से कॉपी करने की आवश्यकता भी हो सकती है।
एक्सओआर स्वैप
XOR स्वैप दो न्यूमेरिक चर राशि ्स को स्वैप करने के लिए बिटवाइज़ ऑपरेशन#XOR ऑपरेशन का उपयोग करता है। यह आम तौर पर ऊपर उल्लिखित भोली विधि की तुलना में तेज़ होने के लिए कहा जाता है; हालाँकि इसमें XOR स्वैप एल्गोरिथम है # व्यवहार में परिहार के कारण। XOR स्वैप का उपयोग आमतौर पर पूर्णांक जैसे निम्न-स्तरीय डेटा प्रकारों को स्वैप करने के लिए किया जाता है। हालांकि, सिद्धांत रूप में, यह किन्हीं भी दो मूल्यों की अदला-बदली करने में सक्षम है, जिन्हें निश्चित-लंबाई bitstring ्स द्वारा दर्शाया जा सकता है।
जोड़ और घटाव के माध्यम से स्वैप करें
यह विधि दो चरों को उनके मानों को जोड़कर और घटाकर स्वैप करती है। व्यावहारिक अनुप्रयोगों में इसका शायद ही कभी उपयोग किया जाता है, मुख्यतः क्योंकि:
- यह केवल संख्यात्मक चर स्वैप कर सकता है; कंटेनर (डेटा संरचना) जैसे जटिल डेटा प्रकारों को जोड़ना या घटाना संभव या तार्किक नहीं हो सकता है।
- एक निश्चित आकार के चर स्वैप करते समय, अंकगणितीय अतिप्रवाह एक मुद्दा बन जाता है।
- यह आम तौर पर फ़्लोटिंग-पॉइंट मानों के लिए काम नहीं करता है, क्योंकि फ़्लोटिंग-पॉइंट अंकगणित सहयोगीता # गैर-सहयोगी है। गैर-सहयोगी।
कंटेनरों की अदला-बदली
कंटेनर (डेटा संरचना) जो डेटा सूचक का उपयोग करके डायनेमिक मेमोरी आवंटन से मेमोरी आवंटित करता है, केवल पॉइंटर्स को स्वैप करके एकल ऑपरेशन में स्वैप किया जा सकता है। यह आमतौर पर प्रोग्रामिंग लैंग्वेज सपोर्टिंग पॉइंटर्स में पाया जाता है, जैसे c (प्रोग्रामिंग लैंग्वेज) या C ++। मानक टेम्पलेट लाइब्रेरी कंटेनरों की सामग्री को कुशलतापूर्वक इस तरह से आदान-प्रदान करने के लिए अपने अंतर्निर्मित स्वैप फ़ंक्शन को अधिभारित करती है।[1] जैसा कि पॉइंटर चर आमतौर पर एक निश्चित आकार के होते हैं (उदाहरण के लिए, अधिकांश डेस्कटॉप कंप्यूटरों में 64 अंश लंबे पॉइंटर्स होते हैं), और वे संख्यात्मक होते हैं, उन्हें #XOR स्वैप का उपयोग करके जल्दी से स्वैप किया जा सकता है।
समानांतर असाइनमेंट
रूबी (प्रोग्रामिंग भाषा) या पायथन (प्रोग्रामिंग लैंग्वेज) जैसी कुछ भाषाएं असाइनमेंट (कंप्यूटर साइंस)#Parallel असाइनमेंट को सपोर्ट करती हैं, जो दो चर राशि ्स की अदला-बदली के लिए नोटेशन को सरल बनाता है:
<पूर्व> ए, बी = बी, ए </पूर्व>
यह एक मध्यवर्ती डेटा संरचना से जुड़े ऑपरेशन के लिए आशुलिपि है: पायथन में, एक टपल; रुबी में, एक सरणी।
जावास्क्रिप्ट 6+ विनाशकारी ऑपरेटरों का समर्थन करता है जो एक ही काम करते हैं:
<पूर्व> [ए, बी] = [बी, ए]; </पूर्व>
फंक्शन स्वैप
यहां, दो विश्व स्तर पर स्कोप्ड चर एक फ़ंक्शन के माध्यम से मूल्य द्वारा पारित किए जाते हैं, अस्थायी भंडारण चर की आवश्यकता को समाप्त करते हैं।
x = 1;
y = 2;
console.log(x + " " + y); // outputs 1 2
function swap(a, b) {
x = b;
y = a;
}
swap(x, y);
console.log(x + " " + y); // outputs 2 1
आधुनिक कम्प्यूटरों में अदला-बदली की सुविधा
समर्पित निर्देश
कंप्यूटर में डेटा की अदला-बदली के कई अनुप्रयोगों के कारण, अधिकांश केंद्रीय प्रसंस्करण इकाइयां अब अंतर्निहित निर्देशों के माध्यम से चर को सीधे स्वैप करने की क्षमता प्रदान करती हैं। x86 आर्किटेक्चर प्रोसेसर, उदाहरण के लिए, एक तीसरे अस्थायी रजिस्टर का उपयोग करने की आवश्यकता के बिना दो प्रोसेसर रजिस्टरों को सीधे स्वैप करने के लिए एक XCHG निर्देश शामिल करें। कुछ प्रोसेसर आर्किटेक्चर में एक तुलना-और-स्वैप निर्देश भी प्रदान किया जाता है, जो दो रजिस्टरों की तुलना करता है और सशर्त रूप से स्वैप करता है। इसका उपयोग पारस्परिक बहिष्करण तकनीकों का समर्थन करने के लिए किया जाता है।
XCHG उतना कुशल नहीं हो सकता जितना लगता है। उदाहरण के लिए, x86 आर्किटेक्चर प्रोसेसर में, XCHG रैंडम एक्सेस मेमोरी में किसी भी ऑपरेंड तक पहुंच को पूरी तरह से लॉक कर देगा, यह सुनिश्चित करने के लिए कि ऑपरेशन परमाणु संचालन है, और इसलिए मेमोरी स्वैप करते समय कुशल नहीं हो सकता है। ऐसा लॉकिंग महत्वपूर्ण है जब इसका उपयोग थ्रेड-सुरक्षित सिंक्रनाइज़ेशन को लागू करने के लिए किया जाता है, जैसा कि म्युटेक्स में होता है। हालाँकि, एक XCHG आमतौर पर प्रोसेसर रजिस्टरों में रहने वाले दो मशीन-आकार के शब्दों को स्वैप करने का सबसे तेज़ तरीका है। रजिस्टर का नाम बदलने का उपयोग रजिस्टरों को कुशलतापूर्वक स्वैप करने के लिए भी किया जा सकता है।
समानांतर निष्पादन
आधुनिक कंप्यूटरों और मल्टी-कोर (कम्प्यूटिंग) में निर्देश पाइपलाइन के आगमन के साथ समानांतर कंप्यूटिंग की सुविधा देने वाले मल्टी-कोर प्रोसेसर, दो या दो से अधिक ऑपरेशन एक साथ किए जा सकते हैं। यह अस्थायी चर का उपयोग करके स्वैप को गति दे सकता है और इसे अन्य एल्गोरिदम पर बढ़त दे सकता है। उदाहरण के लिए, एक्सओआर स्वैप एल्गोरिदम को तीन निर्देशों के अनुक्रमिक निष्पादन की आवश्यकता होती है। हालाँकि, दो अस्थायी रजिस्टरों का उपयोग करते हुए, समानांतर में निष्पादित दो प्रोसेसर दो घड़ी चक्रों में दो चर स्वैप कर सकते हैं:
स्टेप 1 प्रोसेसर 1: temp_1:= X प्रोसेसर 2: temp_2 := Y चरण दो प्रोसेसर 1: X := temp_2 प्रोसेसर 2: Y:= temp_1
अधिक अस्थायी रजिस्टरों का उपयोग किया जाता है, और तीन के बजाय चार निर्देशों की आवश्यकता होती है। किसी भी मामले में, व्यवहार में इसे अलग-अलग प्रोसेसर में लागू नहीं किया जा सकता, क्योंकि यह समानांतर कंप्यूटिंग के लिए बर्नस्टीन की शर्तों का उल्लंघन करता है। इस स्वैप के लिए पारंपरिक संस्करणों पर कोई महत्वपूर्ण लाभ होने के लिए प्रोसेसर को एक दूसरे के साथ पर्याप्त रूप से सिंक में रखना संभव नहीं होगा। हालांकि, इसका उपयोग एकाधिक लोड/स्टोर इकाइयों वाले एकल प्रोसेसर के लिए स्वैपिंग को अनुकूलित करने के लिए किया जा सकता है।