Хеширование - это хорошая идея, в среднем решение будет O (n)
По сути, вы перебираете $ arr и создаете хэш всего массива, а затем сравниваете его с предыдущими хэшами, которые вы видели (это O (1) с использованием isset () или O (m), если быть точным) где m - количество элементов во внутреннем массиве). и если есть столкновение, вы сравниваете фактические элементы массива. обычно столкновение означает, что вы уже видели этот массив, и он является дубликатом, но это не гарантировано. Вот некоторые psuedo PHP, который реализует этот алгоритм.
function mkhash($array = array()) {
$hash = "";
foreach ($array as $element) {
$hash .= md5($element);
}
}
$seen = array();
$newArray = array();
foreach($arr as $elementArray) {
$hash = mkhash($elementArray);
if(!isset($seen[$hash])) {
$newArray[] = $elementArray;
$seen[$hash] = $elementArray;
} else if(count(array_diff($elementArray, $seen[$hash])) > 0) {
$newArray[] = $elementArray; //this is true if two different arrays hashed to the same element
}
}
Метод хеширования сложнее реализовать, и правильно обрабатывать коллизии довольно сложно, поэтому есть O (nlogn).
O (nlogn) способ сделать это - отсортировать массив
$arr = array_multisort($arr); //O(nlogn)
И тогда все, что вам нужно сделать, это сравнить соседние массивы, чтобы увидеть, являются ли они дубликатами
Конечно, вы можете просто использовать подход O (n ^ 2) и сравнить каждый внутренний массив с любым другим внутренним массивом ...
РЕДАКТИРОВАТЬ: о, и вот еще одна идея O (n), вы можете рекурсивно построить дерево, используя ключи массива, которые сопоставляются с другими массивами, так что вы получите глубокий массив уровня m, где m - самый длинный внутренний массив, который у вас есть , Каждая ветвь дерева представляет собой уникальный внутренний массив. Конечно, вам придется написать некоторый служебный код для преобразования дерева обратно в 2D-массив, так что вы не увидите выигрыша в производительности, пока мощность вашего ввода не станет очень большой!