Упорядочить элементы по определенному правилу
От: sraider http://dvinogradov.blogspot.com
Дата: 30.08.07 17:51
Оценка:
Есть элементы, которые ссылаются друг на друга, например:

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)

Решал так:
переменные: Вход (массив), Выход (последовательность)

пока во Входе есть элементы
    для каждого из элементов во Входе
        если для элемента есть в Выходе все, на кого он ссылается (выясняется двойным вложенным циклом по Выходу и ссылкам от элемента)
            переместить элемент из Входа на Выход
    если ни один элемент не переместили - у нас циклическая зависимость
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.