如何创建一个特殊的二叉树

时间:2011-09-23 18:42:21

标签: c# indexing binary-tree

我想索引一些密钥为ulong的数据。 这个ulong(64位)代表了一系列产品, 其中ulong的每个位都是组合中的Product。

所以如果我们得到一个值为3的ulong键,那真的是1 + 2。 这意味着产品1和2存在于组合中。

ulong Combo1 = 1 | 2;
ulong Combo2 = 1 | 4 | 8;

如果我想知道Combo1是否与Combo2共享任何产品,我可以这样做:

if((Combo1 & Combo2) != 0)
{
  //They share at least 1 product
}

这是非常好的和快速的,但如果我有这个很难:

List<ulong> Combos = new List<ulong>();

其中有超过100万个Combo Keys(密钥代表所使用的产品)。

如何索引这个ulongs列表,以便我可以循环它并执行以下操作:

foreach(ulong combo in Combos)
{
  //Find all the combos in Combos where no product is shaded
  List<ulong> WorksWith = GetFromIndexOrTree(combo);
  foreach(ulong combo2 in WorksWith)
  {
    //Use
  }
}

private List<ulong> GetFromIndexOrTree(ulong combo)
{
  //magic index or tree
}

非常感谢您的帮助和评论。

说我是产品组合(红色,蓝色和白色)。我希望找到所有没有任何或所有产品(红色,蓝色和白色)的组合。所以我会找到一个组合(黄色),(绿色,黄色),(绿色,黑色)......

Works - Don't works

1 个答案:

答案 0 :(得分:1)

S 是产品系列。

C P(S)这些组合。

F(p) = { c C | p c }所有组合 c ∈C的集合,不包含产品 p ∈S。

然后

G(X) =∩ p X F(p)

给出了一组组合,其中没有组合在产品集 X S 中包含任何产品 p


C#

List<ulong> combos = new List<ulong> { 1 | 2, 1 | 4 | 8 };

Dictionary<int, List<ulong>> dict = Enumerable
    .Range(0, 64)
    .ToDictionary(i => i, i => combos
        .Where(combo => ((1UL << i) & combo) == 0)
        .ToList());

ulong input = 1 | 2; // find all combos that don't have product 1 or 2

List<ulong> result = Enumerable
    .Range(0, 64)
    .Where(i => ((1UL << i) & input) != 0)
    .Select(i => dict[i])
    .Aggregate((a, b) => Enumerable
        .Intersect(a, b)
        .ToList());