2016-08-12 7 views
-3

Я знаю, что этот тип вопросов повторялся в сообществе, но мой вопрос немного отличается от других.Найти общие элементы в двух массивах в сложность линейного времени

Сегодня я столкнулся с опросом известной компании. Они задали мне два технических вопроса: один из вопросов был ...

Я дал два несортированных массива длины n, они попросили меня найти общие элементы массивов, но с алгоритмом временной сложности O (n) ,

Нет дополнительной поддержки, связанной с языком.

Я показал им алгоритм со сложностью времени O (n * log (n)), но они не были удовлетворены. Я просто хочу знать Если существует какой-либо алгоритм такого рода.

+0

Поместите все элементы в HashSet? – Ordous

+3

Поскольку вставка и поиск хэш-таблицы - это 'O (1)', просто вставьте каждый элемент в хеш-таблицу. Проверьте, что он уже находится в хеш-таблице, если это так, поместите в другой список (который будет вашими общими элементами). Это должно привести к чему-то вроде сложности «2n' (проходя через элементы обоих массивов), которая является« o (n) » –

+0

@RNar Да, это возможно, но для этого потребуется дополнительное пространство, и, как я знаю, хеш-таблицы принимают много места, чем массив. Также они сказали мне, что ** нет языковой поддержки ** для использования. –

ответ

4

Вы можете использовать хэш-карту для хранения всех элементов первого массива (вместе со своим счетчиком для обработки повторяющихся элементов).

Затем пройдите 2-й массив и проверьте, присутствуют ли они в хэш-карте. Идеальная временная сложность будет O(2n). Так как элемент & извлекается из него в O (1) раз.

Вы достигаете временной сложности O (n), но ваш space complexity также становится O (n).

1

Вы можете использовать HashSet (в C++ это будет unordered_multiset), чтобы сохранить элементы первого массива, а затем итерации по второму найти те, которые существуют в HashTable. Поскольку доступ к элементу в среднем имеет постоянную временную сложность, этот алгоритм будет работать в O (n).

0

С помощью комментариев и других ответов я пришел к тому, что не существует никакой возможности сделать это в O (N) без использования HashMap в C++ или набор в Python (Что на самом деле поддержка языка и также увеличивает космическую сложность).

Итак, вот решение в питоне:

list1 = [4,2,5,7,1] 
list2 = [8,2,4,1,6] 

ans = list(set(list1) & set(list2)) 
print 'Common Elements: ',ans 

>>> Common Elements: [1, 2, 4] 
Смежные вопросы