置换算法的BigO
BigO of permutation algorithm
if 编写了以下算法来生成所有排列而不重复,但我很难弄清楚 BigO 是否是。我最感兴趣的是时间复杂度。
const permutationsWithoutRepetition = arr => {
let permutations = [arr];
for(let i = 0; i <= arr.length-2; i++) {
permutations = permutations.map( permutation => {
const fixed = permutation.slice(0,i);
const variable = permutation.slice(i);
return variable.map((_, idx) => [...fixed, ...variable.slice(idx), ...variable.slice(0,idx)]);
}).flat();
}
return permutations;
}
算法所做的是将每个元素放在第一位,然后将其固定在第一位。在下一次迭代中,它对 n-1 个元素执行相同的操作,依此类推,直到只剩下两个元素。
我试着像这样想象它。也许有帮助。
algorithm visualization for n=3
很确定它会过滤到 O(n^3),因为您在初始 for 循环和 2 个 map 调用中有 3 个主要循环。我认为我们忽略了切片,因为它们线性增加了复杂性,而嵌套循环是指数级的。
我不确定我们是否包含 variable.map,所以它可能是 O(n^2),但我认为情况并非如此。在大多数情况下,我只会将其简化为多项式复杂度,除非是度数很重要的情况。
if 编写了以下算法来生成所有排列而不重复,但我很难弄清楚 BigO 是否是。我最感兴趣的是时间复杂度。
const permutationsWithoutRepetition = arr => {
let permutations = [arr];
for(let i = 0; i <= arr.length-2; i++) {
permutations = permutations.map( permutation => {
const fixed = permutation.slice(0,i);
const variable = permutation.slice(i);
return variable.map((_, idx) => [...fixed, ...variable.slice(idx), ...variable.slice(0,idx)]);
}).flat();
}
return permutations;
}
算法所做的是将每个元素放在第一位,然后将其固定在第一位。在下一次迭代中,它对 n-1 个元素执行相同的操作,依此类推,直到只剩下两个元素。 我试着像这样想象它。也许有帮助。
algorithm visualization for n=3
很确定它会过滤到 O(n^3),因为您在初始 for 循环和 2 个 map 调用中有 3 个主要循环。我认为我们忽略了切片,因为它们线性增加了复杂性,而嵌套循环是指数级的。
我不确定我们是否包含 variable.map,所以它可能是 O(n^2),但我认为情况并非如此。在大多数情况下,我只会将其简化为多项式复杂度,除非是度数很重要的情况。