यह सी स्निपेट एक मर्ज एल्गोरिथ्म कार्यान्वयन का हिस्सा है:
बाहर [i ++] = (1 में [i1] & lt; in2 [i2])? In1 [i1 ++]: in2 [i2 ++]; क्या कोई कृपया इसकी व्याख्या कर सकता है कि यह कैसे काम करता है?
कोड
यह कोड का उपयोग करता है जिसे पोस्ट-इंकरिन ऑपरेटर और टर्नरी / सशर्त ऑपरेटर कहा जाता है (अधिक विवरण के लिए परिशिष्ट देखें)।
एक और वर्बोस संस्करण कुछ ऐसा दिखाई दे सकता है: < / P>
यदि (in1 [i1] & lt; in2 [i2]) {बाहर [i] = in1 [i1]; i ++; i1 ++; } और {बाहर [i] = in2 [i2]; i ++; i2 ++; } एल्गोरिदम
यदि in1 और in2 के तत्व क्रमबद्ध क्रम में हैं, तो स्निपेट दो सॉर्ट किए गए इनपुट बफ़र्स को एक सॉर्ट किए गए आउटपुट बफ़र में मर्ज करने के लिए मर्ज एल्गोरिथ्म का मुख्य भाग के रूप में कार्य करता है।
यह सुनिश्चित करने के लिए कि i1 और I2 के लिए in1 और in2 के क्रम में in1 [i1] के विरुद्ध in2 [i2] की तुलना में क्रमशः है। । फिर में 1 [i1] in1 में अगला उपलब्ध सबसे छोटा तत्व है, और इसी तरह in2 [i2] अगले में सबसे कम उपलब्ध तत्व है In2 ।
सामान्यता के नुकसान के बिना, मान लें कि in1 [i1] & lt; In2 [i2] (अन्य मामले एक निकट दर्पण परिदृश्य है)। इसके बाद in1 से अगले सबसे छोटे से तत्व in2 से अगले सबसे छोटे तत्व से छोटा है, और in1 [i1 ++] के दाहिने हाथ से असाइनमेंट, हम in1 से अगले छोटे मूल्य को प्राप्त कर लेते हैं और अगली उपलब्ध मूल्य (यदि कोई हो) में अपने सूचक को आगे बढ़ाते हैं। असाइनमेंट के बायीं तरफ बाहर [i ++] के साथ, हम आउटपुट बफर में एक स्लॉट में प्राप्त किए गए मान को आवंटित करते हैं और इसके सूचक को अगले उपलब्ध स्लॉट (यदि कोई हो) में अग्रिम कर देते हैं।
समग्र मर्ज एल्गोरिदम का एक उच्च स्तर का छद्मकोण, इसी सूचक सूचकांकों (स्पष्टता के लिए!) के साथ सरणियों के बजाय सार डेटा संरचना का उपयोग करके क्यू का उपयोग कर, ऐसा कुछ दिखाई दे सकता है: < / P>
प्रक्रिया मिर्ज (पंक्ति 1, इन 2 में): कतार // दिए गए क्रमबद्ध कतार 1, in2, एक मर्ज किए गए सॉर्ट किए गए कतार वापस आईएनआईटी में रिक्त-कतार WHILE इन 1 .notEmpty () और in2.notEmpty ( ) यदि I1.peek () & lt; In2.peek () out.enqueue (in1.dequeue ()) ELSE out.enqueue (in2.dequeue ()) // इस बिंदु पर, कम से कम एक कतार रिक्त है / / 1 डंप इन 1 को बाहर करने के लिए यदि यह नहीं है रिक्त WHILE in1.notEmpty () out.enqueue (in1.dequeue ()) // डंप इन 2 को बाहर करने के मामले में यह रिक्त नहीं है, जबकि 2 में। NotEmpty () out.enqueue (in2.dequeue ()) रिटर्न आउट यह भी देखें
परिशिष्ट A: टर्नेटरी / सशर्त ऑपरेटर
अनिवार्य रूप से, इस तरह के एक अभिव्यक्ति:
स्थिति? TrueExpr: falseExpr पहले शर्त का मूल्यांकन करता है, और यदि यह true है, तो यह trueExpr का मूल्यांकन करता है जिसका मान हो जाता है संपूर्ण अभिव्यक्ति का मूल्य अगर इसके बजाय condition है false , ऑपरेटर बजाय falseExpr का मूल्यांकन करता है, जिसका मान संपूर्ण अभिव्यक्ति का मान बन जाता है।
संबंधित प्रश्न
परिशिष्ट B: पोस्ट-वेतन वृद्धि ऑपरेटर
एक अभिव्यक्ति जैसे i ++ का उपयोग करता है जिसे पोस्ट-इंडेरिमेंट ऑपरेटर कहा जाता है ऑपरेटर वेतन वृद्धि i है, लेकिन इस अभिव्यक्ति का मान, i से पहले वेतन वृद्धि का मूल्य है। इसके विपरीत, एक पूर्व-वृद्धि अभिव्यक्ति (जैसे ++ i ) का मान i के बाद वेतन वृद्धि का मूल्य है।
वहां भी पूर्व-कमी (जैसे - i ) और बाद में कमी भी (जैसे i - )।
संबंधित प्रश्न
i = i ++ जैसे कमांडों पर (इनमें से अधिकतर जावा , लेकिन अन्य भाषाओं के लिए भी लागू है):
Comments
Post a Comment