यह छंटनी एल्गोरिथ्म Θ (n³) और नहीं ² (n,), सबसे खराब स्थिति कैसे है?


52

मैं सिर्फ डेटा स्ट्रक्चर्स और अल्गोरिथम पर एक कोर्स करना शुरू कर रहा हूं और मेरे टीचिंग असिस्टेंट ने पूर्णांक की एक सरणी को छाँटने के लिए हमें निम्नलिखित छद्म कोड दिए हैं:

void F3() {
    for (int i = 1; i < n; i++) {
        if (A[i-1] > A[i]) {
            swap(i-1, i)
            i = 0
        }
    }
}

यह स्पष्ट नहीं हो सकता है, लेकिन यहां उस सरणी का आकार है जिसे हम सॉर्ट करने का प्रयास कर रहे हैं।nA

किसी भी मामले में, शिक्षण सहायक ने कक्षा को समझाया कि यह एल्गोरिथ्म समय (सबसे खराब स्थिति, मुझे विश्वास है) है, लेकिन कोई फर्क नहीं पड़ता कि कितनी बार मैं इसके माध्यम से उलट-पुलट सरणी के माध्यम से जाता हूं, यह मुझे प्रतीत होता है कि यह होना चाहिए, न कि ।Θ ( n 2 ) Θ ( n 3 )Θ(n3)Θ(n2)Θ(n3)

क्या कोई मुझे समझा सकेगा कि यह Θ(n3) और Θ(n2) क्यों नहीं?


आपको विश्लेषण के लिए एक संरचित दृष्टिकोण में रुचि हो सकती है ; अपने आप को एक प्रमाण खोजने की कोशिश करो!
राफेल

बस इसे लागू करें और खुद को समझाने के लिए उपाय करें। उल्टे क्रम में 10,000 तत्वों वाले एक सरणी में कई मिनट लगने चाहिए, और उल्टे क्रम में 20,000 तत्वों के साथ एक सरणी को लगभग आठ गुना अधिक समय लेना चाहिए।
gnasher729

@ gnasher729 आप गलत नहीं हैं, लेकिन मेरा समाधान अलग है: यदि आप अपने को साबित करने की कोशिश करते हैं, तो आप अनिवार्य रूप से विफल हो जाएंगे, जो आपको somethings amiss बताएगा। (बेशक, कोई भी दोनों कर सकता है। परिकल्पना को खारिज करने के लिए प्लॉटिंग / फिटिंग निश्चित रूप से तेज़ है, लेकिन कम विश्वसनीय है । जब तक आप औपचारिक / संरचित विश्लेषण के लिए किसी तरह का काम करते हैं, तब तक कोई नुकसान नहीं होता है। भूखंडों पर भरोसा करना जहां मुसीबत शुरू होता है।)O(n2)
राफेल

1
की वजह से i = 0बयान
njzk2

जवाबों:


60

इस एल्गोरिथम को इस तरह दोबारा लिखा जा सकता है

  1. Aतब तक स्कैन करें जब तक आपको उलटा न हो जाए ।
  2. यदि आप एक पाते हैं, तो स्वैप करें और शुरू करें।
  3. यदि कोई नहीं है, तो समाप्त करें।

अब अधिकांश व्युत्क्रम हो सकते हैं और प्रत्येक को खोजने के लिए आपको एक रैखिक-समय स्कैन की आवश्यकता होती है - इसलिए सबसे खराब स्थिति में चलने का समय । एक सुंदर शिक्षण उदाहरण के रूप में यह पैटर्न-मिलान दृष्टिकोण अप करने के लिए कई succumb यात्रा!(n2)Θ(n2)Θ(n3)

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

जैसा कि @ gnasher729 उपयुक्त टिप्पणी करता है, सबसे खराब स्थिति को देखना आसान है , इनपुट "को छांटते समय चलने वाले समय का विश्लेषण करके है। (हालांकि इस इनपुट शायद नहीं है सबसे खराब स्थिति)।Ω(n3)[1,2,,n,2n,2n1,,n+1]

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


14
यदि आप एक ऐसा सरणी लेते हैं जहाँ पहली छमाही में आरोही क्रम में 1 से n / 2 तक संख्याएँ होती हैं, और दूसरी छमाही n उलट क्रम में n / 2 + 1 तक n होती है, तो यह स्पष्ट है कि आपको कम से कम n / 2 की आवश्यकता है प्रत्येक उलटा खोजने के लिए कदम, और उनमें से (n / 2) ^ 2/2 के बारे में होगा। और यह सबसे अधिक संभावना है कि सबसे खराब स्थिति नहीं है।
gnasher729

@AnthonyRossello यह एक मानक परिणाम (क्रमपरिवर्तन के दहनशास्र में) है। संक्षेप में, उलटे क्रमबद्ध सरणी में व्युत्क्रमों की संख्या की गणना करें (क्या यह स्पष्ट है कि यह सबसे खराब स्थिति है;); यह एक गॉस योग है।
राफेल

किसी को यह याद रखना होगा कि कोई भी बात नहीं, आंशिक रूप से योग हमेशा , यह केवल गुणांक है जो तेजी से गिरता है: (काफी बड़े गुणांक )। मुसीबत यह है, गुणांक के बारे में परवाह नहीं है। Θ(nα)Θ(nα+1)k=0nkα1α+1nα+11α+1Θ
यो

2
@yo 'और यह उत्तर (या प्रश्न) से संबंधित है कैसे?
राफेल

7

इसके बारे में सोचने का एक वैकल्पिक तरीका यह है कि iरीसेट होने से पहले अधिकतम मूल्य क्या हो जाता है। यह, जैसा कि यह पता चला है, यह इस कारण से अधिक सरल बनाता Aहै कि एल्गोरिथ्म के रन समय को कैसे प्रभावित करता है।

विशेष रूप से, देखें कि जब iइसका नया अधिकतम मान सेट किया जाता है, तो इसे N कहते हैं, सरणी [A[0], ..., A[N-1]]को आरोही क्रम में क्रमबद्ध किया जाता है।

तो जब हम A[N]मिश्रण में तत्व जोड़ते हैं तो क्या होता है ?

गणित:

खैर, यह स्थिति पर फिट बैठता है कहने देता है । फिर हमें , पुनरावृत्तियों को स्थानांतरित करने के लिए इसे , और सामान्य रूप से स्थान पर ले जाने के लिए लूप पुनरावृत्तियों की आवश्यकता होगी (जो मैं निरूपित करूंगा )।pNNstepsN1N+(N1)N2

stepsN(pN)=N+(N1)+(N2)++(pN+1)=12(N(N+1)pN(pN+1))

यादृच्छिक रूप से क्रमबद्ध सरणी के लिए, प्रत्येक लिए पर समान वितरण लेता है :pN{0,1,,N}N

E(stepsN(pN))=a=1NP(pN=a)stepsN(a)=a=1N1N12(N(N+1)a(a+1))=12(N(N+1)13(N+1)(N+2))=13(N21)=Θ(N2)

इस राशि को तलहबर के सूत्र या तल पर वुल्फराम अल्फा लिंक का उपयोग करके दिखाया जा सकता है।

सभी लिए एक विपरीत सॉर्ट किए गए सरणी, लिए , और हमें मिलता है:pN=0N

stepsN(pN)=12N(N+1)

वास्तव में, किसी भी अन्य मूल्य से अधिक लंबे समय तक ।pN

पहले से ही छांटे गए सरणी के लिए, और , निचले-क्रम की शर्तें प्रासंगिक हो ।pN=NstepsN(pN)=0

कुल समय:

कुल समय प्राप्त करने के लिए, हम सभी पर कदम उठाते हैं । (अगर हम सुपर सावधान हो रहे थे, तो हम स्वैप के साथ-साथ लूप पुनरावृत्तियों को भी देखेंगे, और शुरू और अंत की स्थितियों का ध्यान रखेंगे, लेकिन यह देखने में आसान है कि वे ज्यादातर मामलों में जटिलता में योगदान नहीं करते हैं) ।N

और फिर से, अपेक्षा की रैखिकता और फौलाबर के फॉर्मूला का उपयोग करते हुए:

Expected Total Steps=E(N=1nstepsN(pN))=N=1nE(stepsN(pN))=Θ(n3)

बेशक, अगर किसी कारण के लिए नहीं है हमेशा (जैसे सरणियों हम पहले से ही बहुत हल कर की जा रही के करीब हैं पर देख रहे हैं के वितरण), तो इस जरूरत नहीं मामला हो। लेकिन इसे प्राप्त करने के लिए पर बहुत विशिष्ट वितरण हैं !stepsN(pN)Θ(N2)pN

प्रासंगिक पढ़ना:


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

अलग + ; मेरा मतलब था लैंडौ वन। Ω
राफेल

3

अस्वीकरण:

यह एक प्रमाण नहीं है (ऐसा लगता है कि कुछ लोग सोचते हैं कि मैंने इसे पोस्ट किया जैसे कि वह था)। यह केवल एक छोटा सा प्रयोग है जिसे ओपी असाइनमेंट के बारे में अपने संदेह को हल करने के लिए कर सकता है:

कोई फर्क नहीं पड़ता कि मैं कितनी बार उलट-पलट कर सरणी के साथ जाता हूं, मुझे लगता है कि यह I होना चाहिए, न कि ।Θ(n2)Θ(n3)

इस तरह के एक सरल कोड के साथ, और बीच का अंतर स्पॉट करने के लिए कठिन नहीं होना चाहिए और कई व्यावहारिक मामलों में यह कूबड़ की जांच करने या उम्मीदों को समायोजित करने के लिए एक उपयोगी दृष्टिकोण है।Θ(n2)Θ(n3)


@ रिपेल ने आपके प्रश्न का उत्तर पहले ही दे दिया, लेकिन सिर्फ kicks के लिए, इस प्रोग्राम के आउटपुट को में करते हुए इस gnuplot स्क्रिप्ट का उपयोग करते हुए और घातांक मानों की और निम्नलिखित प्लॉट का उत्पादन किया () पहला सामान्य पैमाना है और दूसरा लॉग-लॉग पैमाना है):f(x)=axb+cx2.997961668332222.99223727692339

साधारण loglog

मुझे आशा है कि यह मदद करता है¨


2
आप इन मूल्यों के लिए किसी भी फ़ंक्शन को फिट कर सकते हैं। यह भी देखें यहाँ
राफेल

3
@ राफेल यदि आप इस तरह से नाइटपिक नहीं करना चाहते हैं, तो नहीं, आप किसी भी फ़ंक्शन को फिट नहीं कर सकते हैं (उदाहरण के लिए आप किसी भी उचित सटीकता के लिए एक निरंतर कार्य करने में सक्षम नहीं होंगे)। यह एक प्रमाण नहीं है, लेकिन पहले से ही एक उत्तर है जो एक स्केच प्रदान करता है। उपयोगिता के लिए, मैं आपके स्वयं के पोस्ट को उद्धृत कर सकता हूं जिसे आपने लिंक किया था: "मुझे इस बात से सहमत होना होगा कि यह एक बहुत ही उपयोगी दृष्टिकोण है जो कभी-कभी भी अप्रयुक्त होता है"। इसके अलावा, ओपी वह सोचा था कि यह किया जाना चाहिए ने कहा कि के बजाय , तो क्यों प्रयोग करें और देखें कि क्या उसके कूबड़ सही था के लिए नहीं? जारी। Θ(n2)Θ(n3)
dtldarek

2
यह इस बात का प्रमाण देता है कि एल्गोरिथ्म लेकिन प्रश्न पूछता है कि क्यों । यह घटना की व्याख्या के लिए पूछ रहा है, इसकी पुष्टि नहीं। Θ(n3)
डेविड रिचेर्बी

2
@DavidRicherby इसका मतलब यह है कि यह उत्तर उपयोगी नहीं है?
dtldarek

3
@Magicsowon यह एक प्रश्न और उत्तर साइट है, एक मंच नहीं। हम सवाल के जवाब की तलाश कर रहे हैं, इसके बारे में चर्चा नहीं कर रहे हैं।
डेविड रिचेर्बी

3

मान लें कि आपके पास एक सरणी है।

array a[10] = {10,8,9,6,7,4,5,2,3,0,1}

आपका एल्गोरिथ्म निम्नलिखित करता है

Scan(1) - Swap (10,8) => {8,10,9,6,7,4,5,2,3,0,1}  //keep looking at "10"
Scan(2) - Swap (10,9) => {8,9,10,6,7,4,5,2,3,0,1}
...
Scan(10) - Swap(10,1) => {8,9,6,7,4,5,2,3,0,1,10}

मूल रूप से यह सरणी के उच्चतम तत्व के अंत में चला जाता है, और यह करने में कि यह प्रत्येक स्कैन पर प्रभावी ढंग से O(n^2)चालें करते हुए ओवर शुरू करता है .. सिर्फ एक तत्व के लिए। हालाँकि, n तत्व हैं इसलिए हमें इस nबार दोहराना होगा । यह एक औपचारिक प्रमाण नहीं है, लेकिन यह "अनौपचारिक" तरीके से समझने में मदद करता है कि दौड़ने का समय क्यों है O(n^3)


4
यह अन्य उत्तरों पर क्या जोड़ता है? एल्गोरिथ्म क्या करता है इसकी एक व्याख्या पहले से ही दी गई थी, और रनटाइम के लिए आपका तर्क सबसे अच्छा है। (सबसे खराब मामला है नहीं रैखिक व्यवहार करते हैं!)
राफेल

2
कभी-कभी एक ही विचार को कई तरीकों से समझाने के लिए मूल्य होता है (औपचारिकता के साथ, "अंतर्ज्ञान को पंप करने के लिए एक सरल उदाहरण के साथ"), खासकर जब प्रश्न पूछने वाला व्यक्ति क्षेत्र में नया होता है। तो यह मुझे लगता है कि यह क्या जोड़ता है यह एक तरह से प्रस्तुत किया गया है जो अंतर्ज्ञान की सहायता कर सकता है।
DW

जब से मुझे एक झंडे में मेरी टिप्पणी का जवाब मिला (ऐसा मत करो!): "सबसे खराब मामला रैखिक व्यवहार नहीं करता है!" - मेरा मतलब है सबसे खराब स्थिति वाले ऑपरेटर के बीजीय गुण। मोटे तौर पर, आप WorstCase (1 + ... + n) "=" WorstCase (1) + ... + WorstCase (n) का उपयोग कर रहे हैं, लेकिन यह पहचान नहीं है।
राफेल

1
मैं इस क्षेत्र में नया हूं और एक ठोस, वर्तनी-बाहर उदाहरण के साथ एक स्पष्टीकरण प्रदान करने से निश्चित रूप से मुझे समस्या के बारे में अंतर्ज्ञान प्राप्त करने में मदद मिली। अब स्वीकृत समाधान मेरे लिए अधिक मायने रखता है।
vaer-k

0

तर्क सरणी में तत्वों को आरोही क्रम में क्रमबद्ध करता हुआ प्रतीत होता है।

मान लीजिए कि सबसे छोटी संख्या सरणी के अंत में है ([एन])। इसके सही स्थान पर आने के लिए - (n + (n-1) + (n-2) + ... 3 + 2 + 1) संचालन आवश्यक हैं। = ओ (एन 2)।

सरणी O (n2) में किसी एक तत्व के लिए ops आवश्यक हैं। तो, n eements के लिए यह O (n3) है।


5
यह अन्य उत्तरों पर क्या जोड़ता है? एल्गोरिथ्म क्या करता है इसकी एक व्याख्या पहले से ही दी गई थी, और रनटाइम के लिए आपका तर्क सबसे अच्छा है। (सबसे खराब मामला है नहीं रैखिक व्यवहार करते हैं!)
राफेल

महान व्याख्या। यह समस्या पर एक अलग, अधिक सहज परिप्रेक्ष्य प्रदान करता है, अन्य उत्तरों में नहीं बताया गया है। (बहुत कम और समझने में आसान होने का उल्लेख नहीं।)
२५०१

1
@ २५०१ नहीं, यह गलत है। दिजाकस्ट्रा के एल्गोरिथ्म पर इस "अंतर्ज्ञान" का उपयोग करने का प्रयास करें और आपको द्विघात रनटाइम (नोड्स की संख्या में) मिलेगा, जो गलत है।
राफेल

@ रिपेल नहीं, यह सही है, जैसा कि उत्तर में बताया गया है। यह स्पष्टीकरण इस एल्गोरिथम के लिए काम करता है, दूसरों के लिए नहीं। हालांकि यह उनके लिए गलत हो सकता है, यह दावा यह साबित नहीं करता है कि यह इस के लिए गलत है।
२५०१

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