Прежде всего, напишите функцию с именем AreRowsEqual()
, которая сравнивает две строки.Итак, теперь проблема была переформулирована как Find similar elements in 3 arrays
.
Во-вторых, попытайтесь придумать решение, которое было бы наиболее близким к тому, что вы уже знаете, основываясь на предыдущих знаниях: найти равные элементы в двух массивах.Вам нужен двойной вложенный цикл.Итак, чтобы найти равные элементы в трех массивах, вам понадобится тройной вложенный цикл, верно?
Хорошо, теперь вычеркните это как плохое, плохое, плохое решение, потому что его временная сложность составляет O (n ^ 3) .Мы должны быть в состоянии добиться большего успеха.
Подумайте об этом: чтобы элемент был похож во всех трех массивах, сначала он должен быть похожим среди первых двух;затем он должен быть похожим среди следующих двух.Сложность такого алгоритма будет сродни O (x * n) , где x - количество массивов.Намного лучше, верно?(Я не могу точно понять, что O () будет, помочь кому-нибудь?) РЕДАКТИРОВАТЬ: оказывается, это O ((n ^ 2) * (x-1)), что многолучше, чем O (n ^ 3), когда n> x - END EDIT Это, кстати, позволяет забыть о требовании строго 3
массивов и просто рассмотреть количество x
массивов.
Я написал подход, который получил одно голосование, а затем я понял, что это не сработает, и удалил его.Это еще одна попытка, которая, я считаю, сработает:
Создайте двумерный массив целых чисел.Мы будем называть это «матрицей».Эта матрица будет иметь x
столбцов, а количество строк будет числом строк вашего первого массива.(Да, это будет работать, даже если ваши массивы имеют разную длину.) Числа в ячейках этой матрицы будут соответствовать индексам строк.Так, например, после того, как алгоритм, который я описываю, заканчивается, строка { 1, 3, 2 }
в матрице скажет нам, что строка 1 первого массива соответствует строке 3 второго массива и строке 2 третьего массива.Мы будем использовать -1
для обозначения «нет совпадения».
Итак, первый столбец матрицы необходимо инициализировать с индексами всех строк вашего первого массива, то есть с числами 0, 1, 2, ... n
где n
- количество элементов в первом массиве.
Для каждого дополнительного массива заполните его столбец в матрице следующим образом: выполните цикл по каждой строке текущего столбца в матрице и вычислите ячейку следующим образом: если соответствующая ячейка предыдущего столбца была -1
, несите -1
в эту камеру.В противном случае найдите строку в текущем массиве, которая соответствует соответствующей строке предыдущего массива, и, если она найдена, сохраните ее индекс в этой ячейке.В противном случае сохраните -1 в этой ячейке.
Повторите для всех ваших массивов, то есть для всех столбцов в матрице.В конце концов, ваши подходящие строки - это те, которые не имеют -1
в последнем столбце матрицы.
Если вы действительно заботитесь об эффективности, вы можете поступить как Джон Б.предложил и напишите неизменный класс с именем Row
, который инкапсулирует (содержит ссылку на) строку и реализует hashCode()
и equals()
.equals()
здесь можно реализовать с помощью Arrays.deepEquals()
.В Arrays
также может быть какое-то лакомство, называемое deepHashCode()
, иначе вам придется бросить свой собственный.