Объединить отсортированные подсписки с отсортированным суперлистом

#java #algorithm #list #sorting #sortedlist

#java #алгоритм #Список #сортировка #сортированный список

Вопрос:

У меня есть список из n отсортированных списков с m элементами (строками) в каждом. Эти элементы происходят из списка с определенным порядком, который я не знаю. Я знаю, что все подсписки поддерживают глобальный порядок элемента. Списки не являются непересекающимися. Объединение списков является подмножеством исходного списка.

Теперь я изо всех сил пытаюсь найти алгоритм, который эффективно объединил бы их обратно в список (списков) с максимальной точностью сортировки.

Есть ли решение для такой проблемы?

Я использую Java, вот несколько примеров кода:

 List<List<String>> elements = new ArrayList<>();

elements.add(Lists.newArrayList("A","D","F"));
elements.add(Lists.newArrayList("B","D","E"));
elements.add(Lists.newArrayList("A","B","G"));
elements.add(Lists.newArrayList("C","D","H"));

// the required method
List<List<String>> sorted = sortElements(elements);

/* expeced output:
 * [["A"],["B"],["C"],["D"],["G","F","E","H"]]
 */
  

Ответ №1:

Вы ищете топологическую сортировку.

Ваши исходные списки представляют собой направленные дуги графа (A-> D, D-> F и т. Д.)

P.S. Специальный вид топологической сортировки для явного разделения узлов по уровням называется в русской литературе «Алгоритмом демокрона», но мне не удалось найти правильное описание на английском языке (найдены ссылки на статьи по рисованию плоских графов)

Пример его работы:

введите описание изображения здесь

введите описание изображения здесь