unordered_map тоже не идеален. Для интереса сравнил с гугловским dense_hash_map. Вставка 10 миллионов чисел, затем их же поиск. Результаты на стареньком ноутбуке с Core i5-3317U 1.7GHz:
Если допустимо изменить порядок элементов во входных массивах, то можно их отсортировать и найти общие элементы за один проход без дополнительной памяти.
С учётом времени на сортировку будет время O(n*log(n)). Немного похуже, чем с хеш-таблицей, но гораздо быстрее, чем решение "в лоб".
На первой стадии алгоритма вместо обычного алгоритма Беллмана-Форда можно использовать его улучшенную версию под названием SPFA: Shortest Path Faster Algorithm.
Хотя в худшем случае (на специально подобранном графе) у него вычислительная сложность такая же, как у обычного Форда-Беллмана, но зато на случайных графах работает во много раз быстрее.
А пишется не сильно сложней: надо добавить очередь (как при поиске в ширину) и ещё булевский массив. В цикле берём очередную вершину из очереди и смотрим на смежные с ней. Если для какой-то из них оценку получается уменьшить, то кидаем вершину в очередь, но только если там её ещё нету (для быстрой проверки наличия в очереди как раз булевский массив и нужен).
unordered_map тоже не идеален. Для интереса сравнил с гугловским dense_hash_map. Вставка 10 миллионов чисел, затем их же поиск. Результаты на стареньком ноутбуке с Core i5-3317U 1.7GHz:
unordered_set - 7.15 секунд
dense_hash_map - 1.75 секунды
У меня на ультрабуке Fujitsu тоже крепление петли ломалась. К счастью, больше ничего не повредилось. Починил суперклеем с содой.
Если допустимо изменить порядок элементов во входных массивах, то можно их отсортировать и найти общие элементы за один проход без дополнительной памяти.
С учётом времени на сортировку будет время O(n*log(n)). Немного похуже, чем с хеш-таблицей, но гораздо быстрее, чем решение "в лоб".
Хотя в худшем случае (на специально подобранном графе) у него вычислительная сложность такая же, как у обычного Форда-Беллмана, но зато на случайных графах работает во много раз быстрее.
А пишется не сильно сложней: надо добавить очередь (как при поиске в ширину) и ещё булевский массив. В цикле берём очередную вершину из очереди и смотрим на смежные с ней. Если для какой-то из них оценку получается уменьшить, то кидаем вершину в очередь, но только если там её ещё нету (для быстрой проверки наличия в очереди как раз булевский массив и нужен).