繁体   English   中英

树或图收缩

[英]Tree or Graph contraction

我目前正在使用Python解决“树摘要”问题。 我的树由具有权重和子级的节点组成。 一个例子

Node(
    name: "Parent", weight: 20, children: {[
        Node(name: "Child 1" weight: 10, children: {[]},
        Node(name: "Child 2", weight: 10, children: {[
           Node(name: "Grandchild 1", weight: 5, children: {[]}
        ]}
     ]})

我对找到所有可以通过边缘收缩获得的图感兴趣。 当我收缩两条边时,旧顶点将替换为权重为旧顶点总和的新顶点。 例如,将子代2与孙子1签约将导致:

Node(
    name: "Parent", weight: 20, children: {[
        Node(name: "Child 1" weight: 10, children: {[]},
        Node(name: "(Child 2, Grandchild 1)", weight: 15, children: {[]}
     ]})

当然,这只是一种可能的边缘收缩。 即使对于这棵小树,也会有更多的收缩(例如(child 1, child 2)(child 1, parent)(child 2, parent) )。

对于这些新树中的每一个,我都需要再次查找通过收缩一个节点而获得的所有树(最终,问题是将n节点树简化为m节点树)。

我目前正在“强行强制”,递归调用edge_contract()直到到达正确节点大小的树。 但是代码需要能够在中等大小的树(约25-50个节点)上工作,而当前的实现则不能。

这种类型的树收缩解决了吗? 有什么好的方法可以解决这个问题?

每次变换树时,都在确定要收缩的边集。 在您给出的示例中,集合仅包含从“子代2”到“子代1”的一条边。

如果您有兴趣查找通过收缩边可以获得的所有树,则该值为2 ^ d(其中d是原始树中边的总数)。 如您所说,您要将n节点树转换为m节点树。 如果您已经知道“ m”,则需要从具有m-1个元素的2 ^ d个集合中查找所有集合(因为m个节点树将具有m-1个边)。

如果您仅对m节点树的子集感兴趣,则随机选择所需数量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM