Недавно мой коллега спросил меня, как он может проверить равенство двух массивов. У него было два источника Address
и он хотел утверждать, что оба источника содержат точно такие же элементы, хотя порядок не имеет значения. Оба использования Array
или как List
в Java, или IList
было бы в порядке, но так как может быть два равных Address
объектов, вещи, такие как Set
s не могут быть использованы.Самый эффективный способ печати различий двух массивов?
В большинстве языков программирования List
уже имеет метод equals
, выполняющий сравнение (при условии, что коллекция была заказана до его выполнения), но нет информации о фактических различиях; только, что есть некоторые, или нет.
Результат должен содержать информацию об элементах, находящихся в одной коллекции, но не в другом, и наоборот.
Очевидным подходом было бы перебрать одну из коллекций (если один из них), и просто вызвать contains(element)
на другом, а затем сделать это наоборот. Предполагая сложность O(n)
для contains
, это приведет к O(2n²)
, если я прав.
Есть ли более эффективный способ получения информации «А1 и А2 нет в списке1, А3 и А4 нет в списке2»? Существуют ли структуры данных, лучше подходящие для выполнения этой работы, чем списки? Стоит ли сортировать коллекции раньше и использовать пользовательский бинарный поиск?
Проблемы вы описываете, кажется, подходит с помощью наборов , Не отбрасывайте их, поскольку они могут быть довольно эффективными и удобными в использовании. Я ответил еще на несколько вопросов. – Davide
@ Давид, сортирующий массив, является порядком величин быстрее, чем вставка и итерация над наборами - просто иметь в виду – BeyelerStudios
@BeyelerStudios Вам не нужно сортировать и перебирать множество, чтобы найти их различия ... – Davide