Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何返回包含给定*部分*组合的所有组合?_C#_Permutation_Combinations - Fatal编程技术网

C# 如何返回包含给定*部分*组合的所有组合?

C# 如何返回包含给定*部分*组合的所有组合?,c#,permutation,combinations,C#,Permutation,Combinations,我有一个c#类,它计算n选择k,然后按字典顺序生成所有可能的组合。它还可以返回每个组合的顺序号,例如:传递[1,2,3,4,5]将返回给定n的1,选择k(30,5),并返回[26,27,28,29,30]的142506 是否有方法返回包含部分组合的所有订单号?如果我通过[1,2,3,4],它会返回:1,2,3,…25,26 1: [1,2,3,4,5] 2: [1,2,3,4,6] 3: [1,2,3,4,7] ... 25: [1,2,3,4,29] 26: [1,2,3,4,30] 我需要

我有一个c#类,它计算n选择k,然后按字典顺序生成所有可能的组合。它还可以返回每个组合的顺序号,例如:传递[1,2,3,4,5]将返回给定n的1,选择k(30,5),并返回[26,27,28,29,30]的142506

是否有方法返回包含部分组合的所有订单号?如果我通过[1,2,3,4],它会返回:1,2,3,…25,26

1: [1,2,3,4,5]
2: [1,2,3,4,6]
3: [1,2,3,4,7]
...
25: [1,2,3,4,29]
26: [1,2,3,4,30]

我需要这张彩票。我希望每张彩票都有其组合的订单号,并且我需要在5个球中的每一个被抽签时显示可能的赢家总数。现在每张票都有实际的组合,我运行一个查询来获得部分优胜者,但我想优化这个过程

您需要的是一个函数,对于组合[a,b,c,d,e],它返回该组合的订单号。然后,您可以获取组合集(可能的数字集减去已拾取的数字)选择(尚未拾取的数字),将已拾取的数字添加到每个组合中,对每个组合重新排序,并使用该函数获取订单号

编辑:这可能有帮助:saliu.com/bbs/messages/348.html

编辑2:答案如下:

EDIT3:我尝试了一些C#代码:

private IEnumerable<int[]> CombinationsFor(int n, int k);
private int CombinationsCount(int n, int k);

private int IndexFor(int n, int[] combination)
{
    int k = combination.Count();
    int ret = 0;

    int j = 0;
    for (int i = 0; i < k; i++)
    {
        for (j++; j < combination[i]; j++)
        {
            ret += CombinationsCount(n - j, k - i - 1);
        }
    }

    return ret;
}

private IEnumerable<int> PossibleCombinations(int n, int k, int[] picked)
{
    int m = picked.Count();

    int[] reverseMapping = Enumerable.Range(0, n)
        .Where(i=>!picked.Contains(i))
        .ToArray();

    return CombinationsFor(n-m, k-m)
        .Select(c => c
            .Select(x=>reverseMapping[x])
            .Concat(picked)
            .OrderBy(x=>x)
            .ToArray()
        )
        .Select(c => IndexFor(n, c));
}
private IEnumerable组合用于(int n,int k);
私有整数组合(整数n,整数k);
私有int IndexFor(int n,int[]组合)
{
int k=composition.Count();
int-ret=0;
int j=0;
for(int i=0;i!picked.Contains(i))
.ToArray();
返回组合(n-m,k-m)
.选择(c=>c
.选择(x=>反向映射[x])
.Concat(已拾取)
.OrderBy(x=>x)
.ToArray()
)
.选择(c=>IndexFor(n,c));
}

您需要的组合是
(n-d)选择(k-d)
其中
d
是固定绘图的数量

当您生成它们时,它们不会有正确的数字(它们将跳过最后的
d
数字,而不是您想要的数字),而只是使用子列表的逆序映射重新编写组合:

(在伪python代码中,因为这与C完全无关)


然后,您只需调用带有结果组合的函数(如果需要,在对其进行排序之后)。

只需像往常一样生成置换,减去列表中包含的置换,然后在所述列表的前面添加(+1)以询问公平点分布;)我已经得到了计算给定组合的索引的函数,但是感谢您解释了获得所需结果所需的逻辑。现在我不知道该接受哪个答案,你的还是萨维里奥的反向映射;)良好的C#实现(+1)。感谢上帝,我不必用C#:D来支付我的账单。你的回答和汤姆的帮助我理解了我需要什么来获得索引,+1。
listing = [1, 2, ..., 30]
partial = [4, 7, 25]
draw_size = 5
remaining = listing - partial
reverse_order_mapping = [(index, item) in remaining.items_and_indexes]

n = listing.size  // 30
k = draw_size     // 5
d = partial.size  // 3

for comb in ((n-d) choose (k-d))
  actual_comb = comb.map(reverse_order_mapping)
  print actual_comb
end