Javascript 获得所有可能的唯一排列

Javascript 获得所有可能的唯一排列,javascript,algorithm,permutation,Javascript,Algorithm,Permutation,有一个小的数组,带有一些符号,如['^'、'^'、'>'、'>'、'+'、'独特的结果问题显然将是一个效率杀手,因为每次创建新排列时都必须检查结果列表。至于算法,它的工作方式基本上与其他排列算法相同,但删除重复项的标准将涉及更多的检查s、 如果数组的大小很小,那么效率不应该是一个大问题。如果已经找到的值没有添加到数组中,只需在应答数组中循环即可。加快此检查过程的一种方法是确定应答数组的排序方式。例如,^always before*,which before(这样,您就不必每次都检查整个数组。还有

有一个小的数组,带有一些符号,如
['^'、'^'、'>'、'>'、'+'、'独特的结果问题显然将是一个效率杀手,因为每次创建新排列时都必须检查结果列表。至于算法,它的工作方式基本上与其他排列算法相同,但删除重复项的标准将涉及更多的检查s、 如果数组的大小很小,那么效率不应该是一个大问题。如果已经找到的值没有添加到数组中,只需在应答数组中循环即可。加快此检查过程的一种方法是确定应答数组的排序方式。例如,^always before*,which before(这样,您就不必每次都检查整个数组。还有其他方法可以加快速度,但归根结底,这仍然是一个非常昂贵的计算要求。因为您的数组很小,所以这一点都不重要,除非您计划对一个小数组进行多次排列,否则您可以使用其中一个引用的算法,将每个排列映射到一个字符串,并将整个数组放入一个数组中以丢弃重复项。类似于:

let a = ['^','^','>','>','+','<','<'];
let ps = permutations(a);  // return value should be array of arrays.
let qs = ps.map(p => p.join(""));
let s = new Set(qs);
设a=['^','^','>','>','>','+','i),使a[i]a[i]a[i]让a=['^'、'^'、'>'、'>'、'+','你应该使用这些解决方案中的一种,但将每个结果作为其生成的结果添加到一个映射中,并且仅将其添加到arr中,如果它不在映射中,你应该澄清你是想要排列,还是(正如我所怀疑的)你实际上想要组合@Brad Thomas。我怀疑正确的术语是“没有重复的组合”但我不确定,我发现的例子是不同的数字/符号,而我的数组有重复的。
function swap(a, i, j) {
    const t = a[i];
    a[i] = a[j];
    a[j] = t;
}

function reverseSuffix(a, start) {
    if (start === 0) {
        a.reverse();
    }
    else {
        let left = start;
        let right = a.length - 1;

        while (left < right)
            swap(a, left++, right--);
    }
}

function nextPermutation(a) {
    // 1. find the largest index `i` such that a[i] < a[i + 1].
    // 2. find the largest `j` (> i) such that a[i] < a[j].
    // 3. swap a[i] with a[j].
    // 4. reverse the suffix of `a` starting at index (i + 1).
    //
    // For a more intuitive description of this algorithm, see:
    //   https://www.nayuki.io/page/next-lexicographical-permutation-algorithm
    const reversedIndices = [...Array(a.length).keys()].reverse();

    // Step #1; (note: `.slice(1)` maybe not necessary in JS?)
    const i = reversedIndices.slice(1).find(i => a[i] < a[i + 1]);

    if (i === undefined) {
        a.reverse();
        return false;
    } 

    // Steps #2-4
    const j = reversedIndices.find(j => a[i] < a[j]);
    swap(a, i, j);
    reverseSuffix(a, i + 1);
    return true;
}

function* uniquePermutations(a) {
    const b = a.slice().sort();

    do {
        yield b.slice();
    } while (nextPermutation(b));
}

let a = ['^','^','>','>','+','<','<'];
let ps = Array.from(uniquePermutations(a));
let qs = ps.map(p => p.join(""));

console.log(ps.length);
console.log(new Set(qs).size);