2015-06-12 4 views
0

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

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

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

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

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

+0

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

+0

@ Давид, сортирующий массив, является порядком величин быстрее, чем вставка и итерация над наборами - просто иметь в виду – BeyelerStudios

+0

@BeyelerStudios Вам не нужно сортировать и перебирать множество, чтобы найти их различия ... – Davide

ответ

0

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

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

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

Из here вы можете видеть, что множество различий является O(len(set)) и объединение O(len(set1) + len(set2)) дает вам решение за линейное время с этой реализацией python set, а не квадратичной, как вы предлагаете.

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

+0

Какова стоимость сборки комплектов? –

+0

Но 'set' не сможет обрабатывать дубликаты? Наличие Collection1: 'E1 E1' и Collection2:' E1' - вывод должен быть таким, как 'E1 отсутствует во второй коллекции' – stuXnet

+0

@stuXnet oh, если это действительно то, что вы хотите, то наборы наиболее определенно находятся за столом. Даже несмотря на то, что во второй коллекции отсутствует символ E1, явно вводит в заблуждение, поскольку «E1» на самом деле находится во втором сборнике ... – Davide

0

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

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

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