O раствор (Н) (BloomFilters):
Вот решение с использованием цветения фильтров (реализация от Гуава)
public static <T> T findCommon_BloomFilterImpl(T[] A, T[] B, Funnel<T> funnel) {
BloomFilter<T> filter = BloomFilter.create(funnel, A.length + B.length);
for (T t : A) {
filter.put(t);
}
for (T t : B) {
if (filter.mightContain(t)) {
return t;
}
}
return null;
}
использовать его как это:
Integer j = Masking.findCommon_BloomFilterImpl(new Integer[]{12, 2, 3, 4, 5222, 622, 71, 81, 91, 10}, new Integer[]{11, 100, 15, 18, 79, 10}, Funnels.integerFunnel());
Assert.assertNotNull(j);
Assert.assertEquals(10, j.intValue());
Запускается в O (N), поскольку вычисление хеш для Integer довольно прямо вперед. Таким образом, все еще O (N), если вы можете уменьшить вычисление хэша ваших элементов до O (1) или небольшого O (K), где K - размер каждого элемента.
O решение (N.LogN) (сортировка и итерация):
Сортировка и итерация по массиву приведет вас к O (N * Log) (N) решение:
public static <T extends Comparable<T>> T findCommon(T[] A, T[] B, Class<T> clazz) {
T[] array = concatArrays(A, B, clazz);
Arrays.sort(array);
for (int i = 1; i < array.length; i++) {
if (array[i - 1].equals(array[i])) { //put your own equality check here
return array[i];
}
}
return null;
}
concatArrays(~)
в O (N) конечно. Arrays.sort(~)
представляет собой двунаправленную реализацию QuickSort со сложностью в O (N.logN), а повторение через массив снова - O (N).
Итак, мы имеем O ((N + 2) .logN) ~> O (N.logN).
В общем случае решение (с условием «внутри k» вашей проблемы) лучше, чем ваше. Его следует рассматривать для k «близко к» N в вашем конкретном случае.
'if (A [i] == B [j])' работает только для примитивных типов. Для ссылочных типов существует разница между равенством и идентичностью. Вы не говорите нам, что именно «A» и «B» точно. – jlordo
Я вижу 2 интерпретации для 'k distance': a) Вы гарантированно, что расстояние между элементом, появляющимся в двух массивах, равно' k' или меньше, или b) Если элемент повторяется, но расстояние больше, чем ' k', не сообщать об этом как повторенном. Эти две интерпретации могут привести к различным реализациям и результатам, какой из них прав? – SJuan76
ok, расстояние между ними k или меньше. – user1841492