У меня есть такая ситуация:
- У меня есть n списки с двойной связью
- Каждый список имеет начало и конец дозорного
- Все списки имеют одинаковые начальный и конечный узлы (не обязательно, но для простоты)
- Списки однородны и могут совместно использовать элементы
Я бы хотел найти частичное упорядочение всех узлов во всех списках n , начиная с начального узла и заканчивая, ну, в конце концов, конечным узлом, так что любой узел, который появляется в nx списки, где x , будут отсортированы относительно других узлов во всех списках, в которых он появляется.
Использование массивов для предоставления примера набора списков:
first = [a, b, d, f, h, i];
second = [a, b, c, f, g, i];
third = [a, e, f, g, h, i];
Очевидно, что одним из возможных ответов будет [a, b, c, d, e, f, g, h, i], но другим допустимым порядком будет [a, b, d, e, c, f, g, h, i].
Я знаю, что - это быстрый алгоритм, чтобы сделать это, кто-нибудь помнит, как это происходит или что яназывается?У меня уже есть несколько медленных версий, но я уверен, что где-то в Кнуте есть намного более быстрая.
(И, прежде чем вы спросите, это не для домашней работы или Project Euler, и я не могу сделатьэто более конкретно. Это является проблемой.)
Редактировать: Я относительно уверен, что частичное упорядочение определяется только до тех пор, пока конечные точки находятся во всех списках и водинаковые позиции (начало и конец).Я не был бы против поиска по линейному времени, чтобы найти эти конечные точки, и если они не могут быть найдены, тогда может возникнуть ошибка.