Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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#_Algorithm_Permutation - Fatal编程技术网

C# 进行有序排列的有效方法

C# 进行有序排列的有效方法,c#,algorithm,permutation,C#,Algorithm,Permutation,我不知道这是否可能,但我试图在C语言中找到一种算法,它可以生成一组数字的所有排列,其中包含一些空格,同时保持其顺序 例如: 我有一个数组[1,2],我需要所有有两个空格的有序排列。 在这种情况下,我将: [1,2,null,null] [1,null,2,null] [1,null,null,2] [null,1,2,null] [null,1,null,2] [null,null,1,2] 在进行置换之前,我尝试将数组中的所有空白都包含在内,但它产生了太多我不需要的置换 在C语言中,函数可以

我不知道这是否可能,但我试图在C语言中找到一种算法,它可以生成一组数字的所有排列,其中包含一些空格,同时保持其顺序

例如:

我有一个数组[1,2],我需要所有有两个空格的有序排列。 在这种情况下,我将:

[1,2,null,null]
[1,null,2,null]
[1,null,null,2]
[null,1,2,null]
[null,1,null,2]
[null,null,1,2]
在进行置换之前,我尝试将数组中的所有空白都包含在内,但它产生了太多我不需要的置换

在C语言中,函数可以是

    private static List<int[]> PermutateWithSpace(this List<int> set, int numberOfEmptySpace)
    {
        // Algorithm which yield all possible permutations of my N "null" inside my set
    }

当然,这个算法很简单

假设有n个数字和m个空值。我们将从空开始,然后插入数字

我们要做的第一件事就是找出第一个数字的去向。我们得到0,1,2。。。m为空,然后产生第一个数字

假设我们在这个置换中产生了x个空值。现在我们知道第二个数字去哪里了。我们得到0,1,2。。。m-x为空,然后生成第二个数字

等等

这是一个足够的提示,还是你需要看到算法写出来

如果你被卡住了:

static IEnumerable<T> Append<T>(this IEnumerable<T> items, T item) 
{
    foreach(var i in items)
        yield return i;
    yield return item;
}

static IEnumerable<IEnumerable<int?>> DoIt(int min, int max, int nulls)
{
    if (min > max)
        yield return Enumerable.Repeat<int?>(null, nulls);
    else
        for(int i = 0; i <= nulls; ++i)
            foreach(var r in DoIt(min + 1, max, nulls - i))
                yield return Enumerable.Repeat<int?>(null, i).Append(min).Concat(r);    
}
或者,更简洁地说,是LINQ风格

static IEnumerable<IEnumerable<int?>> DoIt(int min, int max, int nulls)
{
    return (min > max) ? 
        new[] { Enumerable.Repeat<int?>(null, nulls) } :
        from i in Enumerable.Range(0, nulls + 1)
        from r in DoIt(min + 1, max, nulls - i)
        select Enumerable.Repeat<int?>(null, i).Append(min).Concat(r);
}

算法定义是什么还不清楚。也就是说,是什么决定了你有多少空位,只是空位被乱丢了吗?在您的示例中[1,null,null,2]出现了两次-为什么以及算法中描述重复的规则是什么?如果可以,请上升一级。你这么做可能不是为了好玩,而是因为其他算法需要这个作为输入,对吧?在读取输入时,有没有什么方法可以简单地通过按需插入空值使其更聪明?至少保持顺序应该更容易。这在中得到了回答,因为空值可以被视为重复字符。你的问题有点让人困惑,因为你已经列出了两次所有的排列。这样的排列只有六种,但您已经列出了十二种。请注意,我在公认答案中的方法一次生成一种排列,而不是一次生成所有排列。很明显,如果有数以百万计的可能排列,你不想尝试在列表中实现它们。谢谢!我将试着用你的提示写一个C算法。效果很好!顺便说一下,速度太快了