ここでは、配列から複製を削除する関数です。デデューピングアルゴリズムの時間複雑度
function dedupe(arr) {
var seen = {};
arr.forEach((e,i)=>{
if (seen[e]) {
arr.splice(i, 1);
}
seen[e] = true;
});
return arr;
}
console.log(dedupe([1, 2, 1, 3, 4]));
私は、この関数の時間複雑に興味があります。
Array
が実際の配列に裏打ちされていると仮定すると、時間の複雑さは次のように分析できますか?
seen
の割り当て:O(1)- 列挙すべての要素:重複のO(N)
- 除去:O(N)(項目によってために再割り当て必須アイテム?)
- return O(1)
これはO(n^2)アルゴリズムですか?
編集:インデックスの問題のために修正さ
。上記のパフォーマンスによって動揺したものについては
function dedupe(arr) {
var seen = {};
for(let i = 0; i < arr.length; i++) {
const e = arr[i];
if (seen[e]) {
arr.splice(i, 1);
i--; // we have modified the array and need to continue from the current index
}
seen[e] = true;
}
return arr;
}
console.log(dedupe([1, 2, 1, 3, 1, 4, 4, 7, 6, 7, 7, 7, 1, 5]));
、これはO(N)であると思います。
私はインプレイスからデュプリケートしたいと思っていました。 Set
を使用すると、ホスト環境全体で順序が維持されます。
function dedupe(arr) {
var seen = new Set();
for(let i = 0; i < arr.length; i++) {
seen.add(arr[i]);
}
arr.length = 0; // empty the array
return arr.concat(...seen.keys());
}
console.log(dedupe([1, 2, 1, 3, 1, 4, 4, 7, 6, 7, 7, 7, 1, 5]));
'forEach'を実行しながら配列を編集してください。 '[1、2、1、3、1、4、4、7、6、7、7、1、5]をテストすると、いくつかのバグがあります。 – dloeda
私はそれがO )アルゴリズムを使用してスプライスの代わりに重複除外アレイを構築する場合は、 – Adder
@dloedaこのようにforeachを使って反復処理される配列を変更すると、何が起こりますか?インデックスの値が同期していないのでしょうか? – Ben