可变数量的笛卡尔积,每个都是可变大小的

时间:2016-01-08 19:13:05

标签: java algorithm recursion set cartesian-product

让G成为某个对象。

设n = f(G)为集数。

设S i = {1,2,...,h(i) - 1,h(i)},其中1≤i≤n。

我想写一个方法(Java),它返回一个表示笛卡尔乘积的二维数组S = S 1 XS 2 X ... XS n -1 XS n 。该方法的意图在下面的类似Java的伪代码中示出。它意味着一个迭代的解决方案,但递归解决方案也没问题。

int[][] varCart(G, j) {
      int[][] result = new int[sizeOfCartProduct][f(G)]
      ....
      return result;
}

此外,S j 更改为{1}(或任何其他单身)。

举个例子:

设G为对象,以便:

f(G)= 3

S 1 = {1,2} [h(1)= 2]

S 2 = {1,2,3} [h(2)= 3]

S 3 = {1,2,3,4} [h(3)= 4]

让j = 2。

然后varCart(G,2)的结果必须是

  

int [2 * 1 * 4 = 8] [3] = {{1,1,1},{1,1,2},{1,1,3},{1,1,4}, {2,1,1},{2,1,2},{2,1,3},{2,1,4}}

1 个答案:

答案 0 :(得分:1)

创建一个每位最大值的数组;在您的示例中,这将是[2,3,4] 将数字j的最大值设置为1,即可获得[2,1,4] 创建第一个组合[1,1,1]并将其添加到结果中。然后重复增加组合并将其添加到结果中 要增加组合,请递增最后一位数;如果该数字等于最大值,则将其设置为1并增加前一个数字,依此类推。如果第一个数字需要递增并且已经设置为最大值,则您已找到所有组合

[1,1,1] -> [1,1,2] -> [1,1,3] -> [1,1,4] ->
4 is maximum for last digit, so set it to 1 and increment previous digit ->
1 is maximum for second digit, so set it to 1 and increment previous digit ->
[2,1,1] -> [2,1,2] -> [2,1,3] -> [2,1,4] ->
4 is maximum for last digit, so set it to 1 and increment previous digit ->
1 is maximum for second digit, so set it to 1 and increment previous digit ->
2 is maximum for first digit, so all combinations have been found.