先简单说两句一下
由于会得到所有的候选参数的组合结果,笛卡尔积通常会得到很大的数据量,实现算法的时候应该用迭代器可以减少内存。同时也可以避免结果数据过多超过整数范围的情况。
例如我们候选有32个变量每个变量有2个候选,那么结果会是2的32次方个,如果全部存起来是很恐怖的内存消耗。
代码
public static IEnumerable<T[]> DescartesProductYield<T>(T[][] options)
{
var oplen = options.Length;//方便敲代码
T[] tmp = new T[oplen];
//每个参数索引记录
int[] idxs = new int[oplen];
int i = 0;
while (i < oplen)
{
tmp[i] = options[i][idxs[i]];
if (i == oplen - 1)
{
yield return tmp;
for (int j = oplen - 1; j >= 0; j--)
{
idxs[j]++;
if (j == 0 && idxs[j] == options[0].Length)
{
yield break;
}
if (idxs[j] < options[j].Length)
{
i = j - 1;
break;
}
else
{
idxs[j] = 0;
}
}
}
i++;
}
}
博客提到笛卡尔积通常会得到很大的数据量,实现算法时使用迭代器可减少内存,还能避免结果数据过多超过整数范围的情况。并举例说明若有32个变量,每个变量有2个候选,全部存储结果会有恐怖的内存消耗。
2763

被折叠的 条评论
为什么被折叠?



