2010-10-28 18 views
7

संभव डुप्लिकेट:
Quickest way to find missing number in an array of numbersट्रिकी एल्गोरिथ्म प्रश्न

इनपुट: अवर्गीकृत सरणी एक [1, .., एन] जो सभी रेंज 0 में पूर्णांक में से एक है, लेकिन होता है, .., एन

समस्या हे (एन) समय में लापता पूर्णांक निर्धारित करने के लिए है। एक के प्रत्येक तत्व बाइनरी में प्रतिनिधित्व किया है, और केवल आपरेशन उपलब्ध समारोह बिट (i, j) है, जो एक [i] और ले जाता है निरंतर समय की JTH बिट का मान देता है।

कोई भी विचार? मुझे लगता है कि कुछ प्रकार के विभाजन और जीत एल्गोरिदम उचित होगा, लेकिन मैं नहीं सोच सकता कि मुझे वास्तव में क्या करना चाहिए। अग्रिम में धन्यवाद!

+5

n (n + 1)/2 - योग;) – AraK

+0

हैं बिट (i, j) ही आपरेशन उपलब्ध है, आप कैसे एक विभाजन और जीत एल्गोरिथ्म को लागू करने का प्रस्ताव करते हैं? –

+0

@ ए। रेक्स: आपके द्वारा लिंक किए गए संभावित डुप्ले में निर्देशों पर समान प्रतिबंध नहीं है, इसलिए मुझे नहीं लगता कि यह आवश्यक रूप से एक डुप्ली है। –

उत्तर

9

यह एक गणितीय संपत्ति है कि 1 और n के बीच संख्याओं का योग जहां nn(n+1)/2 है। आप 10 के लिए देख सकते हैं:

1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 
= (1+10) + (2+9) + (3+8) +(4+7) + (5+6) 
= 11 + 11 + 11 + 11 + 11 
= 55 

तो, विस्तार से, 0n के माध्यम से संख्याओं का योग के बाद से आप सिर्फ यह करने के लिए 0 जोड़ रहे है। तो आप जो करते हैं वह सभी संख्याओं को जोड़ता है और गिनती बनाए रखता है, फिर लापता व्यक्ति को समझने के लिए उस सूत्र का उपयोग करें।

तो, की तरह कुछ:

count = 0 
sum = 0 
foreach num in list: 
    sum = sum + num 
    count = count + 1 
missing = count * (count+1)/2 - sum 

bit(i,j) साथ नंबर हो रही है तो आप व्यक्तिगत रूप से बिट्स निकालें और उन्हें संक्षेप के लिए वास्तविक संख्या में बदलने के लिए होगा मुश्किल है।

+0

यह ए के सभी एन लॉग एन बिट्स को पढ़ता है, इसलिए इसमें एन लॉग एन समय लगता है। –

+1

@ रीड: नहीं, यह बिल्कुल लॉग नहीं है। आप पूर्णांक की संख्या _and_ की संख्या दोनों के लिए n का उपयोग नहीं कर सकते हैं। एक पूर्णांक में बिट्स की संख्या _constant_ है इसलिए यह प्रभावी रूप से 'ओ (32 एन) '(32-बिट संख्या के लिए) है जो' ओ (एन) 'जैसा ही है। – paxdiablo

+0

मुझे यकीन है कि ओपी "पूर्णांक" लिखता है, उनका मतलब है "पूर्णांक", "2^32 से कम पूर्णांक" नहीं। अन्यथा, केवल बहुत ही संभावित इनपुट हैं, इसलिए एसिम्प्टोटिक रनटाइम के बारे में बात करना समझ में नहीं आता है। स्पष्ट रूप से बिट्स में एक वास्तविक गणितीय पूर्णांक की लंबाई स्थिर नहीं है। –

0

यह एक चाल सवाल है, इसलिए बिट विधि का उपयोग करने के लिए केवल प्रत्येक संख्या के लिए प्रत्येक बिट चक्र की आवश्यकता होगी, जिसका अर्थ है कि यह स्वचालित रूप से ओ (एन * जे) बन जाएगा जहां जे एन का प्रतिनिधित्व करने वाली बिट्स की संख्या है।

मुझे लगता है कि paxdiablo की समझ में आ गया, यह मानते हुए आप एक समाधान है जो बिट विधि का उपयोग नहीं करता अनुमति होती है।

+3

नील, जो अभी भी तकनीकी रूप से 'ओ (एन)' होगा, क्योंकि 'जे' स्थिर है। – paxdiablo

+0

जे अभ्यास में निरंतर है क्योंकि पूर्णांक या लम्बाई की लंबाई हमेशा समान होती है, हालांकि एन * 2 के साथ जे वृद्धि के महत्वपूर्ण अंक जहां n> 0. ओ (लॉग एन) की तरह अधिक है। – Neil

6

आप इसके अलावा की तुलना में अपने तेजी के रूप में XOR ऑपरेटर इस्तेमाल कर सकते हैं। चूंकि आपके पास प्रत्येक बिट तक पहुंच है, इसलिए आप यहां थोड़ी सी एक्सओआर कर रहे होंगे। सिद्धांत यहां इस्तेमाल किया जा रहा है (ए XOR बी XOR ए) = बी

उदाहरण के लिए: (1 XOR 2 XOR 3) XOR (1 XOR 2) = 3

for i=0 to n 
{ 
Total=Total XOR i 
} 

foreach element in A 
{ 
Total=Total XOR element 
} 
+0

वास्तव में, यह सुंदर निफ्टी है, +1। आप _sure_ नहीं हो सकते हैं कि एक्सओआर अतिरिक्त से अधिक तेज होगा लेकिन यह दो सबसे अधिक/एक-एक (उदाहरण के लिए, '91 91 82 82 73 64 64 55 55') में भिन्न परिवर्तन है जो एक्सओआर का उपयोग करता है सिंगलटन खोजने के लिए। – paxdiablo

+1

एक्सर एडिशन से धीमा कभी नहीं होगा ... क्यों: इसके अलावा एक कैरियोवर बिट है जिसके लिए एक पूर्ण योजक एक चरण जोड़ना आवश्यक है ... यह आधुनिक वास्तुकला में समानांतर एडर्स का उपयोग करके समाप्त हो गया है जिसमें लगभग समान प्रदर्शन होता है (xor उपयोग करता है इस ऑपरेशन पर 1 गेट कम) – Mulki

+0

1 से एन के एक्सओआर के लिए ओ (1) फॉर्मूला है। http://stackoverflow.com/questions/3932346/direct-formula-for-summing-xor। एक्सओआर अतिप्रवाह मुद्दों से भी बचाता है। –

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