स्वैप (कंप्यूटर प्रोग्रामिंग): Difference between revisions
Line 1: | Line 1: | ||
[[कंप्यूटर प्रोग्राम|कंप्यूटर]] प्रोग्रामिंग में, दो [[चर (प्रोग्रामिंग)|चर]] की | [[कंप्यूटर प्रोग्राम|कंप्यूटर]] प्रोग्रामिंग में, दो [[चर (प्रोग्रामिंग)|चर]] की परस्पर परिवर्तनसका कार्य चर के मूल्यों के परस्पर आदान-प्रदान को संदर्भित करता है। सामान्यतः, यह [[ कंप्यूटर भंडारण |कंप्यूटर भंडारण]] में डेटा के साथ किया जाता है। उदाहरण के लिए, एक कंप्यूटर प्रोग्राम में, दो चर राशि को इस प्रकार परिभाषित किया जा सकता है: | ||
data_item x:= 1 | data_item x:= 1 | ||
Line 7: | Line 7: | ||
स्वैप करने के बाद, ''x'' में 0 मान होगा और ''y'' में 1 होगा; उनके मूल्यों का आदान-प्रदान किया गया है। इस ऑपरेशन को अन्य प्रकार के मानों के लिए सामान्यीकृत किया जा सकता है, जैसे कि [[स्ट्रिंग (कंप्यूटर विज्ञान)|स्ट्रिंग]] और एकत्रित [[डेटा प्रकार]]। तुलनात्मक डेटा की स्थिति बदलने के लिए स्वैप का उपयोग करते हैं। | स्वैप करने के बाद, ''x'' में 0 मान होगा और ''y'' में 1 होगा; उनके मूल्यों का आदान-प्रदान किया गया है। इस ऑपरेशन को अन्य प्रकार के मानों के लिए सामान्यीकृत किया जा सकता है, जैसे कि [[स्ट्रिंग (कंप्यूटर विज्ञान)|स्ट्रिंग]] और एकत्रित [[डेटा प्रकार]]। तुलनात्मक डेटा की स्थिति बदलने के लिए स्वैप का उपयोग करते हैं। | ||
कई [[प्रोग्रामिंग भाषा]]ओं में स्वैप अंतर्निर्मित होता है। [[सी ++]] में, [[समारोह अधिभार|फंक्शन अधिभार]] प्रदान की जाती है जिससे | कई [[प्रोग्रामिंग भाषा]]ओं में स्वैप अंतर्निर्मित होता है। [[सी ++]] में, [[समारोह अधिभार|फंक्शन अधिभार]] प्रदान की जाती है जिससे o (1) समय में कुछ बड़ी संरचनाओं का आदान-प्रदान करने के लिए स्वैप की अनुमति मिलती है। | ||
=== एक अस्थायी का उपयोग करना === | === एक अस्थायी का उपयोग करना === | ||
Line 18: | Line 18: | ||
जबकि यह वैचारिक रूप से सरल है और कई विषयो में दो चर स्वैप करने का एकमात्र सुविधाजनक विधि है, यह अतिरिक्त मेमोरी का उपयोग करता है। यद्यपि यह अधिकांश अनुप्रयोगों में एक समस्या नहीं होनी चाहिए, परस्परित परिवर्तन किए जाने वाले मानों का आकार बहुत बड़ा हो सकता है, जिसका अर्थ है कि [[अस्थायी चर]] बहुत अधिक मेमोरी भी ले सकते हैं, या स्वैप ऑपरेशन को कई बार करने की आवश्यकता हो सकती है, जैसा कि वर्गीकरण कलन विधि में। | जबकि यह वैचारिक रूप से सरल है और कई विषयो में दो चर स्वैप करने का एकमात्र सुविधाजनक विधि है, यह अतिरिक्त मेमोरी का उपयोग करता है। यद्यपि यह अधिकांश अनुप्रयोगों में एक समस्या नहीं होनी चाहिए, परस्परित परिवर्तन किए जाने वाले मानों का आकार बहुत बड़ा हो सकता है, जिसका अर्थ है कि [[अस्थायी चर]] बहुत अधिक मेमोरी भी ले सकते हैं, या स्वैप ऑपरेशन को कई बार करने की आवश्यकता हो सकती है, जैसा कि वर्गीकरण कलन विधि में। | ||
इसके | इसके अतिरिक्त, C++ जैसी ऑब्जेक्ट-ओरिएंटेड भाषाओं में दो चरों को प्रतिस्थापित करने पर अस्थायी चरों के लिए क्लास कंस्ट्रक्टर और डिस्ट्रक्टर को एक कॉल और कॉपी कंस्ट्रक्टर के लिए तीन कॉल सम्मिलित हो सकते हैं। कुछ वर्ग कंस्ट्रक्टर में मेमोरी आवंटित नहीं किया जा सकता हैं और इसे डिस्ट्रक्टर से हटाया जा सकता हैं, इस प्रकार प्रणाली में महंगा कॉल निर्मित किया जाता हैं। | ||
== एक्सओआर स्वैप == | == एक्सओआर स्वैप == | ||
Line 34: | Line 34: | ||
== कंटेनरों का परस्पर परिवर्तन == | == कंटेनरों का परस्पर परिवर्तन == | ||
कंटेनर जो [[डेटा सूचक]] का उपयोग करके डायनेमिक मेमोरी आवंटन से मेमोरी आवंटित करता है, केवल संकेत को स्वैप करके एकल ऑपरेशन में स्वैप किया जा सकता है। यह सामान्यतः प्रोग्रामिंग भाषा सहायक संकेतो में पाया जाता है,जैसे C या C++। [[मानक टेम्पलेट लाइब्रेरी]] कंटेनरों की सामग्री को कुशलतापूर्वक इस तरह से आदान-प्रदान करने के लिए अपने अंतर्निर्मित स्वैप फ़ंक्शन को अधिभारित करती है।<ref>{{Cite web|url=http://www.sgi.com/tech/stl/swap.html#2|title = HPPSocialUserSignonPage - Hewlett Packard Enterprise Community}}</ref>जैसा कि संकेत चर सामान्यतः एक निश्चित आकार के होते हैं उदाहरण के लिए, अधिकांश डेस्कटॉप कंप्यूटरों में 64 [[ अंश |अंश]] लंबे संकेत | कंटेनर जो [[डेटा सूचक]] का उपयोग करके डायनेमिक मेमोरी आवंटन से मेमोरी आवंटित करता है, केवल संकेत को स्वैप करके एकल ऑपरेशन में स्वैप किया जा सकता है। यह सामान्यतः प्रोग्रामिंग भाषा सहायक संकेतो में पाया जाता है,जैसे C या C++। [[मानक टेम्पलेट लाइब्रेरी]] कंटेनरों की सामग्री को कुशलतापूर्वक इस तरह से आदान-प्रदान करने के लिए अपने अंतर्निर्मित स्वैप फ़ंक्शन को अधिभारित करती है।<ref>{{Cite web|url=http://www.sgi.com/tech/stl/swap.html#2|title = HPPSocialUserSignonPage - Hewlett Packard Enterprise Community}}</ref>जैसा कि संकेत चर सामान्यतः एक निश्चित आकार के होते हैं उदाहरण के लिए, अधिकांश डेस्कटॉप कंप्यूटरों में 64 [[ अंश |अंश]] लंबे संकेत होते हैं, और वे संख्यात्मक होते हैं, उन्हें एक्सओआर स्वैप का उपयोग करके तुरंत से स्वैप किया जा सकता है। | ||
== समानांतर असाइनमेंट == | == समानांतर असाइनमेंट == | ||
रूबी या पायथन जैसी कुछ भाषाएँ समानांतर असाइनमेंट का समर्थन करती हैं, जो दो चरों की परस्पर परिवर्तन के लिए संकेतन को सरल बनाती हैं: | |||
a, b = b, a | |||
यह एक मध्यवर्ती डेटा संरचना से जुड़े ऑपरेशन के लिए आशुलिपि है: पायथन में, एक टपल | यह एक मध्यवर्ती डेटा संरचना से जुड़े ऑपरेशन के लिए आशुलिपि है: पायथन में, एक टपल रुबी में, एक सरणी जावास्क्रिप्ट 6+ विनाशकारी ऑपरेटरों का समर्थन करता है जो एक ही काम करते हैं: | ||
[a, b] = [b, a] | |||
[ | |||
== फंक्शन स्वैप == | == फंक्शन स्वैप == | ||
Line 72: | Line 66: | ||
}} | }} | ||
==आधुनिक कम्प्यूटरों में | ==आधुनिक कम्प्यूटरों में परस्पर परिवर्तन की सुविधा== | ||
===समर्पित निर्देश=== | ===समर्पित निर्देश=== | ||
कंप्यूटर में डेटा की | कंप्यूटर में डेटा की परस्पर परिवर्तन के कई अनुप्रयोगों के कारण,अधिकांश केंद्रीय प्रसंस्करण इकाइयां अब अंतर्निहित निर्देशों के माध्यम से चर को सीधे स्वैप करने की क्षमता प्रदान करती हैं। [[x86 आर्किटेक्चर|x86]] प्रोसेसर, उदाहरण के लिए, एक तीसरे अस्थायी रजिस्टर का उपयोग करने की आवश्यकता के अतिरिक्त दो [[प्रोसेसर रजिस्टर|प्रोसेसर रजिस्टरो]] को सीधे स्वैप करने के लिए एक एक्ससीएचजी निर्देश सम्मिलित करें। कुछ प्रोसेसर संरचना में एक तुलना-और-स्वैप निर्देश भी प्रदान किया जाता है, जो दो रजिस्टरों की तुलना करता है और सशर्त रूप से स्वैप करता है। इसका उपयोग पारस्परिक बहिष्करण तकनीकों का समर्थन करने के लिए किया जाता है। | ||
एक्ससीएचजी उतना कुशल नहीं हो सकता जितना लगता है। उदाहरण के लिए, x86 आर्किटेक्चर प्रोसेसर में, एक्ससीएचजी [[रैंडम एक्सेस मेमोरी]] में किसी भी ऑपरेंड तक पहुंच को पूरी तरह से लॉक कर देगा, यह सुनिश्चित करने के लिए कि ऑपरेशन [[ परमाणु संचालन |परमाणु संचालन]] है, और इसलिए मेमोरी स्वैप करते समय कुशल नहीं हो सकता है। ऐसा लॉकिंग महत्वपूर्ण है जब इसका उपयोग थ्रेड-सुरक्षित सिंक्रनाइज़ेशन को लागू करने के लिए किया जाता है, जैसा कि [[ म्युटेक्स |म्युटेक्स]] में होता है। यद्यपि, एक एक्ससीएचजी सामान्यतः प्रोसेसर रजिस्टरों में रहने वाले दो मशीन-आकार के शब्दों को स्वैप करने का सबसे तेज़ विधि है। रजिस्टर का नाम बदलने का उपयोग रजिस्टरों को कुशलतापूर्वक स्वैप करने के लिए भी किया जा सकता है। | |||
=== समानांतर निष्पादन === | === समानांतर निष्पादन === |
Revision as of 12:16, 31 March 2023
कंप्यूटर प्रोग्रामिंग में, दो चर की परस्पर परिवर्तनसका कार्य चर के मूल्यों के परस्पर आदान-प्रदान को संदर्भित करता है। सामान्यतः, यह कंप्यूटर भंडारण में डेटा के साथ किया जाता है। उदाहरण के लिए, एक कंप्यूटर प्रोग्राम में, दो चर राशि को इस प्रकार परिभाषित किया जा सकता है:
data_item x:= 1
data_item y: = 0 swap (x, y)
स्वैप करने के बाद, x में 0 मान होगा और y में 1 होगा; उनके मूल्यों का आदान-प्रदान किया गया है। इस ऑपरेशन को अन्य प्रकार के मानों के लिए सामान्यीकृत किया जा सकता है, जैसे कि स्ट्रिंग और एकत्रित डेटा प्रकार। तुलनात्मक डेटा की स्थिति बदलने के लिए स्वैप का उपयोग करते हैं।
कई प्रोग्रामिंग भाषाओं में स्वैप अंतर्निर्मित होता है। सी ++ में, फंक्शन अधिभार प्रदान की जाती है जिससे o (1) समय में कुछ बड़ी संरचनाओं का आदान-प्रदान करने के लिए स्वैप की अनुमति मिलती है।
एक अस्थायी का उपयोग करना
दो चर राशि को स्वैप करने के लिए सबसे सरल और सबसे व्यापक रूप से प्रयोग की जाने वाली विधि तीसरे अस्थायी चर राशि का उपयोग करना है
अस्थायी: = x एक्स:= य वाई: = अस्थायी
जबकि यह वैचारिक रूप से सरल है और कई विषयो में दो चर स्वैप करने का एकमात्र सुविधाजनक विधि है, यह अतिरिक्त मेमोरी का उपयोग करता है। यद्यपि यह अधिकांश अनुप्रयोगों में एक समस्या नहीं होनी चाहिए, परस्परित परिवर्तन किए जाने वाले मानों का आकार बहुत बड़ा हो सकता है, जिसका अर्थ है कि अस्थायी चर बहुत अधिक मेमोरी भी ले सकते हैं, या स्वैप ऑपरेशन को कई बार करने की आवश्यकता हो सकती है, जैसा कि वर्गीकरण कलन विधि में।
इसके अतिरिक्त, C++ जैसी ऑब्जेक्ट-ओरिएंटेड भाषाओं में दो चरों को प्रतिस्थापित करने पर अस्थायी चरों के लिए क्लास कंस्ट्रक्टर और डिस्ट्रक्टर को एक कॉल और कॉपी कंस्ट्रक्टर के लिए तीन कॉल सम्मिलित हो सकते हैं। कुछ वर्ग कंस्ट्रक्टर में मेमोरी आवंटित नहीं किया जा सकता हैं और इसे डिस्ट्रक्टर से हटाया जा सकता हैं, इस प्रकार प्रणाली में महंगा कॉल निर्मित किया जाता हैं।
एक्सओआर स्वैप
एक्सओआर स्वैप दो न्यूमेरिक चर राशि को स्वैप करने के लिए एक्सओआर ऑपरेशन का उपयोग करता है यह सामान्यतः ऊपर उल्लिखित सरल विधि की तुलना में तेज़ होने का दावा किया यद्यपि इसमें एक्सओआर स्वैप प्रारूप है व्यवहार में परिहार के कारण। एक्सओआर स्वैप का उपयोग सामान्यतः पूर्णांक जैसे निम्न-स्तरीय डेटा प्रकारों को स्वैप करने के लिए किया जाता है। यद्यपि, सिद्धांत रूप में, यह किन्हीं भी दो मूल्यों की परस्परित परिवर्तन करने में सक्षम है, जिन्हें निश्चित-लंबाई बिटस्ट्रीम द्वारा दर्शाया जा सकता है।
जोड़ और घटाव के माध्यम से स्वैप करें
मुख्यतः यह विधि दो चरों को उनके मानों को जोड़कर और घटाकर स्वैप किया जाता है। क्योंकि व्यावहारिक अनुप्रयोगों में इसका किंचित ही कभी उपयोग किया जाता है,
- यह मात्र संख्यात्मक चर स्वैप कर सकता है; कंटेनर (डेटा संरचना) जैसे जटिल डेटा प्रकारों को जोड़ना या घटाना संभव या तार्किक नहीं हो सकता है।
- एक निश्चित आकार के चर स्वैप करते समय, अंकगणितीय अतिप्रवाह एक विषय बन गया है।
- यह सामान्यतः फ़्लोटिंग-पॉइंट मानों के लिए काम नहीं करता है, क्योंकि फ़्लोटिंग-पॉइंट अंकगणित सहयोगीता गैर-सहयोगी है।
कंटेनरों का परस्पर परिवर्तन
कंटेनर जो डेटा सूचक का उपयोग करके डायनेमिक मेमोरी आवंटन से मेमोरी आवंटित करता है, केवल संकेत को स्वैप करके एकल ऑपरेशन में स्वैप किया जा सकता है। यह सामान्यतः प्रोग्रामिंग भाषा सहायक संकेतो में पाया जाता है,जैसे C या C++। मानक टेम्पलेट लाइब्रेरी कंटेनरों की सामग्री को कुशलतापूर्वक इस तरह से आदान-प्रदान करने के लिए अपने अंतर्निर्मित स्वैप फ़ंक्शन को अधिभारित करती है।[1]जैसा कि संकेत चर सामान्यतः एक निश्चित आकार के होते हैं उदाहरण के लिए, अधिकांश डेस्कटॉप कंप्यूटरों में 64 अंश लंबे संकेत होते हैं, और वे संख्यात्मक होते हैं, उन्हें एक्सओआर स्वैप का उपयोग करके तुरंत से स्वैप किया जा सकता है।
समानांतर असाइनमेंट
रूबी या पायथन जैसी कुछ भाषाएँ समानांतर असाइनमेंट का समर्थन करती हैं, जो दो चरों की परस्पर परिवर्तन के लिए संकेतन को सरल बनाती हैं:
a, b = b, a
यह एक मध्यवर्ती डेटा संरचना से जुड़े ऑपरेशन के लिए आशुलिपि है: पायथन में, एक टपल रुबी में, एक सरणी जावास्क्रिप्ट 6+ विनाशकारी ऑपरेटरों का समर्थन करता है जो एक ही काम करते हैं:
[a, b] = [b, a]
फंक्शन स्वैप
यहां, दो विश्व स्तर पर स्कोप्ड चर एक फ़ंक्शन के माध्यम से मूल्य द्वारा पारित किए जाते हैं, अस्थायी भंडारण चर की आवश्यकता को समाप्त करते हैं।
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 प्रोसेसर, उदाहरण के लिए, एक तीसरे अस्थायी रजिस्टर का उपयोग करने की आवश्यकता के अतिरिक्त दो प्रोसेसर रजिस्टरो को सीधे स्वैप करने के लिए एक एक्ससीएचजी निर्देश सम्मिलित करें। कुछ प्रोसेसर संरचना में एक तुलना-और-स्वैप निर्देश भी प्रदान किया जाता है, जो दो रजिस्टरों की तुलना करता है और सशर्त रूप से स्वैप करता है। इसका उपयोग पारस्परिक बहिष्करण तकनीकों का समर्थन करने के लिए किया जाता है।
एक्ससीएचजी उतना कुशल नहीं हो सकता जितना लगता है। उदाहरण के लिए, x86 आर्किटेक्चर प्रोसेसर में, एक्ससीएचजी रैंडम एक्सेस मेमोरी में किसी भी ऑपरेंड तक पहुंच को पूरी तरह से लॉक कर देगा, यह सुनिश्चित करने के लिए कि ऑपरेशन परमाणु संचालन है, और इसलिए मेमोरी स्वैप करते समय कुशल नहीं हो सकता है। ऐसा लॉकिंग महत्वपूर्ण है जब इसका उपयोग थ्रेड-सुरक्षित सिंक्रनाइज़ेशन को लागू करने के लिए किया जाता है, जैसा कि म्युटेक्स में होता है। यद्यपि, एक एक्ससीएचजी सामान्यतः प्रोसेसर रजिस्टरों में रहने वाले दो मशीन-आकार के शब्दों को स्वैप करने का सबसे तेज़ विधि है। रजिस्टर का नाम बदलने का उपयोग रजिस्टरों को कुशलतापूर्वक स्वैप करने के लिए भी किया जा सकता है।
समानांतर निष्पादन
आधुनिक कंप्यूटरों और मल्टी-कोर में निर्देश पाइपलाइन के आगमन के साथ समानांतर कंप्यूटिंग की सुविधा देने वाले मल्टी-कोर प्रोसेसर, दो या दो से अधिक ऑपरेशन एक साथ किए जा सकते हैं। यह अस्थायी चर का उपयोग करके स्वैप को गति दे सकता है और इसे अन्य प्रारूप पर बढ़त दे सकता है। उदाहरण के लिए, एक्सओआर स्वैप प्रारूप को तीन निर्देशों के अनुक्रमिक निष्पादन की आवश्यकता होती है। यद्यपि, दो अस्थायी रजिस्टरों का उपयोग करते हुए, समानांतर में निष्पादित दो प्रोसेसर दो घड़ी चक्रों में दो चर स्वैप कर सकते हैं।
स्टेप 1 प्रोसेसर 1: temp_1:= X प्रोसेसर 2: temp_2_:= Y चरण दो प्रोसेसर 1: X:= temp_2 प्रोसेसर 2: Y:= temp_1
अधिक अस्थायी रजिस्टरों का उपयोग किया जाता है, और तीन के अतिरिक्त चार निर्देशों की आवश्यकता होती है। किसी भी विषय में,इसे व्यवहारिक में इसे अलग-अलग प्रोसेसर में लागू नहीं किया जा सकता, क्योंकि यह समानांतर कंप्यूटिंग के लिए बर्नस्टीन की शर्तों का उल्लंघन करता है। इस स्वैप के लिए पारंपरिक संस्करणों पर कोई महत्वपूर्ण लाभ होने के लिए प्रोसेसर को एक दूसरे के साथ पर्याप्त रूप से सिंक में रखना संभव नहीं होगा। यद्यपि, इसका उपयोग एकाधिक भार इकाइयों वाले एकल प्रोसेसर के लिए स्वैपिंग को अनुकूलित करने के लिए किया जा सकता है।