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

本文关键字:组合 算法 变量 用于 | 更新日期: 2023-09-27 18:33:00

很抱歉,如果之前已经回答过这个问题,但我想不出一个好名字来搜索我正在寻找的东西。 我有可能在 1-5 个字符串变量(我们称之为 A、B、C、D、E(之间,这些变量可以具有由"P"和"S"表示的两个值之一。 这些适用于复数和单数单词形式

数据将始终以相同的顺序,ABCDE,因此这不是一个问题,但它可能不包含所有五个(可能只有A,AB,ABC或ABCD(。 我正在寻找一种算法,可以在生成所有潜在的复数/单数组合的同时处理这种可能性。 因此,在 5 变量字符串的情况下,结果将是:SSSS,SPSSSs,SPPSSs,SPSPSs,...公私合营

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

用于在 5 个变量中生成具有 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的所有数字,并查看以二进制编写的数字的最后x位。

(

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

">

递归排列C#"将用于Google搜索。但我想我会尝试使用简单的计数和位掩码为您解决。这里有一些代码将进行"二进制"计数,并使用位移来确定单词中的位置是否应该复数(你提到你已经有了这些细节(:

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

我会建议使用递归算法。例如,像这样的算法可能是您问题的答案(我真的不知道您到底想要什么返回值(

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.(。

你可以枚举从 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;
}