मैं बहुत उत्सुक हूं, एल्गोरिदम को छांटने में स्थिरता क्यों महत्वपूर्ण है या नहीं है?
IBM (Insertion, Bubble, Merge)
मैं बहुत उत्सुक हूं, एल्गोरिदम को छांटने में स्थिरता क्यों महत्वपूर्ण है या नहीं है?
IBM (Insertion, Bubble, Merge)
जवाबों:
एक सॉर्टिंग एल्गोरिथ्म को स्थिर कहा जाता है यदि समान कुंजी वाले दो ऑब्जेक्ट सॉर्ट किए गए आउटपुट में उसी क्रम में दिखाई देते हैं जैसे वे इनपुट सरणी में सॉर्ट किए जाते हैं। कुछ छँटाई एल्गोरिदम प्रकृति द्वारा स्थिर हैं जैसे सम्मिलन प्रकार, मर्ज सॉर्ट, बबल सॉर्ट, आदि और कुछ सॉर्टिंग एल्गोरिदम नहीं हैं, जैसे हीप सॉर्ट, त्वरित सॉर्ट, आदि।
पृष्ठभूमि : "स्थिर" सॉर्टिंग एल्गोरिथ्म आइटम को क्रम में एक ही सॉर्टिंग कुंजी के साथ रखता है। मान लें कि हमारे पास 5-अक्षर शब्दों की एक सूची है:
peach
straw
apple
spork
यदि हम प्रत्येक शब्द के पहले अक्षर से सूची को छाँटते हैं तो एक स्थिर-छँटनी होती है:
apple
peach
straw
spork
एक अस्थिर सॉर्ट एल्गोरिथ्म में, straw
या spork
इंटरचेंज किया जा सकता है, लेकिन एक स्थिर एक ही में, वे एक ही सापेक्ष स्थिति में रहते हैं (अर्थात, चूंकि इनपुट में straw
पहले दिखाई देता है spork
, यह spork
आउटपुट में भी पहले प्रकट होता है )।
हम इस एल्गोरिथ्म का उपयोग करके शब्दों की सूची को सॉर्ट कर सकते हैं: कॉलम 5 द्वारा स्थिर छँटाई, फिर 4, फिर 3, फिर 2, फिर 1. अंत में, इसे सही ढंग से क्रमबद्ध किया जाएगा। अपने आप को समझाओ। (वैसे, उस एल्गोरिदम को मूलांक सॉर्ट कहा जाता है)
अब आपके प्रश्न का उत्तर देने के लिए, मान लें कि हमारे पास पहले और अंतिम नामों की एक सूची है। हमें "पहले नाम से, फिर पहले से" सॉर्ट करने के लिए कहा जाता है। हम पहले नाम से पहले (स्थिर या अस्थिर), फिर अंतिम नाम से स्थिर क्रमबद्ध कर सकते थे। इन प्रकारों के बाद, सूची को मुख्य रूप से अंतिम नाम द्वारा क्रमबद्ध किया जाता है। हालाँकि, जहाँ अंतिम नाम समान हैं, पहले नाम क्रमबद्ध हैं।
आप एक ही फैशन में अस्थिर प्रकारों को ढेर नहीं कर सकते।
straw
और spork
बराबर की तुलना करें। स्थिर सॉर्ट इनपुट के क्रम को बनाए रखेगा, जबकि अस्थिर सॉर्ट उस गारंटी को नहीं बनाता है। "सही" आवेदन पर निर्भर करता है। अधिकांश प्रोग्रामिंग भाषाओं में सॉर्ट फ़ंक्शन उपयोगकर्ता को कस्टम ऑर्डर करने वाले फ़ंक्शन की आपूर्ति करने देता है। यदि उपयोगकर्ता का कार्य अलग-अलग वस्तुओं को समान मानता है (उदाहरण के लिए पहला नाम, अलग-अलग अंतिम नाम), तो यह जानने में मदद करता है कि क्या मूल ऑर्डर संरक्षित होगा। एक वास्तविक दुनिया उदाहरण के लिए OCaml की सरणी सॉर्टिंग फ़ंक्शन देखें ।
एक स्थिर छँटाई एल्गोरिथ्म वह है जो समान तत्वों को उनके उसी क्रम में क्रमबद्ध करता है जैसा कि वे इनपुट में दिखाई देते हैं, जबकि अस्थिर छँटाई मामले को संतुष्ट नहीं कर सकती है । - मैं अपने एल्गोरिथ्म व्याख्याता दीदीम गोज़ुपेक को एल्गोरिदम में अंतर्दृष्टि प्रदान करने के लिए धन्यवाद देता हूं ।
स्थिर सॉर्टिंग एल्गोरिदम:
अस्थिर छँटाई एल्गोरिदम:
सॉर्टिंग स्थिरता का अर्थ है कि एक ही कुंजी के साथ रिकॉर्ड सॉर्ट से पहले और बाद में अपने सापेक्ष क्रम को बनाए रखते हैं।
तो स्थिरता मायने रखती है, और केवल अगर, जिस समस्या को आप हल कर रहे हैं, उस सापेक्ष क्रम को बनाए रखने की आवश्यकता है।
यदि आपको स्थिरता की आवश्यकता नहीं है, तो आप लाइब्रेरी से एक तेज, मेमोरी-सिपिंग एल्गोरिथ्म का उपयोग कर सकते हैं, जैसे कि हेप्सोर्ट या क्विकॉर्ट, और इसके बारे में भूल जाते हैं।
यदि आपको स्थिरता की आवश्यकता है, तो यह अधिक जटिल है। स्थिर एल्गोरिदम में अस्थिर एल्गोरिदम की तुलना में अधिक बड़े-ओ सीपीयू और / या मेमोरी का उपयोग होता है। इसलिए जब आपके पास एक बड़ा डेटा सेट होता है, तो आपको सीपीयू या मेमोरी को हराकर चुनना होगा। यदि आप CPU और मेमोरी दोनों पर विवश हैं, तो आपको एक समस्या है। एक अच्छा समझौता स्थिर एल्गोरिथ्म एक बाइनरी ट्री सॉर्ट है; विकिपीडिया लेख एक दयनीयता से आसान सी ++ एसटीएल के आधार पर कार्यान्वयन है।
आप प्रत्येक रिकॉर्ड के लिए अंतिम रिकॉर्ड संख्या के रूप में मूल रिकॉर्ड संख्या जोड़कर एक स्थिर एक में एक अस्थिर एल्गोरिथ्म बना सकते हैं।
यह निर्भर करता है कि आप क्या करते हैं।
कल्पना कीजिए कि आपको पहले और अंतिम नाम फ़ील्ड के साथ कुछ लोगों के रिकॉर्ड मिले हैं। पहले आप सूची को पहले नाम से क्रमबद्ध करें। यदि आप सूची को अंतिम नाम से एक स्थिर एल्गोरिथ्म के साथ सॉर्ट करते हैं, तो आपके पास पहले नाम और अंतिम नाम के अनुसार एक सूची होगी।
स्थिरता के महत्वपूर्ण होने के कुछ कारण हो सकते हैं। एक यह है कि, यदि दो रिकॉर्ड्स को स्वैप करने की आवश्यकता नहीं है, तो उन्हें स्वैप करके आप एक मेमोरी अपडेट का कारण बन सकते हैं, एक पृष्ठ गंदा है, और डिस्क (या किसी अन्य धीमे माध्यम) को फिर से लिखना होगा।
एक सॉर्टिंग एल्गोरिथ्म को स्थिर कहा जाता है यदि समान कुंजी के साथ दो ऑब्जेक्ट सॉर्ट किए गए आउटपुट में एक ही क्रम में दिखाई देते हैं जैसा कि वे इनपुट असमान सरणी में दिखाई देते हैं। कुछ छँटाई एल्गोरिदम प्रकृति द्वारा स्थिर हैं जैसे सम्मिलन प्रकार, मर्ज सॉर्ट, बबल सॉर्ट, आदि और कुछ सॉर्टिंग एल्गोरिदम नहीं हैं, जैसे हीप सॉर्ट, त्वरित सॉर्ट, आदि।
हालांकि, किसी भी प्रकार की छंटनी वाली एल्गो जो स्थिर नहीं है, स्थिर होने के लिए संशोधित की जा सकती है। इसे स्थिर बनाने के लिए अलग-अलग तरह के अहम् तरीके हो सकते हैं, लेकिन सामान्य तौर पर, किसी भी तरह की तुलना पर आधारित एल्गोरिथ्म जो प्रकृति द्वारा स्थिर नहीं है, को कुंजी तुलनात्मक ऑपरेशन में बदलकर स्थिर किया जा सकता है ताकि दो कुंजी की तुलना स्थिति को एक मानें समान कुंजी के साथ वस्तुओं के लिए कारक।
संदर्भ: http://www.math.uic.edu/~leon/cs-mcs401-s08/handouts/stability.pdf http://en.wikipedia.org/wiki/Sorting_algorithm#Stability
मुझे पता है कि इसके लिए कई जवाब हैं, लेकिन मेरे लिए, रॉबर्ट हार्वे द्वारा इस जवाब को , और अधिक स्पष्ट रूप से संक्षेप में प्रस्तुत किया गया है:
एक स्थिर सॉर्ट वह है जो इनपुट सेट के मूल आदेश को संरक्षित करता है, जहां [अस्थिर] एल्गोरिथ्म दो या दो से अधिक वस्तुओं के बीच अंतर नहीं करता है।
यदि आप यह मान लेते हैं कि आप जो छँटाई कर रहे हैं वह केवल संख्याएँ हैं और केवल उनके मूल्य ही उन्हें पहचानते हैं / उनमें अंतर करते हैं (उदाहरण के लिए समान मूल्य वाले तत्व समान हैं), तो छँटाई का स्थिरता-मुद्दा व्यर्थ है।
हालाँकि, छँटाई में समान प्राथमिकता वाली वस्तुएँ अलग हो सकती हैं, और कभी-कभी उनका सापेक्ष क्रम सार्थक जानकारी होती है। इस स्थिति में, अस्थिर सॉर्ट समस्याओं को उत्पन्न करता है।
उदाहरण के लिए, आपके पास डेटा की एक सूची है जिसमें एक गेम में लेवल [L] के साथ भूलभुलैया को साफ करने के लिए सभी खिलाड़ियों की समय लागत [T] है। मान लीजिए, हमें खिलाड़ियों को रैंक करने की आवश्यकता है कि वे कितनी जल्दी भूलभुलैया को साफ करते हैं। हालांकि, एक अतिरिक्त नियम लागू होता है: उच्च स्तर के साथ भूलभुलैया को साफ करने वाले खिलाड़ियों के पास हमेशा उच्च रैंक होता है, भले ही समय कितना भी लंबा क्यों न हो।
बेशक, आप कुछ एल्गोरिथ्म के साथ एक वास्तविक संख्या [आर] के लिए युग्मित मान [टी, एल] को मैप करने का प्रयास कर सकते हैं जो नियमों का पालन करते हैं और फिर [आर] मान के साथ सभी खिलाड़ियों को रैंक करते हैं।
हालाँकि, यदि स्थिर छँटाई संभव है, तो आप पूरी सूची को [T] (पहले तेज़ खिलाड़ी) और फिर [L] द्वारा क्रमबद्ध कर सकते हैं। इस मामले में, आपके द्वारा साफ किए गए चक्रव्यूह के स्तर के आधार पर खिलाड़ियों के सापेक्ष क्रम में बदलाव नहीं किया जाएगा।
पुनश्च: बेशक दो बार सॉर्ट करने का तरीका विशेष समस्या का सबसे अच्छा समाधान नहीं है लेकिन पोस्टर के प्रश्न को समझाने के लिए यह पर्याप्त होना चाहिए।
स्थिर सॉर्ट हमेशा एक ही इनपुट पर एक ही समाधान (क्रमपरिवर्तन) लौटाएगा।
उदाहरण के लिए [2,1,2] क्रमबद्धता के रूप में स्थिर छँटाई का उपयोग करके क्रमबद्ध किया जाएगा [2,1,3] (पहले अनुक्रमणिका 2, फिर अनुक्रमणिका 3 फिर क्रमबद्ध आउटपुट में अनुक्रमणिका है) इसका मतलब है कि आउटपुट हमेशा उसी तरह से फेरबदल किया जाता है। अन्य गैर स्थिर, लेकिन अभी भी सही क्रमचय है [2,3,1]।
त्वरित प्रकार स्थिर नहीं है और समान तत्वों के बीच क्रमपरिवर्तन अंतर धुरी को चुनने के लिए एल्गोरिथ्म पर निर्भर करता है। कुछ कार्यान्वयन यादृच्छिक पर लगते हैं और एक ही एल्गोरिथ्म का उपयोग करके एक ही इनपुट पर विभिन्न क्रमिक पैदावार कर सकते हैं।
स्थिर सॉर्ट एल्गोरिथ्म आवश्यक निर्धारक है।
sort([(5,3),(1,5),(3,3),(1,3)], x) => [(1,5),(1,3),(3,3),(5,3)]
:। मैं एक नियतात्मक प्रकार बना सकता हूं जो हमेशा (निर्धारक रूप से) आउटपुट करता है: [(1,3),(1,5),(3,3),(5,3)]
लेकिन यह एक स्थिर प्रकार नहीं है।
स्थिर रूप से चाहने के कारण के कुछ और उदाहरण। डेटाबेस एक सामान्य उदाहरण है। लेन-देन के डेटा बेस के मामले को अंतिम शामिल करें। पहला नाम, खरीद का समय, आइटम नंबर, मूल्य। मान लें कि डेटा बेस सामान्य रूप से तिथि के अनुसार क्रमबद्ध होता है। फिर अंतिम आधार तक डेटा बेस की एक सॉर्ट की गई कॉपी बनाने के लिए एक क्वेरी बनाई जाती है। पहला नाम, चूंकि एक स्थिर सॉर्ट मूल ऑर्डर को संरक्षित करता है, भले ही जांच में केवल अंतिम विवरण शामिल हो। पहला नाम, प्रत्येक अंतिम के लिए लेनदेन | पहला नाम होगा समय के क्रम में |
एक समान उदाहरण क्लासिक एक्सेल है, जो एक बार में 3 कॉलम तक सीमित है। 6 स्तंभों को क्रमबद्ध करने के लिए, एक छंटाई कम से कम 3 महत्वपूर्ण स्तंभों के साथ की जाती है, इसके बाद सबसे महत्वपूर्ण 3 स्तंभों के साथ।
एक स्थिर मूलांक सॉर्ट का एक क्लासिक उदाहरण एक कार्ड सॉर्टर है, जिसका उपयोग आधार 10 संख्यात्मक स्तंभों के क्षेत्र द्वारा सॉर्ट करने के लिए किया जाता है। कार्डों को कम से कम महत्वपूर्ण अंकों से सबसे महत्वपूर्ण अंकों में क्रमबद्ध किया जाता है। प्रत्येक पास पर, कार्ड का एक डेक पढ़ा जाता है और उस कॉलम में अंक के अनुसार 10 अलग-अलग डिब्बे में विभाजित किया जाता है। फिर कार्ड के 10 डिब्बे वापस इनपुट हॉपर में डाल दिए जाते हैं ("0" कार्ड पहले, "9" कार्ड अंतिम)। फिर एक और पास अगले कॉलम द्वारा किया जाता है, जब तक कि सभी कॉलम को सॉर्ट नहीं किया जाता है। वास्तविक कार्ड सॉर्टर्स में 10 से अधिक डिब्बे होते हैं क्योंकि एक कार्ड पर 12 ज़ोन होते हैं, एक कॉलम खाली हो सकता है, और एक गलत रीड बिन है। अक्षरों को क्रमबद्ध करने के लिए, प्रति कॉलम 2 पास आवश्यक हैं, अंक के लिए 1 पास, 12 11 ज़ोन के लिए 2 पास।
बाद में (1937) कार्ड कोलाटिंग (विलय) मशीनें थीं जो खेतों की तुलना करके कार्ड के दो डेक का विलय कर सकती थीं। इनपुट कार्ड के दो पहले से ही सॉर्ट किए गए डेक, एक मास्टर डेक और एक अपडेट डेक था। कोलेटर ने दो डेक को एक नए मेटर बिन और एक आर्क बिन में मिला दिया, जो वैकल्पिक रूप से मास्टर डुप्लिकेट के लिए उपयोग किया जाता था ताकि नए मास्टर बिन में डुप्लिकेट के मामले में केवल अपडेट कार्ड होंगे। यह शायद मूल (नीचे ऊपर) मर्ज सॉर्ट के पीछे के विचार का आधार था।