【问题标题】:Reducing tree of attributes减少属性树
【发布时间】:2013-04-23 19:20:10
【问题描述】:

我有一棵由数千个节点组成的树,由布尔属性修饰,如下所示(括号中的属性):

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. 在我们的模型中有一个简写,用于将所有属性设置为真或假。例如,(x=false,y=false,z=false) 可以由一个装饰器表示,而(x=false,y=false,z=true) 需要三个。
  4. 子节点的数量将大大超过内部节点(至少25比1)
  5. 树的初始状态会有很多冗余。
  6. 我正在使用 Java,添加一个外部库来解决这个问题没什么大不了的。

这些限制并不灵活,因为我正在处理与大型企业系统的集成层,所以我所能做的就是尽量减少我们必须存储和传输的属性值的数量。

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

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

【问题讨论】:

  • 问题是什么?
  • 你不需要绝对最小的数,对吗?
  • @MelNicholson:问题是哪种算法会产生最少的装饰。我希望它可以简化为一个我没见过的众所周知的问题,或者这实际上很容易而且我只是很密集:)
  • @JohnTangBoyland:不,这绝对是需要而不是需要。我有一个解决方案,可能已经让我走到了一半(分别解决每个属性),但我注意到我可能会利用约束 #3 扔掉更多的装饰。

标签: java recursion tree min


【解决方案1】:

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

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

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

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

这是一种启发式方法,我还没有尝试过,但如果我是你,这将是我的第一枪。 告诉我进展如何。

【讨论】:

  • 嗯,我喜欢和大多数人一起去的想法。它不一定是最佳的,但它会很快,这是一个奖励。下次有机会我试试,谢谢。
  • 上述每个步骤都应注意,如果您设置的值与您将继承的值匹配,则改为继承。这可以在您构建树时临时保存所有属性,然后丢弃与父级匹配的任何属性。
  • @MelNicholson,冒着进入“聊天”的风险,我认为您建议的警告并不适用,因为我描述的启发式是自下而上的。 “删除现在多余的分配”步骤具有您正在寻找的效果。
  • 我们最终采用了与此类似的方法,感谢您的帮助。
猜你喜欢
  • 2019-06-15
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-15
  • 2018-09-15
相关资源
最近更新 更多