2011-02-09 6 views
5

यादृच्छिक क्रम में पूर्णांक की एक लिंक की गई सूची को देखते हुए, इसे दो नई लिंक्ड सूचियों में विभाजित करें जैसे कि प्रत्येक सूची के तत्वों के योग में अंतर अधिकतम है और सूचियों की लंबाई 1 से अधिक नहीं है (इस मामले में मूल सूची में तत्वों की एक विषम संख्या है)। मैं यह नहीं मान सकता कि सूची में संख्याएं अद्वितीय हैं। और उसके बाद एक पुनरावर्ती समारोह का उपयोग करने के चलने के लिए;एक लिंक्ड सूची को 2 सबसे सूक्ष्म और सबसे बड़ी संख्या वाले 0 सूचियों में विभाजित करें

एल्गोरिथ्म मैं के बारे में सोचा मूल लिंक्ड सूची पर किसी मर्ज प्रकार (लॉग एन) समय, हे (एन) अंतरिक्ष O (n & Middot) करने के लिए था सूची का अंत इसकी लंबाई निर्धारित करने के लिए, विभाजन करने के दौरान रिकर्सिव फ़ंक्शन अनचाहे कर रहा है। रिकर्सिव फ़ंक्शन ओ (एन) समय और ओ (एन) स्थान है।

क्या यह इष्टतम समाधान है? अगर कोई सोचता है कि यह प्रासंगिक है तो मैं अपना कोड पोस्ट कर सकता हूं।

+0

अगर आपका लिंक्ड लिस्ट कार्यान्वयन एक आकार की संपत्ति रखता है, तो आपको केवल आधा रास्ते में कटौती करने के लिए सूची में आधा रास्ता चलना होगा। (हो सकता है कि http://codereview.stackexchange.com देखें!) – Jeremy

+0

@ जेरेमी हेइलर: कोई आकार की संपत्ति नहीं, केवल एक बहुत सादा जेन मूल लिंक्ड सूची है, वास्तव में एक साथ जुड़े नोड्स के गुच्छा से ज्यादा कुछ नहीं। –

+0

जब तक आपकी परीक्षा के लिए आपको इस प्रकार को लागू करने की आवश्यकता नहीं होती है, तो आप सॉर्टिंग करने के लिए Collections.sort का भी उपयोग कर सकते हैं। – karakuricoder

उत्तर

4

नहीं यह इष्टतम नहीं है; आप median of a list in O(n) पा सकते हैं, फिर उनमें से आधे को एक सूची में रखें (औसत या बराबर से छोटा, सूची आकार तक एन/2) और उनमें से आधे किसी अन्य सूची ((एन + 1)/2) में डाल दें। उनका योग अंतर बड़ा किया गया है, और कोई सॉर्ट करने के लिए (हे जरूरत नहीं है (n & Middot;।। लॉग इन करें (एन)) सभी चीजों हे (एन) (स्थान और समय)

+0

आपके द्वारा प्रदान किया गया लिंक इंगित करता है कि यह एल्गोरिदम यादृच्छिक अभिगम सरणी के लिए उपयुक्त है। क्या आप वाकई लिंक्ड सूचियों के लिए काम करते हैं? –

+0

@ रॉबर्ट एस बार्न्स: यदि आवश्यक हो, तो हम पहले सूची को एक सरणी में कॉपी कर सकते हैं और बाद में वापस, अभी भी ओ (एन)। –

+0

इस विश्लेषण के आधार पर एक और बात, http://www.soe.ucsc.edu/classes/cmps102/Spring05/selectAnalysis.pdf मेडियन एल्गोरिदम के मध्य के लिए, यह आवश्यक है कि सरणी में तत्व अद्वितीय हों। मैं यह नहीं मान सकता। –

1

क्यों में किया जाएगा आपको रिकर्सिव फ़ंक्शन की आवश्यकता है? आप सॉर्टिंग सूची की आवश्यकता रखते हैं, तो आप इसे तत्वों को गिन सकते हैं। फिर इसे आधे में विभाजित करें। यह ओ (एन) स्पेस आवश्यकता को छोड़ देता है।

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

+0

I मैं ओ (एन) समय में पहले से ही विभाजित हूँ। यह ओ (एन) स्थान लेता है क्योंकि मैं मूल एलएल की प्रतियां बना रहा हूं। –

संबंधित मुद्दे