Я использую алгоритм Ленгауэра и Тарьяна со сжатием пути для вычисления дерева доминирования для графа с миллионами узлов. Алгоритм довольно сложный, и я должен признать, что я не нашел времени, чтобы полностью понять его, я просто использую его. Теперь мне нужно вычислить деревья-доминанты прямых потомков корневого узла и, возможно, откатить график вниз до определенной глубины, повторяя эту операцию. То есть когда я вычисляю дерево доминирующих для дочернего узла корневого узла, я хочу сделать вид, что корневой узел удален из графа.
Мой вопрос заключается в том, существует ли эффективное решение для этого, которое использует информацию о непосредственном доминирующем элементе, уже рассчитанную в исходном дереве доминирующих для корневого узла? Другими словами, я не хочу начинать с нуля каждого из детей, потому что весь процесс довольно трудоемкий.
Наивно кажется, что это должно быть возможно, так как в глубине графа будет много узлов, чьи идентификаторы находятся чуть-чуть над ними и не подвержены изменениям в верхней части графа.
Кстати, точно так же, как это ни странно: странно, что тема деревьев-доминант "принадлежит" людям, занимающимся компиляцией, и об этом нет упоминаний в книгах по классической теории графов. Приложение, для которого я его использую - мой анализатор кучи Java FindRoots - не связано с теорией компилятора.
Уточнение: я говорю о ориентированных графах здесь. «Корень», на который я ссылаюсь, - это узел с наибольшей достижимостью. Я обновил текст выше, заменив ссылки на «дерево» на «график». Я склонен думать о них как о деревьях, потому что форма в основном подобна дереву. График на самом деле состоит из объектов в куче Java и, как вы можете себе представить, является достаточно иерархическим. Я обнаружил, что дерево доминаторов полезно при анализе утечек OOM, потому что вас интересует «что поддерживает этот объект?» и ответ, в конечном счете, является его доминирующим. Деревья Dominator позволяют видеть дерево, а не деревья. Но иногда много мусора всплывает на вершину дерева, так что у вас есть корень с тысячами детей прямо под ним. В таких случаях я хотел бы поэкспериментировать с вычислением деревьев-доминантных корней у каждого из прямых потомков (в исходном графике) корня, а затем, возможно, перейти на следующий уровень вниз и так далее. (Я стараюсь пока не беспокоиться о возможности обратных ссылок:)