2014-10-17 4 views
0

Я хочу знать, что представляет собой лучший способ сравнить два несортированные массивы и проверить их, если они имеют равные значения с использованием C++? Я нашел решение в O (nlogn), но есть ли для этого решение O (n)? как, если да?Сравните два целых массива и проверьте, имеют ли они равные значения

Пожалуйста, позвольте мне сказать вам, что это не университетский вопрос, мне нравится знать о решении проблемы ACM.

Спасибо.

+0

Являются ли массивы одинаковой длины? Ведется ли упорядочение элементов в массивах? Например, [9, 2, 5] и [5, 2, 9] равны? –

+3

Я уверен, что 'O (n lg n)' это лучшее, что вы можете сделать. – o11c

+0

@ o11c Да, если он не сделает какие-либо другие предположения относительно данных, я считаю, что вы правы. – IdeaHat

ответ

2

Это зависит от того, какие ваши ценности и сколько памяти вы готовы потратить на это. В решении O (п) для массивов, содержащих уникальных целых чисел х в диапазоне 0 < = х < с, вы могли бы использовать вспомогательный массив char count[c] и сделать что-то вроде этого:

int array1[N]; 
int array2[N]; 

//get the values into array1 and 2 from somehwere 

char count[c]{0}; 
for(size_t i=0; i<N; i++) { 
    count[array1[i]]++; 
    count[array2[i]]++; 
} 

Теперь, два массивы будут равны тогда и только тогда, когда все элементы count равны 0 или 2. Это можно проверить в O (n), снова запустив тот же цикл, только на этот раз count[array1[i]] (и то же самое для array2) равным 2. Такая же методика может быть адаптирована для нескольких других сценариев: например, если значения не являются уникальными, вам нужно подсчитать в двух отдельных массивах, а затем проверить два значения для равенства. Однако, если количество возможных значений слишком велико, вам нужно прибегнуть к сохранению вашей информации («x содержится в массиве») в другой структуре, такой как дерево, где операции находятся в O (n log n), поэтому вы вернулись туда, где вы начали.

+0

Благодарим вас за ответ, но значения не ограничены в диапазоне, например, у нас может быть массив размером 20 с значением 23967! – Mohammad

+1

Ну, другая проблема в том, что (особенно для небольших n, таких как 20), вы действительно не заботитесь о O (...), а об абсолютном времени, в котором оно нуждается. Префакторы, т. Е. A и b в a \ * n и b \ * n \ * log (n), могут значительно варьироваться в зависимости от подхода, поэтому, если вы обычно имеете дело с небольшими массивами, лучше искать наилучший подход для * типичный * размер по абсолютному времени, чем для наилучшего асимптотического поведения. – Oguk

+0

Возможно, мне что-то не хватает, но для меня это не кажется правильным, даже если существует ряд значений. Например, если array1 = [1, 1, 2, 2] и array2 = [3, 3, 4, 4] не будут считаться [0, 2, 2, 2, 2]? Согласно моему чтению вашего решения, это означало бы, что эти два массива равны. EDIT: Я пропустил слово уникальное ... –

Смежные вопросы