笛卡尔乘积
首先,先简单解释一下笛卡尔积。
现在,我们有两个集合A和B。
A = {0,1} B = {2,3,4}
集合 A×B 和 B×A的结果集就可以分别表示为以下这种形式:
A×B = {(0,2),(1,2),(0,3),(1,3),(0,4),(1,4)};
B×A = {(2,0),(2,1),(3,0),(3,1),(4,0),(4,1)};
以上A×B和B×A的结果就可以叫做两个集合相乘的‘笛卡尔积’。
程序实现
public class Solution {
public List<List<String>> descartes(List<List<String>> dimValue) {
List<List<String>> res = new ArrayList<>();
if (dimValue == null || dimValue.size() == 0)
return res;
backtrace(dimValue, 0, res, new ArrayList<>());
return res;
}
/**
* 递归回溯法求解
*
* @param dimValue 原始数据集合
* @param index 当前执行的集合索引
* @param result 结果集合
* @param curList 当前的单个结果集
*/
private void backtrace(List<List<String>> dimValue, int index,
List<List<String>> result, List<String> curList) {
if (curList.size() == dimValue.size())
result.add(new ArrayList<>(curList));
else
for (int j = 0; j < dimValue.get(index).size(); j++) {
curList.add(dimValue.get(index).get(j));
backtrace(dimValue, index + 1, result, curList);
curList.remove(curList.size() - 1);
}
}
测试方法
public static void main(String[] args) {
List<String> list1 = new ArrayList<String>();
list1.add("a");
list1.add("b");
List<String> list2 = new ArrayList<String>();
list2.add("0");
list2.add("1");
list2.add("2");
List<List<String>> dimValue = new ArrayList<List<String>>();
dimValue.add(list1);
dimValue.add(list2);
// 递归实现笛卡尔积
Solution s = new Solution();
List<List<String>> res = s.descartes(dimValue);
System.out.println("递归实现笛卡尔乘积: 共 " + res.size() + " 个结果");
for (List<String> list : res) {
for (String string : list) {
System.out.print(string + " ");
}
System.out.println();
}
}
结果
递归实现笛卡尔乘积: 共 6 个结果
a 0
a 1
a 2
b 0
b 1
b 2
相关阅读
一:笛卡尔积的解释 例 给出二个域:假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}。