स्वैप (कंप्यूटर प्रोग्रामिंग): Difference between revisions

From Vigyanwiki
Line 16: Line 16:
     एक्स:= य
     एक्स:= य
     वाई: = अस्थायी
     वाई: = अस्थायी
जबकि यह वैचारिक रूप से सरल है और कई विषयो में दो चर स्वैप करने का एकमात्र सुविधाजनक विधि है, यह अतिरिक्त मेमोरी का उपयोग करता है। यद्यपि यह अधिकांश अनुप्रयोगों में एक समस्या नहीं होनी चाहिए, अदला-बदली किए जाने वाले मानों का आकार बहुत बड़ा हो सकता है, जिसका अर्थ है कि [[अस्थायी चर]] बहुत अधिक मेमोरी भी ले सकते हैं, या स्वैप ऑपरेशन को कई बार करने की आवश्यकता हो सकती है, जैसा कि वर्गीकरण कलन विधि में।
जबकि यह वैचारिक रूप से सरल है और कई विषयो में दो चर स्वैप करने का एकमात्र सुविधाजनक विधि है, यह अतिरिक्त मेमोरी का उपयोग करता है। यद्यपि यह अधिकांश अनुप्रयोगों में एक समस्या नहीं होनी चाहिए, परस्परित परिवर्तन किए जाने वाले मानों का आकार बहुत बड़ा हो सकता है, जिसका अर्थ है कि [[अस्थायी चर]] बहुत अधिक मेमोरी भी ले सकते हैं, या स्वैप ऑपरेशन को कई बार करने की आवश्यकता हो सकती है, जैसा कि वर्गीकरण कलन विधि में।


इसके अतिरिकी, C++ जैसे  [[ ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग |वस्तु उन्मुख प्रोग्रामिंग भाषाओ]] में दो चर राशि की अदला-बदली करने पर अस्थायी चर राशि के लिए वस्तु के उन्मुख में अस्थायी चर राशि के लिए क्लास निर्माता और विनाशक को एक कॉल और कॉपी कंस्ट्रक्टर को तीन कॉल सम्मिलित हो सकते हैं। कुछ वर्ग निर्माता में मेमोरी आवंटित कर सकते हैं और इसे डिस्ट्रक्टर में हटा सकते हैं, इस प्रकार सिस्टम को महंगी कॉल बना सकते हैं। बहुत अधिक डेटा वाली कक्षाओं के लिए कॉपी कंस्ट्रक्टर, एक [[सरणी डेटा संरचना]] में, डेटा को मैन्युअल रूप से कॉपी करने की आवश्यकता भी हो सकती है।
इसके अतिरिकी, C++ जैसे  [[ ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग |वस्तु उन्मुख प्रोग्रामिंग भाषाओ]] में दो चर राशि की अदला-बदली करने पर अस्थायी चर राशि के लिए वस्तु के उन्मुख में अस्थायी चर राशि के लिए क्लास निर्माता और विनाशक को एक कॉल और कॉपी कंस्ट्रक्टर को तीन कॉल सम्मिलित हो सकते हैं। कुछ वर्ग निर्माता में मेमोरी आवंटित कर सकते हैं और इसे डिस्ट्रक्टर में हटा सकते हैं, इस प्रकार सिस्टम को महंगी कॉल बना सकते हैं। बहुत अधिक डेटा वाली कक्षाओं के लिए कॉपी कंस्ट्रक्टर, एक [[सरणी डेटा संरचना]] में, डेटा को मैन्युअल रूप से कॉपी करने की आवश्यकता भी हो सकती है।
Line 23: Line 23:


:{{main|एक्सओआर स्वैप प्रारूप}}
:{{main|एक्सओआर स्वैप प्रारूप}}
एक्सओआर स्वैप दो न्यूमेरिक चर राशि को स्वैप करने के लिए एक्सओआर ऑपरेशन का उपयोग करता है यह सामान्यतः ऊपर उल्लिखित सरल विधि की तुलना में तेज़ होने का दावा किया यद्यपि इसमें एक्सओआर स्वैप प्रारूप है व्यवहार में परिहार के कारण। एक्सओआर स्वैप का उपयोग सामान्यतः [[पूर्णांक]] जैसे निम्न-स्तरीय डेटा प्रकारों को स्वैप करने के लिए किया जाता है। यद्यपि, सिद्धांत रूप में, यह किन्हीं भी दो मूल्यों की अदला-बदली करने में सक्षम है, जिन्हें निश्चित-लंबाई बिटस्ट्रीम द्वारा दर्शाया जा सकता है।
एक्सओआर स्वैप दो न्यूमेरिक चर राशि को स्वैप करने के लिए एक्सओआर ऑपरेशन का उपयोग करता है यह सामान्यतः ऊपर उल्लिखित सरल विधि की तुलना में तेज़ होने का दावा किया यद्यपि इसमें एक्सओआर स्वैप प्रारूप है व्यवहार में परिहार के कारण। एक्सओआर स्वैप का उपयोग सामान्यतः [[पूर्णांक]] जैसे निम्न-स्तरीय डेटा प्रकारों को स्वैप करने के लिए किया जाता है। यद्यपि, सिद्धांत रूप में, यह किन्हीं भी दो मूल्यों की परस्परित परिवर्तन करने में सक्षम है, जिन्हें निश्चित-लंबाई बिटस्ट्रीम द्वारा दर्शाया जा सकता है।


== जोड़ और घटाव के माध्यम से स्वैप करें ==
== जोड़ और घटाव के माध्यम से स्वैप करें ==
{{main|जोड़ और घटाव द्वारा स्वैप करें}}
{{main|जोड़ और घटाव द्वारा स्वैप करें}}
यह विधि दो चरों को उनके मानों को जोड़कर और घटाकर स्वैप करती है। व्यावहारिक अनुप्रयोगों में इसका शायद ही कभी उपयोग किया जाता है, मुख्यतः क्योंकि:
मुख्यतः यह विधि दो चरों को उनके मानों को जोड़कर और घटाकर स्वैप किया जाता है। क्योंकि व्यावहारिक अनुप्रयोगों में इसका किंचित ही कभी उपयोग किया जाता है,
* यह केवल संख्यात्मक चर स्वैप कर सकता है; [[कंटेनर (डेटा संरचना)]] जैसे जटिल डेटा प्रकारों को जोड़ना या घटाना संभव या तार्किक नहीं हो सकता है।
* यह मात्र संख्यात्मक चर स्वैप कर सकता है; [[कंटेनर (डेटा संरचना)]] जैसे जटिल डेटा प्रकारों को जोड़ना या घटाना संभव या तार्किक नहीं हो सकता है।
* एक निश्चित आकार के चर स्वैप करते समय, [[अंकगणितीय अतिप्रवाह]] एक मुद्दा बन जाता है।
* एक निश्चित आकार के चर स्वैप करते समय, [[अंकगणितीय अतिप्रवाह]] एक विषय बन गया है।
* यह सामान्यतः फ़्लोटिंग-पॉइंट मानों के लिए काम नहीं करता है, क्योंकि [[फ़्लोटिंग-पॉइंट अंकगणित]] सहयोगीता # गैर-सहयोगी है। गैर-सहयोगी।
* यह सामान्यतः फ़्लोटिंग-पॉइंट मानों के लिए काम नहीं करता है, क्योंकि [[फ़्लोटिंग-पॉइंट अंकगणित]] सहयोगीता गैर-सहयोगी है।


== कंटेनरों की अदला-बदली ==
== कंटेनरों का परस्पर परिवर्तन ==


कंटेनर (डेटा संरचना) जो [[डेटा सूचक]] का उपयोग करके डायनेमिक मेमोरी आवंटन से मेमोरी आवंटित करता है, केवल पॉइंटर्स को स्वैप करके एकल ऑपरेशन में स्वैप किया जा सकता है। यह आमतौर पर प्रोग्रामिंग लैंग्वेज सपोर्टिंग पॉइंटर्स में पाया जाता है, जैसे c (प्रोग्रामिंग लैंग्वेज) या C ++। [[मानक टेम्पलेट लाइब्रेरी]] कंटेनरों की सामग्री को कुशलतापूर्वक इस तरह से आदान-प्रदान करने के लिए अपने अंतर्निर्मित स्वैप फ़ंक्शन को अधिभारित करती है।<ref>{{Cite web|url=http://www.sgi.com/tech/stl/swap.html#2|title = HPPSocialUserSignonPage - Hewlett Packard Enterprise Community}}</ref>
कंटेनर जो [[डेटा सूचक]] का उपयोग करके डायनेमिक मेमोरी आवंटन से मेमोरी आवंटित करता है, केवल संकेत को स्वैप करके एकल ऑपरेशन में स्वैप किया जा सकता है। यह सामान्यतः प्रोग्रामिंग भाषा सहायक संकेतो में पाया जाता है,जैसे C या C++। [[मानक टेम्पलेट लाइब्रेरी]] कंटेनरों की सामग्री को कुशलतापूर्वक इस तरह से आदान-प्रदान करने के लिए अपने अंतर्निर्मित स्वैप फ़ंक्शन को अधिभारित करती है।<ref>{{Cite web|url=http://www.sgi.com/tech/stl/swap.html#2|title = HPPSocialUserSignonPage - Hewlett Packard Enterprise Community}}</ref>जैसा कि संकेत चर सामान्यतः  एक निश्चित आकार के होते हैं उदाहरण के लिए, अधिकांश डेस्कटॉप कंप्यूटरों में 64 [[ अंश |अंश]] लंबे संकेत  होते हैं, और वे संख्यात्मक होते हैं, उन्हें एक्सओआर स्वैप का उपयोग करके तुरंत से स्वैप किया जा सकता है।
जैसा कि पॉइंटर चर आमतौर पर एक निश्चित आकार के होते हैं (उदाहरण के लिए, अधिकांश डेस्कटॉप कंप्यूटरों में 64 [[ अंश ]] लंबे पॉइंटर्स होते हैं), और वे संख्यात्मक होते हैं, उन्हें #एक्सओआर   स्वैप का उपयोग करके जल्दी से स्वैप किया जा सकता है।


== समानांतर असाइनमेंट ==
== समानांतर असाइनमेंट ==

Revision as of 11:46, 31 March 2023

कंप्यूटर प्रोग्रामिंग में, दो चर की अदला-बदली का कार्य चर के मूल्यों के परस्पर आदान-प्रदान को संदर्भित करता है। सामान्यतः, यह कंप्यूटर भंडारण में डेटा के साथ किया जाता है। उदाहरण के लिए, एक कंप्यूटर प्रोग्राम में, दो चर राशि को इस प्रकार परिभाषित किया जा सकता है:

data_item x:= 1

data_item y: = 0 swap (x, y)

स्वैप करने के बाद, x में 0 मान होगा और y में 1 होगा; उनके मूल्यों का आदान-प्रदान किया गया है। इस ऑपरेशन को अन्य प्रकार के मानों के लिए सामान्यीकृत किया जा सकता है, जैसे कि स्ट्रिंग और एकत्रित डेटा प्रकार। तुलनात्मक डेटा की स्थिति बदलने के लिए स्वैप का उपयोग करते हैं।

कई प्रोग्रामिंग भाषाओं में स्वैप अंतर्निर्मित होता है। सी ++ में, फंक्शन अधिभार प्रदान की जाती है जिससे ओ (1) समय में कुछ बड़ी संरचनाओं का आदान-प्रदान करने के लिए std:: स्वैप की अनुमति मिलती है।

एक अस्थायी का उपयोग करना

दो चर राशि को स्वैप करने के लिए सबसे सरल और सबसे व्यापक रूप से प्रयोग की जाने वाली विधि तीसरे अस्थायी चर राशि का उपयोग करना है

   अस्थायी: = x
   एक्स:= य
   वाई: = अस्थायी

जबकि यह वैचारिक रूप से सरल है और कई विषयो में दो चर स्वैप करने का एकमात्र सुविधाजनक विधि है, यह अतिरिक्त मेमोरी का उपयोग करता है। यद्यपि यह अधिकांश अनुप्रयोगों में एक समस्या नहीं होनी चाहिए, परस्परित परिवर्तन किए जाने वाले मानों का आकार बहुत बड़ा हो सकता है, जिसका अर्थ है कि अस्थायी चर बहुत अधिक मेमोरी भी ले सकते हैं, या स्वैप ऑपरेशन को कई बार करने की आवश्यकता हो सकती है, जैसा कि वर्गीकरण कलन विधि में।

इसके अतिरिकी, C++ जैसे वस्तु उन्मुख प्रोग्रामिंग भाषाओ में दो चर राशि की अदला-बदली करने पर अस्थायी चर राशि के लिए वस्तु के उन्मुख में अस्थायी चर राशि के लिए क्लास निर्माता और विनाशक को एक कॉल और कॉपी कंस्ट्रक्टर को तीन कॉल सम्मिलित हो सकते हैं। कुछ वर्ग निर्माता में मेमोरी आवंटित कर सकते हैं और इसे डिस्ट्रक्टर में हटा सकते हैं, इस प्रकार सिस्टम को महंगी कॉल बना सकते हैं। बहुत अधिक डेटा वाली कक्षाओं के लिए कॉपी कंस्ट्रक्टर, एक सरणी डेटा संरचना में, डेटा को मैन्युअल रूप से कॉपी करने की आवश्यकता भी हो सकती है।

एक्सओआर स्वैप

एक्सओआर स्वैप दो न्यूमेरिक चर राशि को स्वैप करने के लिए एक्सओआर ऑपरेशन का उपयोग करता है यह सामान्यतः ऊपर उल्लिखित सरल विधि की तुलना में तेज़ होने का दावा किया यद्यपि इसमें एक्सओआर स्वैप प्रारूप है व्यवहार में परिहार के कारण। एक्सओआर स्वैप का उपयोग सामान्यतः पूर्णांक जैसे निम्न-स्तरीय डेटा प्रकारों को स्वैप करने के लिए किया जाता है। यद्यपि, सिद्धांत रूप में, यह किन्हीं भी दो मूल्यों की परस्परित परिवर्तन करने में सक्षम है, जिन्हें निश्चित-लंबाई बिटस्ट्रीम द्वारा दर्शाया जा सकता है।

जोड़ और घटाव के माध्यम से स्वैप करें

मुख्यतः यह विधि दो चरों को उनके मानों को जोड़कर और घटाकर स्वैप किया जाता है। क्योंकि व्यावहारिक अनुप्रयोगों में इसका किंचित ही कभी उपयोग किया जाता है,

  • यह मात्र संख्यात्मक चर स्वैप कर सकता है; कंटेनर (डेटा संरचना) जैसे जटिल डेटा प्रकारों को जोड़ना या घटाना संभव या तार्किक नहीं हो सकता है।
  • एक निश्चित आकार के चर स्वैप करते समय, अंकगणितीय अतिप्रवाह एक विषय बन गया है।
  • यह सामान्यतः फ़्लोटिंग-पॉइंट मानों के लिए काम नहीं करता है, क्योंकि फ़्लोटिंग-पॉइंट अंकगणित सहयोगीता गैर-सहयोगी है।

कंटेनरों का परस्पर परिवर्तन

कंटेनर जो डेटा सूचक का उपयोग करके डायनेमिक मेमोरी आवंटन से मेमोरी आवंटित करता है, केवल संकेत को स्वैप करके एकल ऑपरेशन में स्वैप किया जा सकता है। यह सामान्यतः प्रोग्रामिंग भाषा सहायक संकेतो में पाया जाता है,जैसे C या C++। मानक टेम्पलेट लाइब्रेरी कंटेनरों की सामग्री को कुशलतापूर्वक इस तरह से आदान-प्रदान करने के लिए अपने अंतर्निर्मित स्वैप फ़ंक्शन को अधिभारित करती है।[1]जैसा कि संकेत चर सामान्यतः एक निश्चित आकार के होते हैं उदाहरण के लिए, अधिकांश डेस्कटॉप कंप्यूटरों में 64 अंश लंबे संकेत होते हैं, और वे संख्यात्मक होते हैं, उन्हें एक्सओआर स्वैप का उपयोग करके तुरंत से स्वैप किया जा सकता है।

समानांतर असाइनमेंट

रूबी (प्रोग्रामिंग भाषा) या पायथन (प्रोग्रामिंग लैंग्वेज) जैसी कुछ भाषाएं असाइनमेंट (कंप्यूटर साइंस)#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 रैंडम एक्सेस मेमोरी में किसी भी ऑपरेंड तक पहुंच को पूरी तरह से लॉक कर देगा, यह सुनिश्चित करने के लिए कि ऑपरेशन परमाणु संचालन है, और इसलिए मेमोरी स्वैप करते समय कुशल नहीं हो सकता है। ऐसा लॉकिंग महत्वपूर्ण है जब इसका उपयोग थ्रेड-सुरक्षित सिंक्रनाइज़ेशन को लागू करने के लिए किया जाता है, जैसा कि म्युटेक्स में होता है। यद्यपि, एक एक्ससीएचजी सामान्यतः प्रोसेसर रजिस्टरों में रहने वाले दो मशीन-आकार के शब्दों को स्वैप करने का सबसे तेज़ विधि है। रजिस्टर का नाम बदलने का उपयोग रजिस्टरों को कुशलतापूर्वक स्वैप करने के लिए भी किया जा सकता है।

समानांतर निष्पादन

आधुनिक कंप्यूटरों और मल्टी-कोर में निर्देश पाइपलाइन के आगमन के साथ समानांतर कंप्यूटिंग की सुविधा देने वाले मल्टी-कोर प्रोसेसर, दो या दो से अधिक ऑपरेशन एक साथ किए जा सकते हैं। यह अस्थायी चर का उपयोग करके स्वैप को गति दे सकता है और इसे अन्य प्रारूप पर बढ़त दे सकता है। उदाहरण के लिए, एक्सओआर स्वैप प्रारूप को तीन निर्देशों के अनुक्रमिक निष्पादन की आवश्यकता होती है। यद्यपि, दो अस्थायी रजिस्टरों का उपयोग करते हुए, समानांतर में निष्पादित दो प्रोसेसर दो घड़ी चक्रों में दो चर स्वैप कर सकते हैं।

स्टेप 1
 प्रोसेसर 1: temp_1:= X
 प्रोसेसर 2: temp_2_:= Y

चरण दो
 प्रोसेसर 1: X:= temp_2
 प्रोसेसर 2: Y:= temp_1

अधिक अस्थायी रजिस्टरों का उपयोग किया जाता है, और तीन के अतिरिक्त चार निर्देशों की आवश्यकता होती है। किसी भी विषय में,इसे व्यवहारिक में इसे अलग-अलग प्रोसेसर में लागू नहीं किया जा सकता, क्योंकि यह समानांतर कंप्यूटिंग के लिए बर्नस्टीन की शर्तों का उल्लंघन करता है। इस स्वैप के लिए पारंपरिक संस्करणों पर कोई महत्वपूर्ण लाभ होने के लिए प्रोसेसर को एक दूसरे के साथ पर्याप्त रूप से सिंक में रखना संभव नहीं होगा। यद्यपि, इसका उपयोग एकाधिक भार इकाइयों वाले एकल प्रोसेसर के लिए स्वैपिंग को अनुकूलित करने के लिए किया जा सकता है।

संदर्भ

  1. "HPPSocialUserSignonPage - Hewlett Packard Enterprise Community".