2012-05-26 25 views
7

मैं How to find a duplicate element in an array of shuffled consecutive integers? पर एक पोस्ट में आया लेकिन बाद में एहसास हुआ कि यह कई इनपुट के लिए विफल रहता है।किसी सरणी में डुप्लिकेट तत्व ढूंढने के लिए एक्सओआर ऑपरेटर का उपयोग कई मामलों में विफल रहता है

पूर्व के लिए:
arr[] = {601,602,603,604,605,605,606,607}

#include <stdio.h> 
int main() 
{ 
int arr[] = {2,3,4,5,5,7}; 
int i, dupe = 0; 
for (i = 0; i < 6; i++) { 
    dupe = dupe^a[i]^i; 
} 
printf ("%d\n", dupe); 
return 0; 
} 

मैं इस कोड ताकि नकली तत्व सभी मामलों के लिए पाया जा सकता है संशोधित कर सकते हैं?

+0

मैं एक पोस्ट जो offsetting के बारे में कहते हैं जो मैं http://stackoverflow.com/questions/8018086/xor-to-find-duplicates-in-an-array किसी को कुछ सुझाव दे सकते हैं समझने के लिए असमर्थ हूँ पर में आए .. ?? – Snehasish

उत्तर

16

मूल प्रश्न से:: आप के बजाय एक स्थानीय चर सरणी के अंतिम सदस्य, कि एक फर्क नहीं पड़ता उपयोग करने के लिए यह बदलाव कर दिया है

मान लीजिए आप 1001 पूर्णांकों की एक सरणी है। पूर्णांक यादृच्छिक क्रम में हैं, लेकिन आप जानते हैं कि प्रत्येक पूर्णांक 1 और 1000 (समावेशी) के बीच है। इसके अलावा, प्रत्येक संख्या केवल एक बार सरणी में दिखाई देती है, एक संख्या को छोड़कर, जो दो बार होती है।

यह मूल रूप से कहते हैं, कि एल्गोरिथ्म ही काम करता है 1 के साथ लगातार पूर्णांकों है जब, शुरू, कुछ एन

के साथ समाप्त होने आप इसे संशोधित करने के लिए और अधिक सामान्य मामले में, आप क्या करना है चाहते हैं निम्नलिखित चीजें:

सरणी में न्यूनतम और अधिकतम खोजें। फिर अपेक्षित आउटपुट की गणना करें (न्यूनतम और अधिकतम के बीच सभी पूर्णांक xor)। फिर सरणी में सभी तत्वों के xor की गणना करें। फिर इन दो चीजों को xor और आप एक आउटपुट मिलता है।

+1

एआर [] = {2, 3, 5, 5, 7} पर विचार करें, फिर न्यूनतम = 2 और अधिकतम = 7 अपेक्षित आउटपुट = 2^3^4^5^6^7 = 1 सरणी में सभी तत्वों का एक्सओआर = 2^3^5^5^7 = 6 एक्सओआर 1 और 6 = 1^6 = 7 !!!!! जो आवश्यक उत्तर नहीं है !!!!! – Snehasish

+2

{2, 3, 5, 5, 7} लगातार तत्वों की एक सरणी नहीं है। अभिसरण का मतलब है कि संख्याएं एक से भिन्न होती हैं, इसलिए यदि कोई डुप्लिकेट किया गया है तो अच्छा इनपुट {2, 3, 3, 4, 5, 6, 7} के लिए है। आपके सामान्य मामले में, कोई आसान समाधान नहीं है। आपको या तो जवाब पाने के लिए यादृच्छिकरण (हैश टेबल) या सॉर्टिंग की आवश्यकता है। – usamec

1

यहां मूल प्रश्न में दिखाया गया कोड है, जो आपके कार्यान्वयन से अलग है।

for (int i = 1; i < 1001; i++) 
{ 
    array[i] = array[i]^array[i-1]^i; 
} 

printf("Answer : %d\n", array[1000]); 
+0

यह उस प्रश्न में दिए गए मामले के लिए काम करता है ... लेकिन परीक्षण मामलों जैसे {1, 2, 10, 11, 5, 6, 8, 5} और {601,602,603,604,605,605,606,607} यह अजीब परिणाम देता है !!!! – Snehasish

7

एक एक्सओआर कथन में संपत्ति है कि 'ए' एक्सओआर 'ए' हमेशा 0 होगा, अगर वे जानते हैं कि आपकी सूची में केवल एक डुप्लिकेट है और यह सीमा x से y कहती है , आपके मामले में 601 से 607, सभी तत्वों के xor को एक चर में x से y रखने के लिए व्यवहार्य है, और फिर इस चर को अपने सरणी में मौजूद सभी तत्वों के साथ xor करें। चूंकि वहां केवल एक तत्व होगा जिसे डुप्लिकेट किया जाएगा, इसे xor ऑपरेशन के कारण रद्द नहीं किया जाएगा और यह आपका उत्तर होगा।

void main() 
{ 
    int a[8]={601,602,603,604,605,605,606,607}; 
    int k,i,j=601; 

    for(i=602;i<=607;i++) 
    { 
     j=j^i; 
    } 

    for(k=0;k<8;k++) 
    { 
     j=j^a[k]; 
    } 

    printf("%d",j); 
} 

यह कोड वांछित के रूप में आउटपुट 605 देगा!

+1

यह तभी काम करता है जब एक्स और वाई के बीच सभी तत्व मौजूद होते हैं। केस एआर पर विचार करें [] = {601, 602, 603, 603, 604, 606} इसे चलाने से अजीब आउटपुट मिलेगा !!!! – Snehasish

+1

जाहिर है, और मैंने अपने जवाब में स्पष्ट किया है! एक्सओआर ऑपरेटर की अपनी कार्यक्षमताएं हैं, आप इसे अपनी इच्छा के अनुसार काम नहीं कर सकते! – Ashwyn

+0

सबसे अच्छा, आपको उन तत्वों को अवश्य पता होना चाहिए जो सरणी में मौजूद हैं, (डुप्लीकेट या नहीं), और उन सभी तत्वों के साथ xor, उदाहरण के लिए, पहले, आप int i = 601^602^603^603^604^606, अब उन तत्वों के साथ एक्सर करें जिन्हें सरणी कहा जाता है (आप अभी भी नहीं जानते कि उनमें से कौन सा डुप्लिकेट किया गया है), यानी, मैं^601^602^603^604^606 है। उत्पादन 603 होना चाहिए! – Ashwyn

1
//There i have created the program to find out the duplicate element in array. Please edit if there are required some changes. 
int main() 
{ 
    int arr[] = {601,602,603,604,605,605,606,607}; 
    //int arr[] = {601,601,604,602,605,606,607}; 
    int n= sizeof(arr)/sizeof(arr[0]); 

    for (int i = 0; i < n; i++) 
    { 
     for (int j = i+1; j < n; j++) 
     { 
      int res = arr[i]^arr[j]; 

      if (res == 0) 
      { 
       std::cout<< "Repeated Element in array = "<<arr[i]<<std::endl; 
      } 
     } 
    } 
    return 0; 
} 

// या आप HashTable और हैश समारोह का उपयोग कर सकते हैं जब आप उस समय आप गिनती कर सकते हैं अगर इसके एक से अधिक
HashTable की विशेष सूचकांक में एक मूल्य तो हैश तालिका में एक ही
मान दर्ज आप कह सकते हैं कि सरणी में दोहराया गया मूल्य है।