ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScript における Big O 表記法と時間計算量を理解する
JavaScript を使用する場合、関数コードを記述することは重要ですが、それが効率的に実行されることを確認することも同様に重要です。ここで Big O Notation が登場します。Big O Notation は、入力のサイズが増加するにつれてコードのパフォーマンスがどのように拡張されるかを分析する方法を提供し、最適化されたスケーラブルなアプリケーションの作成に役立ちます。
この記事では、JavaScript での初心者向けの例を使用して、Big O Notation の基本と一般的な時間計算量について説明します
Big O Notation は、アルゴリズムの効率を記述する数学的表現です。それは次のことを理解するのに役立ちます:
目標は、最悪のシナリオに焦点を当てて、入力サイズの増加に伴うアルゴリズムのパフォーマンスを評価することです。
電話帳で名前を見つけるという任務を与えられているとします。
どちらのアプローチでも問題は解決されますが、電話帳のサイズが大きくなるにつれて効率は大きく異なります。 Big O は、これらのアプローチを比較し、最適なものを選択するのに役立ちます。
以下は Big O の一般的な複雑性であり、JavaScript での実際的な例を示して説明されています。
入力サイズに関係なく、実行時間は変わりません。これらの操作が最も効率的です。
例: インデックスによる配列内の要素へのアクセス。
const numbers = [10, 20, 30, 40, 50]; console.log(numbers[2]); // Always takes the same time, no matter the array size
入力サイズが増加すると、ランタイムは対数的に増加します。これは、二分探索などの分割統治アルゴリズムでよく発生します。
例: ソートされた配列の二分検索。
function binarySearch(arr, target) { let start = 0; let end = arr.length - 1; while (start <= end) { const mid = Math.floor((start + end) / 2); if (arr[mid] === target) { return mid; } else if (arr[mid] < target) { start = mid + 1; // Search the right half } else { end = mid - 1; // Search the left half } } return -1; // Target not found } const arr = [1, 3, 5, 7, 9]; console.log(binarySearch(arr, 7)); // Output: 3
ランタイムは入力サイズに比例して増加します。これは、各要素を 1 回調べる必要がある場合に発生します。
例: ソートされていない配列内の項目を検索します。
function linearSearch(arr, target) { for (let i = 0; i < arr.length; i++) { if (arr[i] === target) { return i; // Found } } return -1; // Not found } const items = [10, 20, 30, 40, 50]; console.log(linearSearch(items, 30)); // Output: 2
入力サイズが増加するにつれて、ランタイムは二次関数的に増加します。これは、入れ子になったループを含むアルゴリズムでは一般的です。
例: 基本的なバブル ソートの実装。
const numbers = [10, 20, 30, 40, 50]; console.log(numbers[2]); // Always takes the same time, no matter the array size
入力が追加されるたびに実行時間は 2 倍になります。これは、考えられるすべての解決策を考慮して問題を再帰的に解決するアルゴリズムで発生します。
例: フィボナッチ数を再帰的に計算します。
function binarySearch(arr, target) { let start = 0; let end = arr.length - 1; while (start <= end) { const mid = Math.floor((start + end) / 2); if (arr[mid] === target) { return mid; } else if (arr[mid] < target) { start = mid + 1; // Search the right half } else { end = mid - 1; // Search the left half } } return -1; // Target not found } const arr = [1, 3, 5, 7, 9]; console.log(binarySearch(arr, 7)); // Output: 3
入力サイズの増加に伴う Big O の複雑さの違いを比較すると次のようになります。
Big O | Name | Example Use Case | Growth Rate |
---|---|---|---|
O(1) | Constant | Array access | Flat |
O(log n) | Logarithmic | Binary search | Slow growth |
O(n) | Linear | Looping through an array | Moderate growth |
O(n²) | Quadratic | Nested loops | Rapid growth |
O(2ⁿ) | Exponential | Recursive brute force | Very fast growth |
問題を解決しているときに入力サイズが増大すると想像してください。入力サイズの増加に応じて、さまざまな複雑さのアルゴリズムがどのように拡張されるかを次に示します。
Input Size | O(1) | O(log n) | O(n) | O(n²) | O(2ⁿ) |
---|---|---|---|---|---|
1 | 1 ms | 1 ms | 1 ms | 1 ms | 1 ms |
10 | 1 ms | 3 ms | 10 ms | 100 ms | ~1 sec |
100 | 1 ms | 7 ms | 100 ms | 10 sec | ~centuries |
1000 | 1 ms | 10 ms | 1 sec | ~17 min | Unrealistic |
シンプルなカウンターを使用して、さまざまな複雑さの操作の数を視覚化する方法を次に示します。
const numbers = [10, 20, 30, 40, 50]; console.log(numbers[2]); // Always takes the same time, no matter the array size
Big O Notation は、アルゴリズムの効率を評価し、コードがどのように拡張されるかを理解するために不可欠なツールです。基本を理解し、一般的なパターンを分析することで、パフォーマンスの高い JavaScript アプリケーションを作成できるようになります。
コーディングを楽しんでください! ?
以上がJavaScript における Big O 表記法と時間計算量を理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。