क्या छँटाई एल्गोरिथ्म के लिए आवश्यक संक्रामकता है


14

क्या गैर-संक्रमणीय तुलना के साथ एक छँटाई एल्गोरिथ्म का उपयोग करना संभव है, और यदि हाँ, तो तुलनात्मक रूप से छँटाई के लिए आवश्यकता के रूप में सूचीबद्धता क्यों है?

पृष्ठभूमि:

  • एक छँटाई एल्गोरिथ्म आमतौर पर एक तुलनित्र फ़ंक्शन सी (x, y) के अनुसार सूची के तत्वों को क्रमबद्ध करता है

    C(x,y)={1if xy0if xy+1if xy

    इस तुलनित्र की आवश्यकताएं हैं, जहां तक ​​मैं उन्हें समझता हूं:

    • : x:C(x,x)=0
    • एंटीसिमेट्रिक: x,y:C(x,y)=C(y,x)
    • सकर्मक: x,y,z,a:C(x,y)=aC(y,z)=aC(x,z)=
    • C (x, y) को सभी x और y के लिए परिभाषित किया गया है, और परिणाम केवल x और y पर निर्भर करते हैं

    (इन आवश्यकताओं को हमेशा अलग-अलग कार्यान्वयनों के साथ अलग-अलग सूचीबद्ध किया जाता है, इसलिए मुझे यकीन नहीं है कि मुझे यह सब सही मिला है)

अब मैं एक "सहिष्णु" तुलनित्र फ़ंक्शन के बारे में सोच रहा हूं, जो संख्याओं को स्वीकार करता है x, y जैसा कि यदि : |xy|1

C(x,y)={1if x<y10if |xy|1+1if x>y+1

उदाहरण: दोनों [ 1, 2, 3, 4, 5]और [1, 4, 3, 2, 5]सहिष्णु तुलनित्र के अनुसार आरोही क्रम में क्रमबद्ध हैं ( यदि x सूची में y से पहले आता है), लेकिन नहीं है, क्योंकि C (4,2) = 1सी(एक्स,y)0
[1, 4, 2, 3, 5]

यह सहिष्णु तुलनित्र रिफ्लेक्सिव और एंटीसिमेट्रिक है, लेकिन सकर्मक नहीं।

यानी C (1,2) = 0, c (2,3) = 0, लेकिन C (1,3) = -1, संक्रामण का उल्लंघन

फिर भी मैं किसी भी छँटाई एल्गोरिथ्म के बारे में नहीं सोच सकता हूँ जो इस तुलनित्र और एक यादृच्छिक सूची को देखते हुए "सही ढंग से क्रमबद्ध" आउटपुट का उत्पादन करने में विफल होगा।

क्या इस मामले में संवेदनशीलता की आवश्यकता नहीं है? और वहाँ है कि संक्रामिता ने एक कम सख्त संस्करण है है काम करने के लिए छंटाई के लिए आवश्यक?

संबंधित सवाल:


मुझे लगता है कि धुरी के लिए "हमेशा मध्य का चयन करें" के साथ एस्कॉर्ट इस तुलनित्र का उपयोग करने में विफल होगा [3, 2, 1]।
जी। बाक

2
मुझे संदेह है कि कुछ सॉर्टिंग एल्गोरिथ्म में उपयोग किए जाने वाले कुछ गैर-संक्रमक तुलनित्र एक अनंत लूप का कारण बन सकते हैं।
कारोलिस जुओदेलो

1
आप एक सॉर्ट की गई सूची (यानी आवश्यक आउटपुट) के रूप में क्या विचार करेंगे? सामान्य स्थिति में, दो समतुल्य स्थितियां हैं: , और सभी । aiai+1aiajiजे
युवल फिल्मस

@ जी। मुझे लगता है कि एस्कॉर्ट वास्तव में पूरी तरह से विफल हो जाएगा यदि आपके एरे में 3 बार, 2 बार, 1 बार एन 1 है, और मध्य 2 का उपयोग पहले पिवट के रूप में किया जाता है, इसके बाद कोई फर्क नहीं पड़ता।
gnasher729

जवाबों:


12

आपने पूछा: क्या हम एक गैर-संक्रमक तुलनित्र को खिलाकर एक छँटाई एल्गोरिथ्म चला सकते हैं?

जवाब: बिल्कुल। आप किसी भी इनपुट के साथ कोई भी एल्गोरिथ्म चला सकते हैं।

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

एक प्रतिरूप के रूप में, इनपुट सूची पर सम्मिलन प्रकार चल रहा है [3,2,1] अपने तुलनित्र का उपयोग करके सूची को अपरिवर्तित छोड़ देगा - फिर भी परिणामी आउटपुट सूची क्रमबद्ध क्रम में नहीं है (आपके तुलनित्र के अनुसार)।


1
मेरा पहला विचार यह था कि सूची [3,2,1] है , मेरे तुलनित्र के अनुसार क्रमबद्ध क्रम में तो निश्चित रूप से तरह यह अपरिवर्तित छोड़ देना चाहिए; लेकिन मैं हल की गई गलत परिभाषा का उपयोग कर रहा हूँ। मैं बस अपने प्रत्यक्ष पड़ोसियों के साथ प्रत्येक तत्व की तुलना करता हूं, लेकिन हो सकता है कि किसी सूची को क्रमबद्ध करने पर विचार करने के लिए बहुत कमज़ोर प्रतिबंध हो
HugoRune

4
@HugoRune खैर, यह एक दिलचस्प बिंदु है। छांटे से आपका क्या मतलब है ? यदि आप एक छँटाई एल्गोरिथ्म दिखा सकते हैं एक गैर-संक्रमक तुलनित्र को समाप्त कर देगा, और जब भी एल्गोरिथ्म समाप्त हो जाता है, तो कुछ स्थिति सही होती है, और यह शर्त है कि आप क्या छँटाई लेते हैं ... तो निश्चित रूप से एल्गोरिथ्म आपकी सूची को क्रमबद्ध करेगा हर बार, क्रमबद्धता की उस परिभाषा के लिए । तुलनित्र सकर्मक नहीं है, तो यह मतलब नहीं हो सकता है की एक परिभाषा लेने के लिए हल कर जो क्रमबद्ध सूची के सभी तत्वों जोड़ो में तुलना की आवश्यकता है।
पैट्रिक87

3
@HugoRune, "केवल पड़ोसियों की तुलना की जाती है" के साथ आपको संभवतः एक कस्टम प्रकार की आवश्यकता होगी। मानक एल्गोरिदम अतिरेक तुलना से बचने के लिए परिवर्तनशीलता मानते हैं। या आप अपने गैर-संक्रमणीय क्रम को एक सकर्मक में एम्बेड कर सकते हैं। या शायद आप टोपोलॉजिकल सॉर्टिंग की तर्ज पर कुछ ढूंढ रहे हैं ?
वॉनब्रांड

मैं थोड़ी देर पहले इसमें भाग गया और पाया कि बुलबुला सॉर्ट वास्तव में ठीक काम करता है, क्योंकि यह केवल आसन्न तत्वों की तुलना करता है।
मूइंग डक

4

तत्वों के एक सेट और एक बाइनरी ऑर्डरिंग रिलेशन को देखते हुए, तत्वों को पूरी तरह से ऑर्डर करने के लिए ट्रांज़िटिविटी की आवश्यकता होती है। वास्तव में, तत्वों पर आंशिक आदेश को परिभाषित करने के लिए भी संवेदनशीलता की आवश्यकता होती है। http://en.m.wikipedia.org/wiki/Total_order

पारगमन के बिना तत्वों को सॉर्ट करने के लिए आपको "सॉर्ट किए गए" का एक बहुत व्यापक परिभाषा की आवश्यकता होगी। आत्मनिर्भर होना कठिन है। एक अन्य उत्तर में कहा गया है "विशेष रूप से, इस बात की कोई गारंटी नहीं है कि आउटपुट आपके तुलनित्र के अनुसार 'क्रमबद्ध' होगा।" लेकिन हम वास्तव में कुछ ज्यादा मजबूत कह सकते हैं। आपको गारंटी दी जाती है कि आउटपुट आपके तुलनित्र के अनुसार क्रमबद्ध नहीं है

<<सीसी<


1
मैंने आंशिक आदेशों का उपयोग करके छंटनी के बारे में पूछे जाने वाले प्रश्न की व्याख्या की (जैसे कि एक तुलना जो कहती है कि चीजें असमान हैं, सकर्मक हैं, लेकिन जो वस्तुएं अप्रभेद्य हैं वे नहीं हैं)। आंशिक क्रम के आधार पर छंटनी कभी-कभी उपयोगी होती है, लेकिन सबसे खराब स्थिति में एन (एन -1) / 2 तुलना की आवश्यकता होती है। कोई भी सॉर्टिंग एल्गोरिथ्म जो सबसे खराब स्थिति में एन (एन -1) / 2 तुलना से कम करता है, मेरे उत्तर में वर्णित कारणों के लिए आंशिक रूप से आदेशित वस्तुओं को सही ढंग से रैंक करने में असमर्थ होगा।
सुपरकैट

2

ऐसा लगता है जैसे आप जो चाहते हैं वह ऐसी वस्तुओं की व्यवस्था करने के लिए है, जो कि सभी असाध्य रैंकिंग सही हैं, लेकिन जो आइटम करीब हैं उन्हें "अविभाज्य" माना जा सकता है। सॉर्ट एल्गोरिदम को डिजाइन करना संभव है जो इस तरह की तुलना के साथ काम करेगा, लेकिन जब तक कि कितनी तुलना करने की सीमा नहीं है, रिपोर्ट कर सकते हैं कि चीजें अप्रभेद्य हैं, तो उन्हें एन (एन -1) / 2 तुलना की आवश्यकता होने से बचने का कोई तरीका नहीं है। यह समझने के लिए कि क्यों, कुछ संख्या एन और किसी भी छँटाई एल्गोरिथ्म को चुनें जो एन (एन -1) / 2 तुलना से कम है। फिर एक सूची L [0..N-1] को पॉप्युलेट करें, प्रत्येक तत्व L [I] को I / N पर सेट करें और अपने तुलनित्र का उपयोग करके इसे "सॉर्ट करें" (न्यूनतम मान 0 होगा और अधिकतम (N-1) / N , इसलिए अंतर होगा (एन -1) / एन, जो 1 से कम है)।

क्योंकि N (N-1) / 2 जोड़े आइटम हैं जिनकी तुलना की जा सकती है, और सॉर्ट ने ऐसा नहीं किया है कि कई तुलनाएं हैं, कुछ जोड़ी आइटम ऐसे होने चाहिए जो सीधे एक दूसरे के खिलाफ तुलना में नहीं थे। जो भी इनमें से एक को पहले 1 से हल किया जा रहा है, और दूसरा -1 / N के साथ बदलें, सभी आइटम को अपनी प्रारंभिक स्थिति में वापस लाएं, और छंटनी ऑपरेशन को दोहराएं। हर एक तुलना ऑपरेशन शून्य पैदा करेगा, जैसा कि उसने पहली बार किया था, इसलिए समान तुलना की जाएगी और आइटम उसी क्रम में समाप्त हो जाएंगे। सूची को सही ढंग से क्रमबद्ध करने के लिए, "1" को "-1 / N" के बाद क्रमबद्ध करना होगा (क्योंकि वे एक से अधिक भिन्न होते हैं) लेकिन चूंकि छंटाई एल्गोरिथ्म उन दो वस्तुओं की सीधे एक दूसरे के खिलाफ तुलना नहीं करेगा, इसलिए यह जानने का कोई तरीका नहीं होगा।


0

N n, n-1, n-2, ..., 2, 1. के साथ n तत्वों की एक सरणी भरें। फिर "स्ट्रेट इंसर्शन" एल्गोरिथम का उपयोग करके सॉर्ट करने का प्रयास करें। आप पाएंगे कि प्रत्येक तत्व को उसके ठीक पहले के तत्व के बराबर माना जाता है, और इसलिए इसे स्थानांतरित नहीं किया जाता है। "सॉर्ट" का परिणाम समान सरणी है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.