Я ищу способы поддерживать относительно сбалансированное остовное дерево графа, так как я добавляю новые узлы / ребра графа.
У меня есть неориентированный граф, который начинается как один узел, «корень».
На каждом шаге я добавляю к графу либо новый узел и ребро, соединяющее его с графом, либо просто новое ребро, соединяющее два старых узла. По мере роста графика я поддерживаю связующее дерево. В большинстве случаев это означает, что когда я добавляю новый узел и ребро, я устанавливаю новый узел как дочерний узел старого узла, к которому он подключается.
У меня нет контроля над порядком, в котором добавляются новые узлы, поэтому приведенный выше алгоритм построения дерева может привести к несбалансированным связующим деревьям.
Кто-нибудь знает об онлайн-эвристике, которая будет поддерживать связующее дерево «относительно сбалансированным», в то же время сводя к минимуму объем работы, выполняемой при повторном формировании дерева? У меня есть полный контроль над древовидной структурой. То, что я не контролирую, это связность графа или порядок добавления новых узлов.
Обратите внимание, что стандартные ответы Google на такие термины, как «сбалансированный», «охват» и «дерево», представляются двоичными деревьями и B-деревьями, которые ни к чему не относятся. Мои узлы графа могут иметь любое количество соседей, поэтому узлы дерева могут иметь любое количество дочерних элементов, а не 2, как двоичные деревья. B-деревья поддерживают баланс, изменяя их списки смежности, и я не могу изменить связность графа.