2010-06-30 3 views
4

у меня есть два массива каждый массив имеет несколько значений, например:Сравните 2 элементы двух массивов в C++

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

теперь нужно сравнивать элементы массива (а) с элементами массива (б) .. Если есть какое-либо совпадение, программа должна вернуть ошибку или напечатать «ошибка есть дублирующее значение» и т. Д. в вышеуказанной ситуации, она должна вернуть ошибку coz a [0] = b [1], поскольку оба имеют одинаковые значения.

Как это сделать?

+0

Будут ли они всегда сортироваться? –

+0

Известны ли сортировки массивов? –

ответ

7

Если массивы этого мало, я бы просто сделать грубую силу подхода, и проходной оба массивов:

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 
     } 
    } 
} 

Если вы собираетесь иметь дело с большими массивами, вы можете рассмотреть вопрос о лучший алгоритм, однако, поскольку это O (n^2).

Если, например, один из ваших массивов отсортирован, вы можете проверить совпадения намного быстрее, особенно по мере увеличения длины массива. Я бы не стал беспокоиться о чем-то более сложном, хотя, если ваши массивы всегда будут всегда содержать несколько элементов.

+0

+1 для оговорки, указывая, что это алгоритм квадратичной сложности и плохо подходит для больших наборов данных. – stinky472

+0

спасибо, что я только что добавил флаг и после петли , если другие статусы и сделано :) спасибо – SolidSnake

3

Предполагая, что оба массива сортируются, вы можете шаг их, хотя их так:

// 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++; 
    } 
} 

Это должно иметь линейную сложность, но она работает только тогда, когда они сортируются.

2

Решение для отсортированных массивов уже опубликовано. Если массивы не отсортированы, вы можете построить набор (например, std::set или хэш-набор) из каждого и посмотреть, не пересекаются ли множества. Вероятно, вам придется хранить пары значений в наборах, чтобы выяснить, какой индекс был дублирован (и соответственно перегрузить операторы сравнения). Это может дать O (n log n) сложность.

+0

Мне нравится этот ответ. Я должен отметить: хэш-множества реализованы в TR1. std :: tr1 :: unordered_set и boost :: unordered_set. TR1 реализуется как в GCC, так и в Visual Studio, поэтому std :: tr1 :: unordered_set должен быть «достаточно стандартным». Предполагая, что все работает с unordered_set, вы должны иметь возможность сделать это в 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