用于在 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#。 任何帮助将不胜感激!
所以只有两个可能的值,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;
}