【发布时间】:2012-01-05 20:55:15
【问题描述】:
我正在寻找一种算法,通过从中删除一条边来拆分具有 N 个节点(每个节点的最大度数为 3)的树,以便结果中的两棵树尽可能接近N/2。如何找到“最居中”的边缘?
树作为算法前一阶段的输入,并作为图输入 - 所以它不平衡,也不清楚哪个节点是根。
我的想法是在树中找到最长的路径,然后选择最长路径中间的边。有用吗?
最理想的情况是,我正在寻找一种解决方案,可以确保两棵树的节点数都不超过 2N / 3 个。
感谢您的回答。
【问题讨论】:
-
如果您没有关于树的布局平衡的数据,您可以从退化树开始(例如,左臂为 100,右臂为 50),最终得到 50/100事后分道扬镳。
-
是的,但是采用长度为 150 的最长路径并采用中间边缘(路径上的第 75 或第 76)会将其分成相等的部分。问题是这样的最优优势是否会一直存在(我不这么认为)。
-
简并树基本上是一个链表。例如唯一有两个孩子的节点是根节点。因此,您将有两条从根部穿过树的路径。左边有 100 个线性节点,右边有 50 个。拆分最长的路径(100 个节点分支)会将 100 拆分为 50/50,加上右分支中的剩余部分,因此您已经将树从 100 /50 到 50/100。
-
对不起,我想你误会了。输入实际上是一个带有非定向边的图,这意味着我打算找到的最长路径是“两个节点之间的最大可能距离”。在一般图中找到最长的路径是 NP 完全的。但是输出图的算法是这样设计的,输出图总是一棵树(不是树数据结构,而是树图)。
-
我不相信你的算法有效。考虑一个完全平衡的三叉树,它有一长串节点进入根。在这种情况下,取最长的路径并在中间点切割会给你完整的三叉树和一个简单的链表。树中的节点将比链表多得多。
标签: algorithm tree graph-theory split longest-path