我想用Java生成所有可能的多集分区。
我在http://www.cs.utsa.edu/~wagner/knuth/fasc3b.pdf那里找到了如何实现此算法的指南,在第39页上找到了描述,但无法将其编码为Java。您能帮我实施吗?
我已经尝试实现同一篇论文中的另一种算法,并且它确实可以很好地工作,因为它是一种生成标准集(不是多集)分区的算法。 这是我的代码
public void generate(int n) {
int[] a = new int[n];
int[] b = new int[n];
int m = 1;
int j;
for (int i = 0; i < n; i++) {
a[i] = 0;
b[i] = 1;
}
// implemented algorithm for finding all possible
// set partitions
while (true) {
while (true) {
System.out.println(Arrays.toString(a));
if (a[n-1] == m) break;
else a[n-1] += 1;
}
j = n - 1;
while (a[j-1] == b[j-1]) {
j -= 1;
}
if (j == 1) break;
else a[j-1] += 1;
m = b[j-1] + (a[j-1] == b[j-1] ? 1 : 0);
j += 1;
while (j < n) {
a[j-1] = 0;
b[j-1] = m;
j += 1;
}
a[n-1] = 0;
}
}
给定的currenSets数组告诉我们哪个set是指定位置的元素。我花了很多时间来了解如何实现此代码,但我想实现M算法(这是H算法)。
您能帮我用Java编写此算法的代码吗?