Многое из этого зависит от того, какой тип данных у вас есть. Вы упоминаете сортировку, поэтому я считаю, что элементы сопоставимы. С наборами размеров m
и n
это займет , чтобы отсортировать, и это будет доминировать. (Асимптотически, не имеет значения, выполняете ли вы двоичный поиск или ходите по обоим спискам. Прогулка по обоим спискам должна быть O(m + n)
.) Конечно, если вы используете данные с лучшим алгоритмом сортировки, например целыми числами с radix-sort, вы должен иметь возможность перейти на O(m + n)
.
Использование наборов (как утверждают другие) подразумевает использование хэширования, что, безусловно, сделает вашу проблему проще. Если вы hash все элементы в A (O(m)
) и сохраните все хэши в хэш-наборе в памяти, затем хеш B (O(n)
) и определите, где могут возникнуть столкновения в хэш-наборе. Это становится вопросом для оптимизации: вам нужно оценить классический компромисс скорости. Чем больше ваш хэш, тем быстрее будут проверены столкновения. Это будет работать в O(m + n)
.
Стоит отметить, что вы можете доказать, что любой алгоритм, выполняющий то, что вы просите, будет работать как минимум в m + n
времени, так как все входы необходимо посмотреть.
Только то, что я собирался сказать. Вот, например, модуль наборов Python, где вы можете использовать разницу() или просто оператор «-». http://docs.python.org/library/sets.html – MatrixFrog
Я думаю, он ищет алгоритм, который скрыт. Для этого есть много простых однострочных (думаю, LINQ), но они действительно ничего нам не учат, и мы понятия не имеем, какова их эффективность без чтения документации. – JoshJordan
Два алгоритма для наборов, о которых я знаю, являются наборами хэшей и наборами деревьев. Google или SO искать эти условия. – MatrixFrog