Есть элементы, которые ссылаются друг на друга, например:
e1, e2 — не ссылаются ни на кого
e3 — ссылается на e1 и e5
e4 — ссылается на e1, e3 и e5
e5 — ссылается на e1
Нужно упорядочить элементы таким образом, чтобы для каждого из них те элементы, на которые он ссылается, стояли до него.
Для приведенного выше случая это [e1,e2,e5,e3,e4], или [e2,e1,e5,e3,e4], или [e1,e5,e2,e3,e4] и т.п.
Как это сделать максимально быстро? И попутно выяснить нет ли циклических зависимостей.
Решение "в лоб" дало мне что-то около O(N^4)
Решал так:
переменные: Вход (массив), Выход (последовательность)
пока во Входе есть элементы
для каждого из элементов во Входе
если для элемента есть в Выходе все, на кого он ссылается (выясняется двойным вложенным циклом по Выходу и ссылкам от элемента)
переместить элемент из Входа на Выход
если ни один элемент не переместили - у нас циклическая зависимость