पूर्णांकों की एक सरणी के लिए सबसे तेज़ छँटाई एल्गोरिथ्म क्या है?


55

मैं अपने हाई स्कूल की पढ़ाई के दौरान कई छँटाई एल्गोरिदम में आया हूँ। हालाँकि, मैं कभी नहीं जानता कि सबसे तेज (पूर्णांक के यादृच्छिक सरणी के लिए) कौन है। तो मेरे सवाल हैं:

  • वर्तमान में ज्ञात सबसे तेज़ सॉर्टिंग एल्गोरिथम कौन सा है?
  • सैद्धांतिक रूप से, क्या यह संभव है कि वहाँ भी तेजी से हो? तो, छँटाई के लिए कम से कम जटिलता क्या है?

6
"उपवास" से आपका क्या तात्पर्य है? आप क्या मापना चाहते हैं?
राफेल

2
"यादृच्छिक सरणी के पूर्णांक" का क्या अर्थ है? क्या वितरण के साथ यादृच्छिक? वर्दी वितरण? गाऊसी? वितरण के आधार पर गणित चलने वाले समय के एल्गोरिदम से बेहतर हो सकता है। O(nlogn)
बाकुरू

@gen मूलांक की तरह देखें। सही कार्यान्वयन में उदाहरण के लिए Int32 के लिए O (n) जटिलता है।
यह


1
@gen: asymptotics के संदर्भ में ? फिर, यह आसान है: किसी भी एल्गोरिदम चुनें। ध्यान दें कि इसका वास्तविक दुनिया के प्रदर्शन (औसत) से कोई लेना- देना नहीं है। यह इस संबंध में एक सार्थक पढ़ने हो सकता है। Θ ( n लॉग इन करें n )ΘΘ(nlogn)
राफेल

जवाबों:


42

सामान्य शब्दों में, सॉर्टिंग एल्गोरिदम हैं, जैसे प्रविष्टि सॉर्ट, बबल सॉर्ट, और चयन सॉर्ट, जिन्हें आपको आमतौर पर केवल विशेष परिस्थितियों में उपयोग करना चाहिए; क्विकॉर्ट, जो सबसे खराब स्थिति लेकिन काफी बार अच्छे स्थिरांक और गुणों के साथ होता है और जिसे एक सामान्य-उद्देश्य सॉर्टिंग प्रक्रिया के रूप में इस्तेमाल किया जा सकता है; एल्गोरिदम, मर्ज-तरह और ढेर-तरह की तरह है, जो भी अच्छा सामान्य प्रयोजन छँटाई एल्गोरिदम कर रहे हैं; और , या रैखिक, पूर्णांक की सूचियों के लिए एल्गोरिदम को सॉर्ट करना, जैसे कि मूलांक, बाल्टी और गिनती प्रकार, जो आपकी सूचियों में पूर्णांकों की प्रकृति के आधार पर उपयुक्त हो सकते हैं।O ( n 2 ) O ( n लॉग एन ) O ( n लॉग एन ) O ( n )O(n2)O(n2)O(nlogn)O(nlogn)O(n)

यदि आपकी सूची के तत्व ऐसे हैं, जिनके बारे में आप जानते हैं कि उनके बीच कुल ऑर्डर संबंध है, तो इष्टतम सॉर्टिंग एल्गोरिदम में जटिलता । यह एक काफी अच्छा परिणाम है और जिसके लिए आपको आसानी से ऑनलाइन विवरण प्राप्त करने में सक्षम होना चाहिए। रेखीय सॉर्टिंग एल्गोरिदम तत्वों की संरचना के बारे में अधिक जानकारी का दोहन करते हैं, बजाय तत्वों के बीच कुल आदेश संबंध के।Ω(nlogn)

और भी आम तौर पर, एक छँटाई एल्गोरिथ्म की इष्टतमता मान्यताओं पर निर्भर करती है कि आप किस प्रकार की सूचियों के बारे में बना सकते हैं, जो आप छँटाई करने जा रहे हैं (साथ ही मशीन का मॉडल जिस पर एल्गोरिथ्म चलेगा, जो अन्यथा छँटाई भी कर सकता है) एल्गोरिदम सबसे अच्छा विकल्प है; भंडारण के लिए एक टेप के साथ मशीनों पर बुलबुला सॉर्ट पर विचार करें)। आपकी मान्यताओं को जितना मजबूत किया जाएगा, आपके एल्गोरिथ्म में उतने ही कोने कटेंगे। किसी सूची के "क्रमबद्धता" को कितनी कुशलता से निर्धारित कर सकते हैं, इसके बारे में बहुत ही कमजोर धारणाओं के तहत, सबसे खराब स्थिति में जटिलता भी ।Ω(n!)

यह जवाब केवल जटिलताओं से संबंधित है। एल्गोरिदम के कार्यान्वयन के वास्तविक चलने का समय बड़ी संख्या में उन कारकों पर निर्भर करेगा जो एक ही उत्तर में खाते में कठिन हैं।


मुझे लगता है कि उन कुछ होना चाहिए ? ΩOΩ
राफेल

1
@ राफेल मेह। मुझे लगता है कि उनमें से ज्यादातर किसी भी तरह । मैं लोअर बाउंड शायद बेहतर प्रदान की गई है लगता है । मैं उनमें से एक जोड़ी को बदल दूंगा जो सबसे अधिक समझ में आता है। ΩΘΩ
पैट्रिक87 19

7
मैं वोट करता हूं @ राफेल को एक _ पुलिस की टोपी मिलती है : PΩ
Realz Slaw

2
@RealzSlaw: मैं इसे गर्व से पहनूंगा। :]
राफेल

1
@gen कुछ चर्चा के लिए stackoverflow.com/a/3274203 देखें । मूल रूप से, यदि व्यक्तिगत रिकॉर्ड बहुत बड़ा है, और यह रैंडम-एक्सेस तरीके से संग्रहीत नहीं है, और डेटा की मात्रा ऐसी है कि इसे इन-प्लेस किया जाना चाहिए, तो बबल सॉर्ट जाने का तरीका है। ये हालात आमतौर पर आजकल दुर्लभ हैं, लेकिन आप अभी भी उनका सामना कर सकते हैं।
पैट्रिक87

16

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

व्यवहार में, आपकी भाषा के मानक पुस्तकालय में छँटाई एल्गोरिथ्म शायद बहुत अच्छा होगा (इष्टतम के बहुत करीब), अगर आपको इन-मेमोरी सॉर्ट की आवश्यकता है। इसलिए, व्यवहार में, मानक पुस्तकालय द्वारा जो भी सॉर्ट फ़ंक्शन प्रदान किया जाता है, उसका उपयोग करें, और चल रहे समय को मापें। केवल अगर आप पाते हैं कि (i) छँटाई समग्र चलने वाले समय का एक बड़ा अंश है, और (ii) चल रहा समय अस्वीकार्य है, तो क्या आपको छँटाई एल्गोरिथ्म के साथ खिलवाड़ करने से परेशान होना चाहिए। उन दो की स्थिति तो करते पकड़, तो आप अपने विशेष डोमेन के विशिष्ट पहलुओं को देखो और अन्य फास्ट सॉर्टिंग एल्गोरिदम के साथ प्रयोग कर सकते हैं।

लेकिन वास्तव में, व्यवहार में, छँटाई एल्गोरिथ्म शायद ही कभी एक प्रमुख प्रदर्शन अड़चन है।


9

इसके अलावा, अपने दूसरे सवाल का जवाब दे

सैद्धांतिक रूप से, क्या यह संभव है कि और भी तेज़ हों?
तो, छँटाई के लिए कम से कम जटिलता क्या है?

सामान्य प्रयोजन छँटाई के लिए, तुलना-आधारित छँटाई समस्या जटिलता n (एन लॉग एन) है । कुछ एल्गोरिदम हैं जो ओ (एन) में छंटनी करते हैं, लेकिन वे सभी इनपुट के बारे में धारणा बनाने पर भरोसा करते हैं, और एल्गोरिदम को छांटने का सामान्य उद्देश्य नहीं है।

मूल रूप से, सरणी को छांटने के लिए आवश्यक तुलनाओं की न्यूनतम संख्या द्वारा जटिलता दी गई है (लॉग एन सरणी के प्रत्येक तत्व की तुलना करते समय निर्मित द्विआधारी निर्णय पेड़ की अधिकतम ऊंचाई का प्रतिनिधित्व करता है)।

आप यहाँ निम्न जटिलता को छाँटने के लिए औपचारिक प्रमाण पा सकते हैं :


3
यह जवाब बिल्कुल सही नहीं है। छँटाई के लिए एक सार्वभौमिक निचली सीमा नहीं है। यह निचला बाउंड केवल तुलना-आधारित प्रकारों पर लागू होता है , अर्थात, एल्गोरिदम को छांटना जो केवल तुलना का उपयोग करते हैं। कुछ सॉर्टिंग एल्गोरिदम तुलना-आधारित नहीं हैं। बयान "कुछ एल्गोरिदम हैं जो ओ (एन) में छंटनी करते हैं, लेकिन वे सभी इनपुट के बारे में धारणा बनाने पर भरोसा करते हैं, और एल्गोरिदम को छांटने का सामान्य उद्देश्य नहीं हैं।" थोड़ा भ्रामक हो सकता है - सावधान रहें। रेडिक्स-सॉर्ट एक सामान्य-उद्देश्य सॉर्टिंग एल्गोरिथ्म है (यह मानते हुए कि आप निश्चित-चौड़ाई पूर्णांक को सॉर्ट कर रहे हैं)। Ω(nlogn)
DW

निर्भर करता है कि आप छँटाई समस्या से क्या मतलब है । सामान्य-उद्देश्य तुलना-आधारित सॉर्ट केवल उन लोगों की छँटाई वाली समस्याएँ नहीं हैं जो लोगों को होती हैं।
पैट्रिक87

1
यह सच है, बिल्कुल। मुझे और अधिक विशिष्ट होना चाहिए था, इसे इंगित करने के लिए धन्यवाद। हालाँकि, मैं थोड़ा उत्सुक था जिस पर अन्य छँटाई वाले दृष्टिकोण (तुलना-आधारित नहीं) जिसका आप जिक्र कर रहे थे; रेडिक्स सॉर्ट बिल्कुल ओ (एन) एल्गोरिथ्म की तरह है जिसके बारे में मैं बात कर रहा था - आपको इनपुट (निश्चित-चौड़ाई पूर्णांक) के बारे में कुछ 'अनुमान' लगाना होगा। इस अर्थ में, यह एक सामान्य-उद्देश्य सॉर्टिंग एल्गोरिथ्म नहीं है, है ना?
rla4

1
@ डीडब्ल्यू: रेडिक्स सॉर्ट को 'सामान्य उद्देश्य' सॉर्टिंग एल्गोरिदम नहीं माना जाना चाहिए, क्योंकि इसके लिए निश्चित लंबाई पूर्णांक कुंजियों की आवश्यकता होती है; क्या यह अन्यथा उपयोगी नहीं है। लेकिन मुझे आपकी बात समझ आ गयी है। :) मुझे लगता है कि मेरी गलती विशेष रूप से पूर्णांक को छाँटने के बजाय तुलना की जा सकने वाली आयिंग पर ध्यान केंद्रित कर रही थी । वे अलग-अलग समस्याएं हैं, और संभावित समाधानों का एक अलग सेट है। प्रश्न "पूर्णांक के एक यादृच्छिक सरणी" का उल्लेख करता है, लेकिन मैं मानता हूं कि मैंने इसे एक प्रतिबंध के बजाय एक उदाहरण के रूप में लिया।
rla4

2
@DavidRicherby, एक-डेढ़ साल बाद इस पर गौर करते हुए, मैं आपसे सहमत हूं। धन्यवाद।
डीडब्ल्यू

3

सबसे खराब स्थिति में सबसे तेजी से पूर्णांक छँटाई एल्गोरिथ्म मैं भर में आया है एंडरसन एट अल। इसमें का सबसे खराब मामला है , जो निश्चित रूप से ( एन लॉग एन ) से तेज है ।O(nloglogn)O(nlogn)


2
यह बहुत दिलचस्प है लेकिन आपको अधिक जानकारी देने की आवश्यकता है। जब से तुम उल्लेख , मुझे लगता है आप जानते हैं कि सामान्य पूर्णांक तुलना आधारित छंटाई provably समय की आवश्यकता है कर रहे हैं Ω ( एन लॉग इन करें n ) । डेटा के बारे में धारणा बनाने से कहीं अधिक तेजी से कुछ भी: उदाहरण के लिए, रेडिक्स सॉर्ट रैखिक समय में चलता है यह मानते हुए कि सरणी का प्रत्येक तत्व कुछ सबसे निरंतर है। यह एल्गोरिथ्म O ( n लॉग लॉग n ) में किस स्थिति में है और यह अन्य एल्गोरिदम जैसे क्विकॉर्ट्स और रेडिक्स सॉर्ट के विरुद्ध अभ्यास कैसे करता है? nlognΩ(nlogn)O(nloglogn)
डेविड रिचरबी

1

मैंने इसे लिखते समय अन्य दो उत्तरों के माध्यम से पढ़ा और मुझे नहीं लगा कि किसी ने आपके प्रश्न का उचित उत्तर दिया। अन्य उत्तर यादृच्छिक वितरण और अंतरिक्ष जटिलता के बारे में विवादास्पद विचारों पर विचार करते हैं जो संभवतः हाई स्कूल की पढ़ाई के दायरे से बाहर हैं। तो यहाँ मेरा लेना है।

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

इसके अतिरिक्त, यदि आप या O ( n ) से परिचित नहीं हैं : दोनों नोटेशन का अर्थ है कि एल्गोरिथ्म को पूरा करने के लिए लगभग n ऑपरेशन होते हैं ( 2 n या 3 n - 5 हो सकते हैं , लेकिन 1 या n 2 ऑपरेशन नहीं) ।Ω(n)हे(n)n2n3n-51n2


हाँ, पर समय चल भी किसी भी तरह लगभग, धोखाधड़ी निरंतर के बाद के सामने है n प्रभावी ढंग से की तरह मापता lg n (जब से तुम एक 32-बिट मशीन मॉडल मानते हैं, और कहा कि संकेत मिलता है कि n 2 32 ) । तो, भले ही हे ( एन ) (मूलांक प्रकार के लिए) लग रहा है एक बहुत की तुलना में बेहतर हे ( एन एलजी n )O(n)nlgnn232O(n)O(nlgn)(Quicksort या mergesort के लिए), व्यवहार में तुलना काफी स्पष्ट नहीं है: big-O अंकन में छिपे हुए स्थिरांक बहुत महत्वपूर्ण हो जाते हैं, और मूलांक-क्रम के लिए निरंतरता quicksort या mergesort की तुलना में अधिक होती है।
DW

" जैसे प्रभावी रूप से एन के सामने निरंतरता " मुझे वास्तव में समझ में नहीं आता कि आप इस वाक्यांश से क्या मतलब है (मैं समझता हूं कि बिग-ओह संकेतन स्थिरांक छुपाता है जो छोटे एन के लिए महत्वपूर्ण हो सकता है )। lg(n)n
बुर्बकि4481472

Ω(n)

2
हे(wn)www{0,,2w1}lognnw=lognnlogn
डेविड रिचेर्बी

1

O(nloglogn)
O(nloglogU)U


0

जैसा कि आपने हार्डवेयर पर किसी भी प्रतिबंध का उल्लेख नहीं किया है और आपको "सबसे तेज़" की तलाश है, मैं कहूंगा कि आपको उपलब्ध हार्डवेयर और आपके पास जिस तरह के इनपुट के आधार पर समानांतर सॉर्टिंग एल्गोरिथ्म में से एक चुनना चाहिए।

सिद्धांत रूप में उदाहरण के लिए quick_sortहै O(n log n)pप्रोसेसर के साथ , आदर्श रूप से यह नीचे आना चाहिए O(n/p log n)अगर हम इसे समानांतर में चलाते हैं।

विकिपीडिया: समय की जटिलता को उद्धृत करने के लिए ...

इष्टतम समानांतर छँटाई हे (लॉग एन)

व्यवहार में, बड़े पैमाने पर इनपुट आकारों O(log n)के लिए स्केलेबिलिटी मुद्दों के कारण इसे प्राप्त करना असंभव होगा ।

यहाँ समानांतर मर्ज के लिए छद्म कोड है । merge()सामान्य मर्ज सॉर्ट में समान रूप से लागू किया जा सकता है:

// Sort elements lo through hi (exclusive) of array A.
algorithm mergesort(A, lo, hi) is
    if lo+1 < hi then  // Two or more elements.
        mid = ⌊(lo + hi) / 2⌋
        fork mergesort(A, lo, mid)
        mergesort(A, mid, hi)
        join
        merge(A, lo, mid, hi)

और देखें:


O(n2)

@ ईविल हां। Quicksort समानांतर प्रसंस्करण के लिए अच्छी तरह से अनुकूल नहीं है। इसका उदाहरण है। जिन लोगों का उपयोग किया जाना चाहिए, वे दिए गए लिंक में सूचीबद्ध हैं।
कश्यप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.