2010-06-30 5 views
4

J'ai deux tableaux chaque tableau a certaines valeurs, par exemple:Comparer 2 éléments de deux tableaux en C++

int a[] = {1, 2, 3, 4}; 
int b[] = {0, 1, 5, 6}; 

maintenant je dois comparer les éléments du tableau (a) avec éléments dans le tableau (b) .. si il n'y a aucune correspondance, le programme devrait retourner une erreur ou imprimer "erreur il y a une valeur dupliquée" etc. dans la situation ci-dessus, il devrait retourner une erreur coz a [0] = b [1] parce que les deux sont les mêmes valeurs.

Comment puis-je faire cela ??

+0

Seront-ils toujours triés? –

+0

Les tableaux sont-ils connus pour être triés? –

Répondre

7

Si les tableaux sont ce petit, je voudrais juste faire une approche de la force brutale, et la boucle à travers les deux tableaux:

for (int i=0;i<4;++i) 
{ 
    for (int j=0;j<4;++j) 
    { 
     if (a[i] == b[j]) 
     { 
      // Return an error, or print "error there is a duplicate value" etc 
     } 
    } 
} 

Si vous allez avoir affaire avec de grands tableaux, vous pouvez envisager un meilleur algorithme, cependant, comme ceci est O (n^2).

Si, par exemple, l'un de vos tableaux est trié, vous pouvez rechercher des correspondances beaucoup plus rapidement, en particulier lorsque la longueur de la ou des baie (s) augmente. Cependant, je ne m'occuperai pas de quelque chose de plus élaboré si vos tableaux sont toujours composés de quelques éléments.

+0

+1 pour la mise en garde, soulignant qu'il s'agit d'un algorithme de complexité quadratique et mal adapté pour les grands ensembles de données. – stinky472

+0

merci je viens d'ajouter le drapeau et après la boucle si d'autres statuts et fait :) merci – SolidSnake

3

En supposant que les deux tableaux sont triés, vous pouvez les pas si eux comme ceci:

// int array1[FIRSTSIZE]; 
// int array2[SECONDSIZE]; 
for(int i=0, j=0; i < FIRSTSIZE && j < SECONDSIZE;){ 
    if(array1[i] == array2[j]){ 
     cout << "DUPLICATE AT POSITION " << i << "," << j << endl; 
     i++; 
     j++; 
    } 
    else if(array1[i] < array2[j]){ 
     i++; 
    } 
    else{ 
     j++; 
    } 
} 

Cela devrait avoir la complexité linéaire, mais il ne fonctionne que s'ils sont triés.

2

La solution pour les tableaux triés a déjà été publiée. Si les tableaux ne sont pas triés, vous pouvez construire un ensemble (par exemple std::set ou un ensemble de hachage) sur chacun d'eux et voir si les ensembles sont disjoints. Vous devez probablement stocker des paires valeur-index dans les ensembles pour savoir quel index a été dupliqué (et surcharger les opérateurs de comparaison de façon appropriée). Cela peut donner une complexité O (n log n).

+0

J'aime cette réponse. Je devrais noter: les ensembles de hachage sont implémentés dans TR1. std :: tr1 :: unordered_set, et boost :: unordered_set. TR1 est implémenté dans GCC et Visual Studio, donc std :: tr1 :: unordered_set devrait être "assez standard". En supposant que tout fonctionne avec unordered_set, vous devriez pouvoir le faire dans O (n). – Dragontamer5788

0
//v={1,2,3,4}; vector 
//v1={1,2,3,4} vector 

    bool f=0; 
    if(equal(v.begin(),v.end(),v1.begin())) //compare two vector, if equal return true 
    { 
     f=1; 
    } 

    } 
    if(f==1) 
     cout<<"Yes"<<endl; 
    else cout<<"No"<<endl; 

     enter code here 
Questions connexes