यह एक लंबा पाठ है। कृपया मेरा साथ दें। उबला हुआ, सवाल यह है: क्या एक जगह में काम योग्य रेडिक्स सॉर्ट एल्गोरिथ्म है ?
प्रारंभिक
मुझे बड़ी संख्या में छोटे-छोटे निश्चित स्ट्रिंग्स मिले हैं जो केवल "ए", "सी", "जी" और "टी" (हां, आपने अनुमान लगाया है: डीएनए ) अक्षरों का उपयोग करते हैं, जिन्हें मैं सॉर्ट करना चाहता हूं।
पल में, मैं का उपयोग करें std::sort
जो उपयोग करता introsort के सभी आम कार्यान्वयन में एसटीएल । यह काफी अच्छा काम करता है। हालाँकि, मुझे विश्वास है कि मूलांक मेरी समस्या को पूरी तरह से सेट करता है और व्यवहार में बहुत बेहतर काम करना चाहिए ।
विवरण
मैंने इस धारणा को बहुत भोली कार्यान्वयन के साथ और अपेक्षाकृत छोटे इनपुट के लिए (10,000 के आदेश पर) परीक्षण किया है यह सच था (ठीक है, कम से कम दो बार के रूप में तेजी से)। हालाँकि, समस्या का आकार बड़ा होने पर रनटाइम अपमानजनक रूप से कम हो जाता है ( N > 5,000,000)।
कारण स्पष्ट है: मूलांक की तरह पूरे डेटा की प्रतिलिपि बनाने की आवश्यकता है (वास्तव में मेरे भोले कार्यान्वयन में एक से अधिक बार, वास्तव में)। इसका मतलब है कि मैंने अपनी मुख्य मेमोरी में ~ 4 GiB डाल दिया है जो जाहिर तौर पर प्रदर्शन को मारता है। यहां तक कि अगर यह नहीं था, मैं वास्तव में भी बड़ा हो समस्या आकार के बाद से इस स्मृति का उपयोग करने के लिए बर्दाश्त नहीं कर सकता।
बक्सों का इस्तेमाल करें
आदर्श रूप से, यह एल्गोरिथ्म डीएनए और साथ ही डीएनए 5 (जो एक अतिरिक्त वाइल्डकार्ड वर्ण "एन") की अनुमति देता है, या यहां तक कि आईयूपीएसी अस्पष्टता कोड (जिसके परिणामस्वरूप 16 अलग-अलग मान हैं) के साथ डीएनए के लिए किसी भी स्ट्रिंग लंबाई के साथ काम करना चाहिए । हालाँकि, मुझे एहसास है कि इन सभी मामलों को कवर नहीं किया जा सकता है, इसलिए मैं किसी भी गति सुधार से खुश हूं जो मुझे मिलता है। कोड गतिशील रूप से तय कर सकता है कि किस एल्गोरिथ्म को प्रेषण करना है।
अनुसंधान
दुर्भाग्य से, मूलांक के आधार पर विकिपीडिया लेख बेकार है। इन-प्लेस वैरिएंट के बारे में अनुभाग पूरी तरह से बकवास है। मूलांक पर NIST-पिता अनुभाग प्रकार अस्तित्वहीन के बगल में है। वहाँ एक आशाजनक-लगने वाला कागज है जिसे कुशल एडेप्टिव-इन-प्लेस रेडिक्स सॉर्टिंग कहा जाता है जो एल्गोरिथ्म "एमएसएल" का वर्णन करता है। दुर्भाग्य से, यह कागज भी निराशाजनक है।
विशेष रूप से, निम्नलिखित बातें हैं।
सबसे पहले, एल्गोरिथ्म में कई गलतियाँ हैं और बहुत सारे अस्पष्टीकृत हैं। विशेष रूप से, यह पुनरावर्तन कॉल को विस्तृत नहीं करता है (मैं बस यह मानता हूं कि यह वर्तमान पारी और मुखौटा मूल्यों की गणना करने के लिए कुछ सूचक को घटाता है या कम करता है)। इसके अलावा, यह फ़ंक्शंस का उपयोग करता है dest_group
और dest_address
परिभाषाएँ दिए बिना। मैं यह देखने में विफल हूं कि इनको कुशलता से कैसे लागू किया जाए (जो कि ओ (1) में है; कम से कम dest_address
तुच्छ नहीं है)।
अंतिम लेकिन कम से कम, एल्गोरिथ्म इनपुट सरणी के अंदर तत्वों के साथ सरणी सूचकांकों को स्वैप करके इन-प्लेस-नेस को प्राप्त करता है। यह स्पष्ट रूप से केवल संख्यात्मक सरणियों पर काम करता है। मुझे इसे स्ट्रिंग्स पर उपयोग करने की आवश्यकता है। बेशक, मैं सिर्फ मजबूत टाइपिंग कर सकता हूं और यह मानकर आगे बढ़ सकता हूं कि मेमोरी मेरे स्टोरेज इंडेक्स को बर्दाश्त कर लेगी जहां वह नहीं है। लेकिन यह केवल तब तक काम करता है जब तक मैं अपने तार को 32 बिट मेमोरी (32 बिट पूर्णांक मानकर) में निचोड़ सकता हूं। यह केवल 16 अक्षर है (आइए इस पल के लिए अनदेखा करें कि 16> लॉग (5,000,000))।
लेखकों में से एक अन्य पेपर में कोई सटीक विवरण नहीं दिया गया है, लेकिन यह एमएसएल के रनटाइम को सब-लीनियर के रूप में देता है जो गलत है।
पुनर्कथन करने के लिए : क्या काम के संदर्भ के कार्यान्वयन या कम से कम एक अच्छा छद्मकोड / एक काम करने वाली जगह के रेडिक्स के प्रकार का वर्णन करने की उम्मीद है जो डीएनए तार पर काम करता है?