我找到了Heap算法的这个工作示例:
const start = [1, 2, 3];
generate(start.length, start);
function generate(n, arr) {
// If only 1 element, just output the array
if (n === 1) {
console.log(arr);
return;
}
for (var i = 0; i < n; i+= 1) {
generate(n - 1, arr);
// If n is even
if (n % 2 === 0) {
swap(arr, i, n - 1);
} else {
swap(arr, 0, n - 1);
}
}
}
function swap(arr, a, b) {
[arr[a], arr[b]] = [arr[b], arr[a]];
}
它将输出:
[ 1, 2, 3 ]
[ 2, 1, 3 ]
[ 3, 1, 2 ]
[ 1, 3, 2 ]
[ 2, 3, 1 ]
[ 3, 2, 1 ]
但是我想知道Heap的算法是否可以在这样的情况下工作:
const values = [0,0,0,0];
以及数组中的每个条目可以是a,b,c或d,其中0是a,1是b,依此类推。
因此可能的排列包括:
aaad
bbcc
abcd
dbda
等
堆的算法可以在这种情况下工作吗?
答案 0 :(得分:0)
这很接近-在这种情况下,我们不需要交换:
var start = [0,0,0];
// Get the permutations
generate(start.length,0, start);
function generate(len, n, arr) {
console.log(arr);
for (var i = n; i < len; i++) {
const sliced = arr.slice(0);
sliced[n] = i;
generate(len, n + 1, sliced);
}
}
但是我没有从输出中得到27行(这是我期望的),而是得到了16行,这很奇怪:
[ 0, 0, 0 ]
[ 0, 0, 0 ]
[ 0, 1, 0 ]
[ 0, 1, 2 ]
[ 0, 2, 0 ]
[ 0, 2, 2 ]
[ 1, 0, 0 ]
[ 1, 1, 0 ]
[ 1, 1, 2 ]
[ 1, 2, 0 ]
[ 1, 2, 2 ]
[ 2, 0, 0 ]
[ 2, 1, 0 ]
[ 2, 1, 2 ]
[ 2, 2, 0 ]
[ 2, 2, 2 ]
显然,输出的前两行显示了一个问题-我不应该两次获得[0,0,0]。