Я пытаюсь построить последовательность, которая определяет порядок уничтожения объектов. Можно предположить, что циклов нет. Если объект A использует объект B во время его (A) строительства, то объект B все еще должен быть доступен во время уничтожения объекта A. Таким образом, желаемый порядок уничтожения - это A, B. Если другой объект C использует объект B также во время своего (C) -строения, то желаемый порядок - это A, C, B. В общем, пока объект X уничтожен только после всех других объектов, которые использовали этот объект во время их строительства, уничтожение является безопасным.
Если наш порядок уничтожения до сих пор AECDBF, и теперь мы получаем X (мы никогда не знаем заранее, в каком порядке изначально будет происходить построение, оно обнаружено на лету), которое использует C и F во время своего построения, затем мы можем получить новый безопасный порядок, поставив X перед тем, что в данный момент находится ранее в списке, C или F (случается, C). Таким образом, новый порядок будет AB X CDEF.
В контексте примера X связанный список кажется неподходящим, потому что для определения более раннего варианта, C или F, потребовалось бы много линейного сканирования. Массив будет означать медленные вставки, которые будут одним из общие операции. Очередь приоритетов на самом деле не имеет подходящего интерфейса, нет «Вставить этот элемент раньше, какой из этих элементов самый ранний» (мы не знаем правильный приоритет перед рукой, чтобы убедиться, что он вставлен перед элементом с более низким приоритетом и не мешая другим записям).
Все объекты построены, желаемый порядок вычислен, и последовательность будет повторена один раз и разрушена по порядку. Никаких других операций выполнять не нужно (фактически, после использования любой структуры данных для определения порядка ее можно скопировать в плоский массив и отбросить).
Редактировать: Просто чтобы прояснить, первый раз, когда объект используется, когда он построен. Таким образом, если A использует B, то E использует B, когда E пытается использовать B, оно уже было создано. Это означает, что стек не даст желаемый порядок. AB станет ABE, когда мы хотим AEB.
Edit2: я пытаюсь построить порядок «по ходу», чтобы сохранить алгоритм на месте. Я бы предпочел не создавать большую промежуточную структуру, а затем преобразовывать ее в окончательную структуру.
Edit3: я сделал это слишком сложным; p