@makaleks

Как выполнить сортировку слиянием списков несравнимых элементов?

На вход подаются списки несравнимых элементов. В каждом списке задаётся положение одного элемента относительно другого. На выходе нужен отсортированный список всех элементов, вроде такого:
# Для наглядности пусть будет алфовит
< [a   c   e]
<       [d e f]
< [a b   d]
<   [b c d]

> [a b c d e f]

При возникновении противоречия пусть используется более раннее правило.

Как называется эта задача, но главное - как решается? Есть некоторые мысли, но это надо вести зависимые и независимые списки (как если бы подавалось в порядке [a b],[c d], и гадай кто спереди кто сзади) или для каждого элемента заводить список каких элементов он больше или меньше - но кажется я переусложняю и, как обычно, можно проще. При необходимости поправлю формулировки.

Спасибо
  • Вопрос задан
  • 73 просмотра
Решения вопроса 1
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
Что значит, несравнимых элементов? Типа, вы знаете, что элементы каждого списка строго упорядочены, но про разные элементы из разных списков ничего сказать не можете, только если косвенно?

Наверно, это задача на сортировку при частичном порядке.
Решается через топологическую сортировку графа. Для каждой "буквы" заведите вершину. Проведите направленные ребра между каждой парой соседних элементов в каждом списке. Топологически отсортируйте граф. Работает за линейную сложность.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы