2013-04-30 58 views
1

我有几千个节点树的树,由布尔属性的装饰,像这样(括号属性):减少属性

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并添加一个外部库来处理这个问题并不是什么大不了的事情。

这些约束条件并不灵活,因为我正在使用大型企业系统的集成层,所以我只能尽量减少我们必须存储和传输的属性值的数量。我认为约束#3正在引发我一个循环,因为如果没有它,我可以单独处理每个属性,这很简单(在我意识到更多属性出现之前,我已经实现了一个解决方案)。

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

+1

什么问题? – 2013-04-30 00:19:19

+0

你不需要绝对*最小的数字,是吗? – 2013-04-30 00:19:52

+1

@MelNicholson:问题是什么算法会导致最少数量的装饰。我的希望是,它可以归结为一个我从未见过的着名问题,或者这实际上很简单,我只是密集:) – 2013-04-30 00:27:41

回答

1

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

  1. 的每一片叶子的所有布尔值的一种方式,使用快捷键(3)。

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

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

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

+0

嗯,我喜欢和大多数人一起去的想法。这不一定是最佳的,但它会很快,这是一个奖金。我会尝试下一次我得到的机会,谢谢。 – 2013-04-30 00:48:13

+0

上述每个步骤都应该有一个警告,即如果您要设置的值与您要继承的值相匹配,请继承。这可以在构建树时暂时保存所有属性,然后丢弃与父项匹配的所有属性。 – 2013-04-30 18:06:58

+0

@MelNicholson,在进入“聊天”的风险中,我不认为你提出的建议是适用的,因为我描述的启发式是自下而上的。 “删除现在多余的作业”步骤有您正在寻找的效果。 – 2013-05-01 02:42:21