Я использую C#, и у меня есть три List<int>
(скажем, одинакового размера n и различных элементов). Моя цель — найти элементы, присутствующие во всех трех. Поэтому я мог бы перебрать первый и проверить, есть ли элемент в двух других. Это будет O(n^2). Я мог бы сначала отсортировать два других списка, а затем проверить наличие элементов в них с помощью двоичного поиска. Это будет O(nlogn) (без сортировки). Или я мог бы создать два словаря Dictionary<int, byte>
, где ключом был бы элемент моего списка, а затем проверка элемента была бы O(1) и всего O(n). А как насчет цены создания словаря? Кто-нибудь может сказать, сколько это стоит?
Также, возможно, есть еще более эффективный алгоритм?
HashSet
или LINQ явно лучше. Если бы вы сортировали списки, вы бы не выполняли бинарный поиск, а выполняли бы трехстороннее слияние и сохраняли бы только элементы с дубликатами. Это будет O (n log n) для сортировки и O (n log 3) для слияния. - person Jim Mischel   schedule 28.03.2014