减少属性树

时间:2013-04-30 00:15:03

标签: java recursion tree min

我有一个包含数千个节点的树,由布尔属性修饰,类似这样(括号中的属性):

Root (x=true, y=true, z=false)
   Interior 1
       Leaf 1 (x=false, z=false)
       Leaf 2 (x=false, y=false, z=false)
   Interior 2
       Leaf 3
   etc.

我想要做的是找到保留属性值所需的最少数量的装饰,给定以下约束/信息:

  1. 属性由子节点继承
  2. 只有叶节点的结果属性很重要(包括继承的属性)。因此,如果在内部节点上设置“默认”属性,我可以在其子项上删除一堆属性,这没关系。
  3. 我们的模型中有一个简写,用于将所有属性设置为true或false。例如,(x=false,y=false,z=false)可以由一个装饰器表示,而(x=false,y=false,z=true)则需要三个。
  4. 子节点数量将大大超过内部节点(至少25比1)
  5. 树的初始状态会有很多冗余。
  6. 我正在使用Java并添加一个外部库来处理这个问题并不是什么大问题。
  7. 由于我正在使用大型企业系统进行集成层,因此这些约束并不灵活,因此我所能做的就是尽量减少我们必须存储和传输的属性值的数量。

    我认为约束#3会让我失去一个循环,因为没有它我就可以单独处理每个属性,这很简单(我已经实现了一个解决方案,然后才意识到更多属性的来临)。

    我希望这足以描述一般问题。如果需要,我可以提供更多示例或信息。谢谢!

1 个答案:

答案 0 :(得分:1)

我认为(3.)可以被忽略,因为我们只对叶子感兴趣。 以下是我的建议:

  1. 对于所有布尔单向的单叶,使用快捷方式(3。)。

  2. 然后,对于每个内部节点,将属性分配给下面的叶子的多数值,而不是由1处理,并删除现在冗余的分配。

  3. 对于更高的内部节点,请执行相同操作,查看直接子节点,直到根节点。

  4. 这是一种启发式方法,我没有尝试过,但如果我是你,那将是我的第一枪。 让我知道它是怎么回事。