Java 属性约简树

Java 属性约简树,java,recursion,tree,min,Java,Recursion,Tree,Min,我有一个由数千个节点组成的树,由布尔属性装饰,类似这样(括号中的属性): 我想做的是找到保留属性值所需的最小数量的装饰,给定以下约束/信息: 属性由子节点继承 只有叶节点的结果属性才重要(包括继承属性)。所以,如果在内部节点上设置一个“默认”属性可以让我在它的子节点上放置一组属性,那没关系 我们的模型中有一个速记,可以将所有属性设置为true或false。例如,(x=false,y=false,z=false)可以由一个装饰器表示,而(x=false,y=false,z=true)需要三个装饰器

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

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

  • 属性由子节点继承
  • 只有叶节点的结果属性才重要(包括继承属性)。所以,如果在内部节点上设置一个“默认”属性可以让我在它的子节点上放置一组属性,那没关系
  • 我们的模型中有一个速记,可以将所有属性设置为true或false。例如,
    (x=false,y=false,z=false)
    可以由一个装饰器表示,而
    (x=false,y=false,z=true)
    需要三个装饰器
  • 子节点的数量将大大超过内部节点的数量(至少25:1)
  • 树的初始状态将有许多冗余
  • 我正在使用Java并添加一个外部库来处理这个问题,这并不是什么大问题
  • 这些约束是不灵活的,因为我正在处理一个大型企业系统的集成层,所以我所能做的就是尽量减少我们必须存储和传输的属性值的数量

    我认为约束#3让我陷入了一个循环,因为没有它,我可以单独处理每个属性,这很简单(在我意识到更多属性出现之前,我已经实现了一个解决方案)

    我希望这足以说明一般问题。如果需要,我可以提供更多的例子或信息。谢谢大家!

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

  • 对于所有布尔值都是单向的每个叶,使用快捷方式(3)

  • 然后,对于每个内部节点,将属性分配给下面未由1处理的叶的多数值,并删除现在冗余的分配

  • 对于更高的内部节点,请执行相同的操作,查看直接子节点,直至根节点

  • 这是一个启发,我还没有尝试过,但如果我是你,这将是我的第一次尝试。 让我知道进展如何。

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

  • 对于所有布尔值都是单向的每个叶,使用快捷方式(3)

  • 然后,对于每个内部节点,将属性分配给下面未由1处理的叶的多数值,并删除现在冗余的分配

  • 对于更高的内部节点,请执行相同的操作,查看直接子节点,直至根节点

  • 这是一个启发,我还没有尝试过,但如果我是你,这将是我的第一次尝试。
    让我知道它是怎么回事。

    问题是什么?你不需要绝对最小的数字,是吗?@MelNicholson:问题是什么算法会产生最小数量的装饰。我的希望是,它可以简化为一个我从未见过的众所周知的问题,或者说这其实很容易,我只是很笨:)@JohnTangBoyland:不,这绝对是一个需要,而不是需要。我已经有了一个解决方案,可能已经解决了一半(分别解决每个属性),但我注意到,我可能会利用约束条件3扔掉更多的装饰。问题是什么?你不需要绝对最小的数字,是吗?@MelNicholson:问题是什么算法能使装饰的数量最少。我的希望是,它可以简化为一个我从未见过的众所周知的问题,或者说这其实很容易,我只是很笨:)@JohnTangBoyland:不,这绝对是一个需要,而不是需要。我已经有了一个解决方案,可能已经完成了一半(分别解决每个属性),但我注意到,通过利用约束,我可能会扔掉更多的装饰#3。嗯,我喜欢大多数人的想法。这不一定是最优的,但它会很快,这是一个额外的好处。下次有机会我会试试的,谢谢。上面的每一步都应该有一个警告,如果您要设置的值与您要继承的值匹配,请改为继承。这可以在构建树时暂时保存所有属性,然后丢弃任何与父级匹配的属性。@Melnocholson,冒着进入“聊天”的风险,我认为您建议的警告不适用,因为我描述的启发式是自下而上的。“删除现在多余的任务”步骤具有您所期望的效果。我们最终采用了与此类似的方法,感谢您的帮助。嗯,我喜欢大多数人的想法。这不一定是最优的,但它会很快,这是一个额外的好处。下次有机会我会试试的,谢谢。上面的每一步都应该有一个警告,如果您要设置的值与您要继承的值匹配,请改为继承。这可以在构建树时暂时保存所有属性,然后丢弃任何与父级匹配的属性。@Melnocholson,冒着进入“聊天”的风险,我认为您建议的警告不适用,因为我描述的启发式是自下而上的。“删除现在多余的任务”步骤具有您想要的效果。我们最终采用了与此类似的方法,感谢您的帮助。
    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.