Это зависит от того, какие ваши ценности и сколько памяти вы готовы потратить на это. В решении 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), поэтому вы вернулись туда, где вы начали.
Являются ли массивы одинаковой длины? Ведется ли упорядочение элементов в массивах? Например, [9, 2, 5] и [5, 2, 9] равны? –
Я уверен, что 'O (n lg n)' это лучшее, что вы можете сделать. – o11c
@ o11c Да, если он не сделает какие-либо другие предположения относительно данных, я считаю, что вы правы. – IdeaHat