मुझे लगता है कि मेरे पास ओ (एन एलजी यू) एल्गोरिदम है, जहां यू सबसे बड़ी संख्या है। विचार उपयोगकर्ता 9 4 9 300 के समान है, लेकिन थोड़ी अधिक जानकारी के साथ।
अंतर्ज्ञान निम्नानुसार है।जब आप अधिकतम संख्या प्राप्त करने के लिए दो नंबरों को एक साथ जोड़ रहे हैं, तो आप उच्चतम संभावित स्थिति पर 1 चाहते हैं, और उसके बाद जोड़ी इस स्थिति में 1 है, तो आप अगले में 1 के साथ एक जोड़ी चाहते हैं संभव उच्चतम स्थिति, आदि
तो एल्गोरिदम निम्नानुसार है। संख्याओं में कहीं भी उच्चतम 1 बिट ढूंढकर शुरू करें (आप ओ (एलजी यू) प्रत्येक एन संख्याओं के अनुसार ओ (एलजी यू) काम करके समय में ऐसा कर सकते हैं। अब, सरणी को दो टुकड़ों में विभाजित करें - उन संख्याओं में से एक जिनमें उस बिट में 1 है और समूह उस बिट में 0 है। किसी भी इष्टतम समाधान को उस स्थान पर 0 के साथ पहले स्थान पर एक नंबर के साथ एक संख्या जोड़नी चाहिए, क्योंकि उस स्थान पर 0 बिट जितना अधिक होगा। किसी भी अन्य जोड़ी में 0 है।
अब, संक्षेप में, हम 1 और 0 समूह से संख्याओं की जोड़ी ढूंढना चाहते हैं जिनमें उनमें से सबसे ज्यादा 1 है। ऐसा करने के लिए इन दोनों समूहों की, उन्हें चार समूहों में विभाजित: 11
नंबर के साथ शुरू 10
नंबर के साथ शुरू
- नंबर 01
- नंबर के साथ शुरू 00
के साथ शुरू यदि 11 और 00 समूह में या 10 और 01 समूहों में कोई संख्या है, तो उनका एक्सओआर आदर्श होगा (11 से शुरू होगा)। नतीजतन, यदि समूहों के उन जोड़े में से कोई भी खाली नहीं है, तो उन समूहों से आदर्श समाधान की पुनरावृत्ति गणना करें, फिर उन उपप्रोबम समाधानों में से अधिकतम को वापस करें। अन्यथा, यदि दोनों समूह खाली हैं, तो इसका मतलब है कि सभी संख्याओं में उनकी दूसरी स्थिति में एक ही अंक होना चाहिए। नतीजतन, 1 से शुरू होने वाली संख्या का इष्टतम एक्सओआर और 0 से शुरू होने वाला नंबर अगले दूसरे बिट को रद्द कर देगा, इसलिए हमें केवल तीसरे बिट को देखना चाहिए।
- को देखते हुए समूह 1 और समूह 0 और थोड़ा सूचकांक मैं:
-
यह निम्न पुनरावर्ती एल्गोरिदम कि, उनके MSB से विभाजित संख्या के दो समूहों के साथ शुरू कर देता है, इस सवाल का जवाब देता है यदि बिट इंडेक्स बिट्स की संख्या के बराबर है, तो 1 समूह में (अद्वितीय) संख्या का एक्सओआर और 0 समूह में (अद्वितीय) संख्या लौटाएं।
- उन समूहों से समूह 11, 10, 01, और 00 का निर्माण करें।
- यदि समूह 11 और समूह 00 अपरिवर्तनीय हैं, तो मैं दो समूहों से अधिकतम एक्सओआर को दोहराता हूं I + 1.
- यदि समूह 10 और समूह 01 अस्वीकार्य हैं, तो उन दो समूहों के अधिकतम XOR को पुनः मिलाकर, बिट I + 1.
- से शुरू होने पर यदि उपर्युक्त जोड़ों में से कोई भी संभव था, तो रिकर्सन द्वारा प्राप्त अधिकतम जोड़ी को वापस करें।
- अन्यथा, संख्या के सभी स्थिति मैं में एक ही सा है, तो पाया अधिकतम जोड़ी लौट बिट को देखकर चाहिए i + 1 समूह 1 पर और 0.
शुरू करने के लिए एल्गोरिदम, आप वास्तव में शुरुआती समूह से संख्याओं को दो समूहों में विभाजित कर सकते हैं - एमएसबी 1 के साथ संख्याएं और एमएसबी 0 के साथ संख्याएं। फिर आप उपरोक्त एल्गोरिदम को संख्याओं के दो समूहों के साथ एक रिकर्सिव कॉल को आग लगाना चाहते हैं।
उदाहरण के तौर पर, संख्या 5 1 4 3 0 2 पर विचार करें।
101 100
001 011 000 010
अब, हम उपरोक्त एल्गोरिथ्म लागू होते हैं: इन प्रतिवेदनों
101 001 100 011 000 010
हम उन्हें 1 समूह में विभाजित करके शुरू और 0 समूह है। हम 11 समूहों, 10, 01 में इस विभाजित है, और 00:
11:
10: 101 100
01: 011 010
00: 000 001
अब, हम 00 तत्वों के साथ किसी भी 11 तत्वों युग्मित नहीं किया जा सकता है, तो हम सिर्फ 10 और 01 समूहों पर recurse। इसका मतलब यह है कि हम 100, 101, 010, और 011 समूहों का निर्माण: उन्हें में सिर्फ एक तत्व के साथ बाल्टी के लिए नीचे अब हम कर रहे हैं कि
101: 101
100: 100
011: 011
010: 010
, हम बस जोड़े जाँच कर सकते हैं 101 और 010 (जो 111 देता है) और 100 और 011 (जो 111 देता है)। या तो विकल्प यहां काम करता है, इसलिए हमें लगता है कि इष्टतम उत्तर 7 है।
आइए इस एल्गोरिदम के चलने वाले समय के बारे में सोचें। ध्यान दें कि अधिकतम रिकर्सन गहराई ओ (एलजी यू) है, क्योंकि संख्याओं में केवल ओ (लॉग यू) बिट्स हैं। पेड़ में प्रत्येक स्तर पर, प्रत्येक संख्या बिल्कुल एक रिकर्सिव कॉल में दिखाई देती है, और प्रत्येक रिकर्सिव कॉल 0 और 1 समूहों में संख्याओं की कुल संख्या के अनुपात में काम करती है, क्योंकि हमें उन्हें अपने बिट्स द्वारा वितरित करने की आवश्यकता होती है। नतीजतन, रिकर्सन पेड़ में ओ (लॉग यू) स्तर हैं, और प्रत्येक स्तर ओ (एन) काम करता है, जो ओ (एन लॉग यू) का कुल काम देता है।
आशा है कि इससे मदद मिलती है! यह एक भयानक समस्या थी!
एक अच्छा शर्त के सबसे बड़े और सबसे छोटा मान ले जा रहा है के बाद से छोटे मूल्य के बिट्स फिर 'नष्ट' 'अच्छा' उच्च उच्च के टुकड़े की संभावना नहीं है:
यहाँ सी ++ उपरोक्त एल्गोरिथ्म के कार्यान्वयन है xor प्रक्रिया के दौरान मूल्य। –
arr = {8,4,2} उत्तर के लिए असफल 8^4 और 4 छोटा नहीं है ... –
@ 500-आंतरिक सर्वर त्रुटि: यह निश्चित रूप से संख्याओं की एक जोड़ी होगी, जिनमें से एक शीर्ष बिट सेट है और दूसरे ने इसे रीसेट कर दिया है। –