Я не думаю вы можете сделать это лучше, чем O (N * M), хотя я был бы рад ошибаться.
В таком случае, я бы сделал это:
- Возьмите первый (оставшийся) элемент A.
- Ищите это в (что осталось от) Б.
- Если вы не нашли его в B, переместите его на выход
- Если вы найдете его в B, переместите все от B до совпадения и включите его и отбросьте копию из A.
- Повторяйте выше, пока A не станет пустым
- Переместить все что осталось в B на выход
Если вы хотите обнаружить несовместимые порядки A и B, то удалите «(то, что осталось от)» из шага 2. Найдите весь B и выведите ошибку, если вы обнаружите, что «слишком рано».
Проблема в том, что, учитывая общий элемент A, нет способа искать его в B лучше, чем линейное время (размером B), потому что все, что у нас есть, это тест на равенство. Но ясно, что нам нужно как-то найти совпадения и (это то место, где я немного машу руками, я не могу сразу это доказать), поэтому мы должны проверять каждый элемент A на предмет сдерживания в B. Мы можем избежать множества сравнений потому что порядки двух наборов согласованы (по крайней мере, я предполагаю, что они есть, а если нет, то нет решения).
Таким образом, в худшем случае пересечение списков является пустым, и никакие элементы A не сравнимы по порядку с любыми элементами B. Для установления требуется N * M тестов на равенство, следовательно, предел наихудшего случая.
Для вашего примера задачи A = (1, 2, c, 4, 5, f), B = (a, b, c, d, e, f), это дает результат (1,2, a, б, в, 4,5, д, е, е), что мне кажется хорошим. Он выполняет 24 теста на равенство в процессе (если я не могу сосчитать): 6 + 6 + 3 + 3 + 3 + 3. Слияние с A и B, наоборот, даст (a, b, 1,2, c , d, e, 4,5, f), в данном случае с одинаковым количеством сравнений, поскольку совпадающие элементы в обоих списках имеют одинаковые индексы.
Как видно из примера, операция не может быть повторена. объединение (A, B) приводит к списку с порядком, несовместимым с порядком слияния (B, A). Следовательно, слияние ((слияние (A, B), слияние (B, A)) не определено. В общем случае результат слияния является произвольным, и если вы будете использовать произвольные порядки в качестве основы для новых полных заказов, вы будете генерировать взаимно несовместимые заказы.