我想索引一些密钥为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
}
非常感谢您的帮助和评论。
说我是产品组合(红色,蓝色和白色)。我希望找到所有没有任何或所有产品(红色,蓝色和白色)的组合。所以我会找到一个组合(黄色),(绿色,黄色),(绿色,黑色)......
答案 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());