如何获得枚举标志值的最短表示?

时间:2013-04-22 13:20:45

标签: c# .net algorithm

我想生成枚举字段的最短(或最短)组合,这将导致特定的枚举值。什么是实现这一目标的最佳算法?

例如,假设我有枚举:

enum MyEnum
{
    One = 1, 
    Two = 2,
    Three = One | Two,
    Four = 4,
    Six = Two | Four,
    Eight = 8,
    All = One | Two | Four | Eight
 }

现在举例来说,值7我想让我的函数输出"One | Six""Three | Six"

编辑:当然Three | Four也是有效的输出。

1 个答案:

答案 0 :(得分:4)

你基本上要求的是最小集合覆盖,一个已知的NP完整问题。幸运的是,这并不意味着您无法解决此类小案例。您还可以通过贪婪算法获得O(logn)近似值。

如果你的枚举值没有特定的结构,那么对于一般的精确解决方案,你不可能比蛮力做得更好。如果您知道您的枚举具有特定的结构,那么通常可以通过图形分区或CSP +回溯等方式获得更好的效果。