ホームページ  >  記事  >  ウェブフロントエンド  >  Set.has() が Array.includes() よりも項目の検索が速い理由

Set.has() が Array.includes() よりも項目の検索が速い理由

Susan Sarandon
Susan Sarandonオリジナル
2024-11-06 06:09:03346ブラウズ

Why Set.has() is Faster Than Array.includes() for Finding Items

アプリケーションを構築するとき、特に大規模なデータセットやリアルタイム要件を扱う場合、パフォーマンスが鍵となるか、少なくとも重要な推進力になることがあります。 JavaScript での最も一般的なタスクの 1 つは、コレクションに値が存在するかどうかを確認することです。最もよく使用される 2 つの代替手段は、Array.includes() と Set.has() です。どちらも機能しますが、実際には Set.has() の方が Array.includes よりも機能します。この理由を詳しく調べて、どちらかの代替手段をいつ使用するべきかを判断しましょう。

Array.includes() と Set.has() の理解

使用方法は非常に簡単に見えますが、実装が異なる 2 つのメソッド、つまり Array.includes() と Set.has() があります。

Array.includes()

includes() メソッドは、指定された値が配列内に存在するかどうかを確認します。
O(n) の時間計算量を利用しており、配列の長さが長いほど値のチェックにかかる時間が長くなります。
これは、Array.includes() が配列を最初から最後まで (または値が見つかるまで) 検索し、配列が大きくなるほど時間がかかるためです。

Set.has()

Set の has() メソッドは、指定された値が存在するかどうかもチェックしますが、はるかに高速に実行されます。
Set.has() は、定数時間のルックアップ、つまり O(1) 時間の計算量を可能にするハッシュ テーブル ベースの構造に依存しています。
配列とは異なり、set は一意の値を処理するように構築されているため、内部に重複した値が含まれず、検索時間が長くなります。

大規模なデータセットでは Set.has() の方が高速な理由

Set.has() を使用すると、セット内の項目の数に関係なく、JavaScript は 1 回の直接操作で項目を見つけることができます。たとえば、値が 100 万を含むセット内にあるかどうかをチェックする場合、Set.has() にかかる時間は 10 をチェックする場合とまったく同じになります。

一方、Array.includes() は、目的の項目が見つかるか、最後に到達するまで、各要素を左から右に順番に調べます。つまり、サイズが長くなるほど、特に終わりに近いアイテムの場合や、問題のアイテムがそこにない場合には、チェックに時間がかかることになります。

例を詳しく見てみましょう:

const bigArray = Array.from({ length: 1000000 }, (_, i) => i);
const bigSet = new Set(bigArray);

const valueToFind = 999999;

// Array.includes (O(n)) - Slower for large arrays
console.time("Array.includes");
bigArray.includes(valueToFind);
console.timeEnd("Array.includes");

// Set.has (O(1)) - Faster for large sets
console.time("Set.has");
bigSet.has(valueToFind);
console.timeEnd("Set.has");

これを実行すると、大規模な配列では Set.has() が Array.includes() よりもはるかに優れたパフォーマンスを発揮することがわかります。実際には、その違いはアニメーションのスムーズ化、読み込み時間の短縮、またはサーバー上のリソース使用量の削減につながる可能性があります。

Set.has() と Array.includes() を使用する場合

これはすべて、あなたが何を達成しようとしているかによって異なります。簡単な概要は次のとおりです:

次の場合は Set.has() を使用します。

  • あなたはビッグデータを扱っており、多くの検索を行っています。
  • 一意のユーザー ID、タグ、キーワードのセットなどの一意の値を操作しています。
  • 配列を
  • に変換するための初期費用が少額であっても気にする必要はありません。
  • 後で検索の数を最小限に抑えるように設定します。

次の場合は Array.includes() を使用します。

  • データセットは小さいため、パフォーマンスの差は無視できます。
  • 項目を確認する必要があるのは 1 回か数回だけであるため、セットを作成するメリットはありません。
  • セットでは処理できない重複を扱っています。

使用例

ブロックされた単語のリストに対して名前をフィルターするユーザー検索機能を実装していると想像してください。ブロックされている単語が何百もあり、頻繁に検索している場合は、ブロックされている単語にセットを使用すると、各検索チェックを高速化できます。

const bigArray = Array.from({ length: 1000000 }, (_, i) => i);
const bigSet = new Set(bigArray);

const valueToFind = 999999;

// Array.includes (O(n)) - Slower for large arrays
console.time("Array.includes");
bigArray.includes(valueToFind);
console.timeEnd("Array.includes");

// Set.has (O(1)) - Faster for large sets
console.time("Set.has");
bigSet.has(valueToFind);
console.timeEnd("Set.has");

小規模なケースであっても、セットは物事を効率的かつ予測可能に保つのに役立ちます。さらに、ブロックされる単語のリストが増えても、スケーラブルなソリューションがすでに用意されています。

重要なポイント

  • パフォーマンス: Set.has() は O(1) の時間計算量を提供し、大規模なコレクションの場合は O(n) の Array.includes() よりもはるかに高速になります

  • 適合性: セットは一意の値用に設計されているため、検索用に自然に最適化されます。配列は重複値に対してより柔軟ですが、存在のチェックが遅くなります。

  • スケーラビリティ: データが増加すると、Set.has() は引き続き良好なパフォーマンスを示しますが、Array.includes() は遅くなります。

最終的な考え

Set.has() と Array.includes() のどちらかを選択する場合は、データセットのサイズと性質を理解しておくことが常に重要です。 Array.includes() は小さなデータセットにはまったく問題ありませんが、速度が重要な状況では Set.has() が貴重なツールです。適切なデータ構造は、コードに大きな変更を加えることなく、JavaScript アプリケーションを最適化してより高速かつ効率的にするのに役立ちます。

したがって、そこに何かがあるかどうかを確認していることに気づいたときは、常に自問する必要があります。「それは配列の仕事なのか、それともセットの力を利用できるのか?」これを正しく行うことで、アプリケーションに必要な違いが得られる可能性があります。

以上がSet.has() が Array.includes() よりも項目の検索が速い理由の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。