堆算法,但可重复输入

时间:2019-02-06 05:48:28

标签: javascript heap permutation permute heaps-algorithm

我找到了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

堆的算法可以在这种情况下工作吗?

1 个答案:

答案 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]。