假设我们有元素 0 和 1,它们可以出现多次,例如00 00 11, 00 00 11 11or 01 11(分成 2 组以提高可读性)。
我已经有一个函数来生成所有唯一的排列:
class UniqueElement {
constructor(value, occurrences) {
this.value = value;
this.occurrences = occurrences;
}
}
function permUnique(elements) {
let set = new Set(elements);
let listunique = Array.from(set).map((i) => new UniqueElement(i, elements.filter((el) => el === i).length));
let u = elements.length;
return permUniqueHelper(listunique, "0".repeat(u).split("").map((i) => parseInt(i)), u - 1);
}
function* permUniqueHelper(listunique, result_list, d) {
if (d < 0) {
yield [...result_list];
} else {
for (const i of listunique) {
if (i.occurrences > 0) {
result_list[d] = i.value;
i.occurrences--;
for (const g of permUniqueHelper(listunique, result_list, d - 1)) yield g;
i.occurrences++;
}
}
}
}
// call like:
// permUnique([0,0,1,1])
console.log(Array.from(permUnique([0,0,1,1])).join('\n'));
从这里翻译成 JavaScript:https : //stackoverflow.com/a/6285203/10362619
现在我的目的是将这些生成的排列用作其他对象的索引。然后在代码中使用这些对象,其中这些对象的顺序无关紧要:
10 10
01 01
例如,最终是相同的,或者
01 20 12
02 10 21
10 21 02
12 01 20
...
对于用碱0,1并2从起动00 11 22。
它们被认为是相同的,因为相同的数字处于相同的位置。只需切换两个数字(例如 0 和 1),您就会得到另一个。
同样,为了更好的可读性,所有这些示例都被分成两组。00 11 22表示与 相同001122,其中每个数字都是输入数组中的一个元素。
是在创建排列之后过滤元素的最快方法还是可以在函数中实现这个标准?
编辑:不要求它是一个置换数组的生成器函数
编辑 2:为了让事情更清楚:我给出的第一个例子有一个模式abab,其中a可以是0或,1并且b是相反的。第二个示例遵循模式abcabcwhere a, bandc都可以是0, 1or 2(但不一样)。
牧羊人nacy
郎朗坤
相关分类