用于生成5个变量中的2个潜在值的所有组合的算法

时间:2016-02-03 16:41:44

标签: c# algorithm

道歉,如果之前已经回答过,但我找不到一个好名字来搜索我正在寻找的东西。我有可能在1-5个字符串变量之间(我们称之为A,B,C,D,E),它们可以具有由' P'和' S'这些是用于复数和单数的单词形式

数据将始终采用相同的顺序ABCDE,因此这不是一个问题,但它可能不包含全部五个(可能只有A,AB,ABC或ABCD)。我正在寻找能够处理这种可能性的算法,同时生成所有潜在的复数/奇异组合。所以在5变量字符串的情况下,结果将是: SSSSS, SPSSS, SPPSS, SPSPS, ... PPPPP

我有逻辑来复数和存储数据它只是一个问题,即生成所有这些组合的逻辑是什么。如果重要,我在C#工作。任何帮助将不胜感激!

4 个答案:

答案 0 :(得分:2)

所以只有两个可能的值,0和1.等一下......零和一个......为什么听起来很熟悉......?啊,二元救援!

让我们以二进制计算一点,从0开始。

  • 0000 = 0
  • 0001 = 1
  • 0010 = 2
  • 0011 = 3
  • 0100 = 4
  • 0101 = 5
  • 0110 = 6
  • 0111 = 7
  • 1000 = 8
  • ...等

如果查看前两行的最右边的位,我们可以得到1位,0和1的所有可能组合。

如果然后查看前四行中最右边的两位,则会获得所有2位组合:00,01,10和11.

前八行包含所有三位组合等。

如果您想要x位的所有可能组合,请计算从0(2^x)-1的所有数字,并查看以二进制写入的数字的最后{​​{1}}位。

(同样,如果您有三个可能的值(0,1和2),则可以在x0之间进行计数,并在写入时查看最后(3^x)-1个数字所有可能的数值都是三元的,等等。)

答案 1 :(得分:0)

我建议使用递归算法。例如,这样的算法可能是你问题的答案(我真的不知道你究竟想要什么样的回报值)

public void getAllWords(ref List<string> result, string Prefix, int wordLength)
{
  if(wordLength == 0)
    result.add(prefix);
  else
  {
    getAllWords(result, prefix+"0", wordLength-1);
    getAllWords(result, prefix+"1", wordLength-1);
  }
}

调用
List<string> result = new List<string>();
getAllWords(result, "", 5);

我希望这有效,我现在在移动设备上。

您可以根据需要更改它,因为您想要考虑不同的字母(例如值0,1,2 ..)。

答案 2 :(得分:0)

您可以枚举0到2 ^ 5-1(即从0到31)的所有整数,并将每个整数表示为bool[]。可能会有所帮助:

static bool[][] GetCombinations(int wordCount) {
    int length = (int) Math.Pow(2, wordCount);
    bool[][] res = new bool[length][];
    for (int i = 0; i < length; i++)
    {
        res [i] = new bool[wordCount];
        for (int j = 0; j < wordCount; j++) {
            res [i] [j] = ((i & (int)Math.Pow (2, j)) != 0);
        }
    }
    return res;
}

答案 3 :(得分:0)

“递归排列C#”将成为谷歌搜索的诀窍。但我想我会尝试使用简单的计数和位屏蔽来为您解决问题。这里有一些代码可以进行“二进制”计数,并使用位移,确定单词中的位置是否应该是多元化的(你提到你已经有了这些细节):

string input = "red bag";
string[] tokens = input.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

string[] test = new string[tokens.Length];

int size = (int)Math.Pow(tokens.Length, 2);

for (int i = 0; i < size; i++)
{
    for (int j = 0; j < tokens.Length; j++)
    {
        int mask = (1 << j);
        if ((mask & i) != 0)
        {
            test[j] = Pluralize(tokens[j]);
        }
        else
        {
            test[j] = Singularize(tokens[j]);
        }
    }

    Console.WriteLine(string.Join(" ", test));
}

输出:

red bag
reds bag
red bags
reds bags