2010-03-13 15 views
5

मैंने अपने एक दोस्त से सुना है कि स्वैपिंग के लिए सबसे अच्छा एल्गोरिदम है "(ए^= बी^= ए^= बी)" जहां ए और बी दो पूर्णांक स्वैप किए जाने हैं। लेकिन जब मैंने सी भाषा का उपयोग करके इसे लागू किया तो इसके परिणामस्वरूप दुर्घटनाग्रस्त हो गया। क्या आप में से कोई भी ठीक लोगों के लिए संभावित कारण बता सकता है? कृपया स्वैपिंग के लिए सर्वश्रेष्ठ एल्गोरिदम का सुझाव दें। धन्यवाद !!!! लोग मैं दुर्घटनाग्रस्त होने का कारण जानना चाहता हूं।सर्वश्रेष्ठ एल्गोरिदम?

+2

मैं विश्वास नहीं कर सकता यह इतने पर भी सवाल है। 'Std :: swap' के साथ क्या गलत है? –

+14

@BillyONeal: के बाद से std :: स्वैप C++ है और इस सवाल सी के साथ टैग है – LiraNuna

+1

ठीक है - खेद है - मुझे लगता है कि "क्या सादा सरल' std :: swap' के विशिष्ट कार्यान्वयन के साथ गलत क्या है 'टी करने के लिए बदल दिया जाए? अस्थायी = एक, एक = दो, दो = अस्थायी;? 'गंभीरता से - अगर स्वैप अपने कार्यक्रम की गति सीमक है, तो आप एक समस्या है मुझे यकीन है कि क्या यह" अदला-बदली के लिए सबसे अच्छा एल्गोरिथ्म "है के लिए –

उत्तर

9

इस अदला-बदली चाल कभी-कभी खतरनाक, मैंने देखा है एक एक गलत quicksort इस अदला-बदली का उपयोग कर कार्यक्रम गलत परिणाम उत्पन्न करता है। लेकिन एक सामान्य स्वैप सही कार्यक्रम उत्पन्न करता है। गति के लिए

सम्मान, संकलक कभी कभी अगर हम एक tmp चर का उपयोग तेजी से कोड उत्पन्न करता है।

उपयोग tmp = a; a = b; b = tmp;

+0

धन्यवाद @yin मैं जानना चाहता हूं कि मेरी चाल बहुत खतरनाक क्यों है? –

+6

एक्सओआर स्वैप ('a^= b^= a^= b') केवल पूर्णांक (और पॉइंटर्स) पर काम करेगा। एक्सओआर स्वैप 'ए' और' बी' 0 'दोनों को बदल देगा यदि वे बराबर हैं। – LiraNuna

+2

मान लीजिए कि 'ए' और' बी 'पॉइंटर्स हैं जो एक ही चीज़ को इंगित करते हैं। फिर '(* ए)^= (* बी)^= (* ए)^= (* बी)' मूल्य शून्य हो जाएगा। सी ++ में यदि ये संदर्भ हैं तो आप इसे बिना किसी संदर्भ के कर सकते हैं। लेकिन @Yin झू का सुझाव देने का वास्तविक कारण यह है कि आपका कोड स्पष्ट होना चाहिए, और आपको इस तरह सूक्ष्म अनुकूलन के बारे में चिंता नहीं करनी चाहिए। विस्तृत चर्चा के लिए – rlbond

-2

संख्यात्मक मान के लिए इस तर्क का उपयोग करें:

int a = 10, b =5 ; 
    a = a-b; 
    b = b+a ;   // b gets the original value of a 
    a = b - a; // a gets the original value of b 
    printf ("value : %d %d \n",a ,b) ; 
+1

क्या होता है जब '' 'INT_MAX' होता है, और' बी' 'INT_MIN' है? दूसरे शब्दों में, 'ए-बी' अतिप्रवाह/अंडरफ्लो कर सकता है। –

+0

@ आलोक: ओवरफ्लो के बावजूद, यह अभी भी रैपरराउंड अंकगणितीय के साथ सही उत्तर देगा। – dan04

+3

@ dan04: रैपरराउंड की गारंटी नहीं है - सी/सी ++ पूर्णांक ओवरफ़्लो में यूबी है। –

3

http://en.wikipedia.org/wiki/Swap_(computer_science) देखें।

एक अस्थायी चर का उपयोग करना अधिक भूमि के ऊपर उत्पन्न करता है लेकिन XOR स्वैप एल्गोरिथ्म की तुलना में अधिक स्थिर है और समानांतर कंप्यूटिंग यह तेजी से XOR स्वैप से बना देता है।

अदला-बदली के लिए एक अस्थायी चर का उपयोग कर का एक ठोस कार्यान्वयन के लिए http://www.ibm.com/developerworks/linux/library/l-metaprog1.html के पहले कोड उदाहरण देखें।

+1

अस्थायी परिवर्तनीय समाधान के लिए अधिक ओवरहेड क्यों उत्पन्न होता है? एक्सओआर स्वैप भी अधिक गणना ओवरहेड बनाता है। – phoxis

10

a^=b^=a^=b; शायद क्रैश हो क्योंकि यह डरावने अपरिभाषित व्यवहार को आमंत्रित करता है। नियम यह टूट जाता है कि यह a दो बार एक बीच के अनुक्रम बिंदु के बिना संशोधित करता है। यह कुछ अनुक्रम अंक डालने से ठीक किया जा सकता - अल्पविराम ऑपरेटर के साथ उदाहरण के लिए:

a ^= (b ^= a ^= b, b);` 

या कई बयानों में इसे तोड़ कर:

b ^= a ^= b; a ^= b; 

यह अभी भी आम तौर पर एक खराब है, फिर भी, चर बदलने के लिए विधि - कई अन्य उत्तरों और टिप्पणियों ने पर्याप्त रूप से समझाया है क्यों।

0

कि कोड तेजी से इंसान से पढ़ने के लिए है कि लिखें। और अधिकतर समय में बेहतर कोड उत्पन्न करने के लिए संकलकों की क्षमता पर भरोसा करें। यह देखने के लिए प्रोफाइलिंग करें कि क्या यह गति सुधारने के लिए एकमात्र जगह है। फिर ऊपर कई बार सूचीबद्ध एक्सओआर समाधान लागू करें, यह हर जगह काम नहीं कर सकता है।

संबंधित मुद्दे