Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.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_Combinatorics - Fatal编程技术网

C# 字符串列表的置换算法

C# 字符串列表的置换算法,c#,algorithm,combinatorics,C#,Algorithm,Combinatorics,我需要帮助理解如何编写置换算法。如果这是偶数排列,则它们必须按顺序排列并使用相同的值 List<string> str = new List<string>{"a", "b", "c", "d"}; 我看了看,但他没有遵守顺序。你可以采取递归方法:取第一个字母,从第二个字母开始构建所有可能的组合这是递归。。。并给他们每个人写上第一个字母。然后将前两个字母放在一起,递归地构建从第三个字母开始的所有组合。等等 至于您的附加要求:如果您想排除包含X个字母的字符串的所有组合,只

我需要帮助理解如何编写置换算法。如果这是偶数排列,则它们必须按顺序排列并使用相同的值

List<string> str = new List<string>{"a", "b", "c", "d"};

我看了看,但他没有遵守顺序。

你可以采取递归方法:取第一个字母,从第二个字母开始构建所有可能的组合这是递归。。。并给他们每个人写上第一个字母。然后将前两个字母放在一起,递归地构建从第三个字母开始的所有组合。等等


至于您的附加要求:如果您想排除包含X个字母的字符串的所有组合,只需在构造第一个字符串时跳过此数字。

您可以采用递归方法:取第一个字母,从第二个字母开始构建所有可能的组合这是递归。。。并给他们每个人写上第一个字母。然后将前两个字母放在一起,递归地构建从第三个字母开始的所有组合。等等


至于您的附加要求:如果您想排除包含X字母字符串的所有组合,只需在构造第一个字符串时跳过此数字。

这相当简单:您有三个点可以放置逗号或不放置任何内容。有八种组合对应于2^3个二进制数

对于从0到7(含)的每个数字,生成一个二进制表示。在二进制表示有1的每个位置加一个逗号;不要把逗号放在零的地方

for (int m = 0 ; m != 8 ; m++) {
    string s = "a";
    if ((m & 1) != 0) s += ",";
    s += "b";
    if ((m & 2) != 0) s += ",";
    s += "c";
    if ((m & 4) != 0) s += ",";
    s += "d";
    Console.WriteLine(s);     
}

这相当简单:有三个点可以放逗号,也可以什么都不放。有八种组合对应于2^3个二进制数

对于从0到7(含)的每个数字,生成一个二进制表示。在二进制表示有1的每个位置加一个逗号;不要把逗号放在零的地方

for (int m = 0 ; m != 8 ; m++) {
    string s = "a";
    if ((m & 1) != 0) s += ",";
    s += "b";
    if ((m & 2) != 0) s += ",";
    s += "c";
    if ((m & 4) != 0) s += ",";
    s += "d";
    Console.WriteLine(s);     
}

上面的二进制方法是正确的,这实际上是一个分区问题,但不是分区问题,也不是排列问题


注意,因为分区数的增长速度比e^e^n的指数增长速度快,所以对于大字符串来说,它的速度会非常慢。

上面的二进制方法是正确的,这实际上是一个分区问题,但不是分区问题,也不是排列问题


请注意,因为分区数的增长速度比e^e^n的指数增长速度快,所以对于大字符串来说,它的速度非常慢。

请尝试以下代码。我还没有测试过,但我想这正是你想要的

List<string> str = new List<string>{ "a", "h", "q", "z", "b", "d" };
List<List<string>> combinations = combine(str.OrderBy(s=>s).ToList());

List<List<string>> combine(List<string> items)
{
    List<List<string>> all = new List<List<string>>();

    // For each index item in the items array
    for(int i = 0; i < items.Length; i++)
    {
        // Create a new list of string
        List<string> newEntry = new List<string>();
        // Take first i items
        newEntry.AddRange(items.Take(i));
        // Concatenate the remaining items
        newEntry.Add(String.concat(items.Skip(i)));
        // Add these items to the main list
        all.Add(newEntry);

        // If this is not the last string in the list
        if(i + 1 < items.Length)
        {
            // Process sub-strings
            all.AddRange(combine(items.Skip(i + 1).ToList()));
        }
    }
    return all;
}

如果您需要生成组合、排列或变体,那么这是一个很棒的库。

请尝试以下代码。我还没有测试过,但我想这正是你想要的

List<string> str = new List<string>{ "a", "h", "q", "z", "b", "d" };
List<List<string>> combinations = combine(str.OrderBy(s=>s).ToList());

List<List<string>> combine(List<string> items)
{
    List<List<string>> all = new List<List<string>>();

    // For each index item in the items array
    for(int i = 0; i < items.Length; i++)
    {
        // Create a new list of string
        List<string> newEntry = new List<string>();
        // Take first i items
        newEntry.AddRange(items.Take(i));
        // Concatenate the remaining items
        newEntry.Add(String.concat(items.Skip(i)));
        // Add these items to the main list
        all.Add(newEntry);

        // If this is not the last string in the list
        if(i + 1 < items.Length)
        {
            // Process sub-strings
            all.AddRange(combine(items.Skip(i + 1).ToList()));
        }
    }
    return all;
}

如果您需要生成组合、排列或变体,然后是一个很棒的库。

这是一个排列问题,对吗?我们应该添加一个家庭作业标记吗?与几乎同时询问的问题惊人地相似。这是一个排列问题,对吗?我们应该添加一个家庭作业标记吗?与几乎同时询问的问题惊人地相似。您能给出一个示例输出,以说明它是如何生成的吗请问,你能给出一个样本输出,以确定它是如何产生的?这是C、C++、C和java中的位和运算,不过在最后两个中,你需要添加M & 1!0进行编译。这意味着如果m的二进制表示在最低有效位位置包含1。m&2表示第二最低有效位;m&4是第三名,依此类推,继续使用2的幂。对不起,我还是不太明白。m是计数,这就是我要比较的吗?@Lolcoder m是一个小面具。它以二进制形式从0到7,或000001010 011100101110111。1是001,2是010,4是二进制的100。因此,第一个逗号将仅出现在奇数1、3、5和7中;第二个逗号将出现在2、3、6和7中;第三个将在4,5,6和7。我刚刚编辑了代码,使之成为正确的C语言。在调试器中逐步检查它是如何工作的。谢谢,我理解位掩码部分。与1、2和4相比,你是如何得出结论的?如果我想对不同长度的字符串自动执行此操作。我如何知道比较位掩码的数字和循环的次数?我认为RooCube=2 ^ StrimalStudio。CalpUn.@ LoLoCalter使用左移位:1是1,这是C、C++、C和java中的位和运算,但在最后两个中,需要添加M & 1!0进行编译。这意味着如果m的二进制表示在最低有效位位置包含1。m&2表示第二最低有效位;m&4是第三名,依此类推,继续使用2的幂。对不起,我还是不太明白。m是计数,这就是我要比较的吗?@Lolcoder m是一个小面具。它以二进制形式从0到7,或000001010 011100101110111。1是001,2是010,4是1
00二进制。因此,第一个逗号将仅出现在奇数1、3、5和7中;第二个逗号将出现在2、3、6和7中;第三个将在4,5,6和7。我刚刚编辑了代码,使之成为正确的C语言。在调试器中逐步检查它是如何工作的。谢谢,我理解位掩码部分。与1、2和4相比,你是如何得出结论的?如果我想对不同长度的字符串自动执行此操作。我如何知道比较位掩码的数字和循环的次数?我认为loopCount=2^stringArray.Count。@Lolcoder使用左移位:1是1,它们仍然需要相同的顺序。所以a不能从索引1移动。@Lolcoder,我建议的代码不会更改字符串的顺序。事实上,我使用str.OrderBys=>s.ToList确保它们按字母顺序排序。当然,您可能需要也可能不需要这一行。它们仍然需要相同的顺序。所以a不能从索引1移动。@Lolcoder,我建议的代码不会更改字符串的顺序。事实上,我使用str.OrderBys=>s.ToList确保它们按字母顺序排序。当然,您可能需要也可能不需要这条线路。