Самый эффективный способ печати различий двух массивов?

106
11

Недавно мой коллега спросил меня, как он может проверить равенство двух массивов. У него было два источника Address и он хотел утверждать, что оба источника содержат точно такие же элементы, хотя порядок не имеет значения. И использование Array и подобное List в Java или IList было бы в порядке, но поскольку может быть два одинаковых объекта Address, такие вещи, как Set не могут быть использованы.

В большинстве языков программирования List уже имеет метод equals, сравнивающий (предполагая, что коллекция была заказана до его выполнения), но нет информации о фактических различиях; только, что есть некоторые, или нет.

Вывод должен содержать информацию об элементах, которые находятся в одной коллекции, но не в другом, и наоборот.

Очевидным подходом было бы итерацию через одну из коллекций (если одна из них), а просто вызов contains(element) на другом, а другой - наоборот. Предположим, что сложность O(n) для contains, что приведет к O(2n²), если я прав.

Есть ли более эффективный способ получения информации "А1 и А2 нет в списке1, А3 и А4 нет в списке2"? Существуют ли структуры данных, лучше подходящие для выполнения этой работы, чем списки? Стоит ли сортировать коллекции раньше и использовать пользовательский бинарный поиск?

спросил(а) 2020-03-26T20:30:19+03:00 2 месяца назад
1
Решение
91

Первое, что приходит на ум, - использовать разницу в настройках

В псевдо-питоне

addr1 = set(originalAddr1)
addr2 = set(originalAddr2)
in1notin2 = addr1 - addr2
in2notin1 = addr2 - addr1
allDifferences = in1notin2 + in2notin1

Отсюда вы можете видеть, что разница в настройках - это O(len(set)) а union - O(len(set1) + len(set2)) дает вам линейное временное решение с реализацией определенного set python вместо квадратичного, как вы предлагаете,

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

ответил(а) 2020-03-26T20:45:31.594335+03:00 2 месяца назад
38

Стоит ли сортировать коллекцию [...]?


Сравните наивный подход O(n²) к сортировке двух списков в O(n logn) а затем сравните их в O(n) - или отсортируйте один список в O(n logn) и итерации по другому в O(n)

ответил(а) 2020-03-26T20:30:19+03:00 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема