सबसे कुशल निरंतर-अंतरिक्ष छँटाई एल्गोरिथ्म क्या है?


19

मैं int सरणियों के लिए एक छँटाई एल्गोरिथ्म की तलाश कर रहा हूँ जो कि सरणी के आकार के अलावा किसी भी बाइट को आवंटित नहीं करता है, और दो उद्देश्यों के लिए सीमित है:

  1. स्वैप: वर्तमान एक के साथ अगले सूचकांक को स्वैप करें;

  2. MOVE: कर्सर को +1 या -1 इंडेक्स पर ले जाता है;

यही है, आप न 100सिर्फ पड़ोसी इंडेक्स स्वैप कर सकते हैं, और न ही इंडेक्स स्वैप कर सकते हैं , जब आप सिर्फ इंडेक्स स्वैप करते हैं 10। सबसे कुशल एल्गोरिथ्म क्या है - यानी, कुल चालों की कम मात्रा का उपयोग करने वाला?


13
यह अजीब नहीं है, यह एक भौतिक मशीन है जो एक लुओग टेप से चिपकी हुई गाड़ियों की एक सूची को सॉर्ट करेगी जो लुढ़की हुई है। मशीन केवल टेप को आगे या पीछे ले जा सकती है, और केवल पड़ोसी कार्ड स्वैप कर सकती है, कोरस की। असली दुनिया में आप चारों ओर टेलीपोर्ट नहीं कर सकते, इसलिए, उन पर प्रतिबंध है ...
MaiaVictor

2
तो, जब आप कहते हैं कि आप एक एल्गोरिथ्म चाहते हैं जो किसी भी बाइट को सरणी के आकार के अलावा आवंटित नहीं करता है , तो मुझे लगता है कि आप केवल तत्व भंडारण के लिए देखें, है ना? मैं अभी भी काउंटरों और ऐसे आवंटित कर सकता हूं?
डार्कहॉग

5
हा ज़रूर। बेशक। आप कुछ अतिरिक्त संरचनाएँ आवंटित कर सकते हैं। तुम भी पूरे सरणी को आवंटित कर सकते हैं और वास्तव में भारी गणना कर सकते हैं और यह 0 लागत के रूप में गिना जाता है। केवल एक चीज जिसे आपको कम करने की आवश्यकता है वह वास्तविक भौतिक मशीन के SWAP / MOVE की संख्या है, क्योंकि यह धीमा है। बबल सॉर्ट सबसे अच्छा है जिसके साथ मैं आ सकता था, लेकिन मैंने अनुमान लगाया कि बेहतर विकल्प होने चाहिए।
माईविक्टर

1
मुझे नहीं लगता कि ऐसा कोई एल्गोरिथम है। बिना किसी अतिरिक्त मेमोरी के, आपके पास कोई नियंत्रण स्थिति संग्रहीत करने का कोई तरीका नहीं होगा।
राफेल

1
@ एसवीआरएम: हाँ, फिर असीमित रैम और टेप को रैम में कॉपी करने और उस पर मुफ्त में मनमानी गणना करने की क्षमता के साथ, एल्गोरिथ्म "टेप की सभी चालों को लागू करने और सबसे अच्छा लागू करने के लिए" सबसे उपयुक्त है। व्यावहारिक रूप से, लेकिन ऐसा इसलिए है क्योंकि व्यवहार में रनटाइम वर्षों का होगा, 0 नहीं;; अगर इसकी लागत एन में रैम में एन की लंबाई के एक टेप की नकल करने के लिए है, तो भोली जानवर बल इष्टतम नहीं हो सकता है, लेकिन यह एन के भीतर है इष्टतम के। लेकिन इनमें से कोई भी आपकी समस्या के लिए विशिष्ट नहीं है: जब यह कहा जाता है तो कई समस्याओं को एक संगीन एल्गोरिथ्म का उपयोग करके "ऑफ़लाइन" हल किया जा सकता है।
स्टीव जेसप

जवाबों:


13

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


4

किसी सरणी को क्रम देने के लिए आवश्यक आसन्न तत्वों के स्वैप की संख्या सरणी में व्युत्क्रमों की संख्या के बराबर होती है। कुल में n तत्वों के साथ , अधिकांश n * (n-1) / 2 व्युत्क्रम हैं, इसलिए बबल सॉर्ट इस मॉडल में asymptotically इष्टतम संख्या स्वैप देता है।


वास्तव में, बुलबुला सॉर्ट स्वैप की इष्टतम संख्या देगा। हालांकि, प्रत्येक क्रमपरिवर्तन के लिए स्वैप की इष्टतम संख्या करने के कई तरीके हैं, और यह स्पष्ट नहीं है कि कौन सी चाल की कुल संख्या को कम करता है। (बबल सॉर्ट से मेरा मतलब है "सबसे बड़ा गैर-छांटना चुनें और इसे हल करने के अंत में ले जाएँ")
पीटर क्रावचुक

4

हे(n2)

-+

एल्गोरिथ्म जो बूलियन ध्वज का उपयोग नहीं करता है यह जानने के लिए कि क्या हमने किसी तत्व को स्वैप किया है या नहीं, नीचे दिया गया है (मेमोरी के बजाय मशीन की स्थिति में जानकारी रखने की चाल):

Start:
    Do until we are not at the leftmost position (Op 4)
        move left (Op 2b)

Check:
    If we are at rightmost position (Op 3)
        goto Finished:
    If current value is larger than next value (Op 5)
        goto Unfinished:
    move right (Op 2a)
    Repeat Check:

Unfinished:
    If we are at rightmost position (Op 3)
        goto Start:
    If current value is larger than next value (Op 5)
        swap the elements (Op 1) and move right (Op 2a)
    Repeat Unfinished:

Finished:
    The list is sorted now, output it.

एरिक लिपर्ट का समाधान, सूक्ति प्रकार भी काम करता है, क्योंकि मूल रूप से यह दो तरह का बुलबुला प्रकार है।


सम्मिलन के बारे में क्या?
डार्कहॉग

बबल सॉर्ट को कम से कम दो लूप काउंटर की आवश्यकता होती है जो पहले से ही अनुमति से अधिक हैं।
राफेल

1
नहीं, आप बाएं और दाएं जा सकते हैं, और फिर बाएं से दाएं, जब तक कि काउंटर का उपयोग किए बिना कोई परिवर्तन नहीं (जो अधिकतम n गुना है)। यदि कोई परिवर्तन है तो आपको बूलियन ध्वज के लिए अतिरिक्त स्थान की आवश्यकता नहीं है। यदि कोई परिवर्तन होता है तो आप बस दूसरे उप-मार्ग पर जाते हैं, जो ऐसा ही करता है, सिवाय इसके कि वह एक अन्य उप-मार्ग है।
श्रेयांश

1
और हां, मुझे लगता है कि आप दोनों सिरों पर रिक्त पढ़ सकते हैं ताकि आप जान सकें कि यह सूची की शुरुआत या अंत है। इसके अलावा, मुझे लगता है कि हमें वर्तमान और अगले दोनों तत्वों को यह जानने के लिए पढ़ना है कि हमें स्वैप करने की आवश्यकता है या नहीं।
श्रेयांश

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