C#实现笛卡尔积(遍历排列组合)
先简单说两句一下
由于会得到所有的候选参数的组合结果,笛卡尔积通常会得到很大的数据量,实现算法的时候应该用迭代器可以减少内存。同时也可以避免结果数据过多超过整数范围的情况。
例如我们候选有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++;}
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
