从长度为N的数组中找出所有M个元素组合的优化算法

时间:2022-12-30 14:48:29

在算法中找到M个元素组合后,可以再进行补充判断条件等,目前只进行输出。

public void DoSomethingFromArray(object[] input, int m)
{
int n = input.Length;
var order = new int[m + 1];
//注意这里order[0]=-1用来作为循环判断标识,另外从order[1]到order[m]按从小到大的顺序存储input的下标值
//算法按层循环,第一步:order[m]: 当前指-> input.Length;第二步:order[m-1]:当前指-> input.Length-1...
//循环从 [0][1]...[m-1] 递增到 [n-m+1]...[n-1][n]
for (var i = 0; i <= m; i++)
{
order[i] = i - 1;
}
var k = m;
var flag = true; // 标志找到一个有效组合
while (order[0] == -1)
{
if (flag) // 输出符合要求的组合
{
for (var j = 1; j <= m; j++)
{
//符合条件的一个组合存储在order中,可以对此组合进行想要的操作
//在下面输入时间操作代码
Console.Write(input[order[j]]);
}
//在输出一个组合后,给标志赋值为false,直至循环到另外一个目标组合
flag = false;
}
order[k]++;
if (order[k] == n)
{
//进入内一层循环
order[k--] = 0;
continue;
}
if (k < m)
{
//内层改变后,外层逐层改变
order[++k] = order[k - 1];
continue;
}
if (k == m)
{
//最外层改变完毕,一个组合找到
flag = true;
}
}
}