Если вы хотите самый быстрый * ответ:
- Сортировать один массив - время равно N log N.
- Для каждого элемента во втором массиве ищите первый. Если вы найдете его, добавьте 1 в сопутствующий массив; в противном случае добавьте 0 - время равно N log N, используя пробел N.
- Для каждого ненулевого отсчета скопируйте соответствующую запись во временный массив, сжав его так, чтобы он все еще сортировался - время равно N.
- Для каждого элемента третьего массива ищите временный массив; когда вы найдете удар, остановитесь. Время меньше чем N log N.
Вот код в Scala, который иллюстрирует это:
import java.util.Arrays
val a = Array(1,5,2,3,14,1,7)
val b = Array(3,9,14,4,2,2,4)
val c = Array(1,9,11,6,8,3,1)
Arrays.sort(a)
val count = new Array[Int](a.length)
for (i <- 0 until b.length) {
val j =Arrays.binarySearch(a,b(i))
if (j >= 0) count(j) += 1
}
var n = 0
for (i <- 0 until count.length) if (count(i)>0) { count(n) = a(i); n+= 1 }
for (i <- 0 until c.length) {
if (Arrays.binarySearch(count,0,n,c(i))>=0) println(c(i))
}
С немного большей сложностью вы можете либо не использовать дополнительное пространство за счет того, чтобы быть еще более разрушительным по отношению к своим исходным массивам, либо вообще не трогать свои исходные массивы за счет другого пространства N.
Редактировать: * как отмечалось в комментариях, хеш-таблицы быстрее для не порочных входных данных. Это «самый быстрый худший случай». Худший случай не может быть настолько маловероятным, если вы не используете действительно хороший алгоритм хеширования, который может съесть больше времени, чем ваш. Например, если вы умножите все свои значения на 2 ^ 16, тривиальное хеширование (т. Е. Просто использование целого числа с битовой маской в качестве индекса) будет сталкиваться каждый раз в списках короче 64k ....