在我试图解决的算法问题中 - 我遇到的情况是我得到了一棵树,我需要选择一个节点作为根,树的高度最小。
有200,000个节点和150,000个边缘。由于时间限制,我需要一个比O(n^2)
更好的算法。
我可以使用什么算法?
答案 0 :(得分:2)
我认为树的中心应该是树的根所需的节点,因为如果根是树的中心,从根到任何节点的最大距离是最小的。
答案 1 :(得分:1)
选择任何节点并假设它是根节点。运行DFS以查找到最远叶子的距离。如果您选择第一个节点作为root,这将基本上计算树的高度。
接下来,通过查找树的中心找到正确的根。要执行此操作,请查看当前根的子项并选择具有最大高度(距离最远叶子的最大距离)的子项。如果将根移动到该子节点,则新高度将介于该节点中已有的值与当前根的其他叶子的下一个最大值之间。你应用它,移动根直到你不能再降低高度。这是树的一个中心(可能更多)和您正在寻找的解决方案。
初始DFS是O(N)。在优化距离时,您无法访问节点两次,每一步都是O(1)摊销,因此总体而言 O(N)。 O(1)摊销,因为一个节点可以有很多孩子,但你只考虑一次(在你移动后你不能再回头所以你不能再检查它们)所以即使你检查整个树你会检查O(N)个孩子。