使用 JavaScript 時,編寫函數式程式碼很重要,但確保其高效運作也同樣重要。這就是 Big O 表示法的用武之地。它提供了一種方法來分析程式碼的效能如何隨著輸入大小的增加而擴展,從而幫助您編寫最佳化且可擴展的應用程式。
本文將透過 JavaScript 中適合初學者的範例來探索 Big O 表示法和常見時間複雜度的基礎知識
大O表示法是描述演算法效率的數學表示形式。它幫助我們理解:
目標是評估演算法隨著輸入大小的增長而表現如何,並專注於最壞的情況。
假設您的任務是在電話簿中找出姓名:
兩種方法都可以解決問題,但是隨著電話簿大小的增長,它們的效率差異很大。 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
運行時間與輸入大小成比例增長。當您需要檢查每個元素一次時,就會發生這種情況。
範例:在未排序的陣列中尋找項目。
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
每增加一個輸入,運行時間就會加倍。這種情況發生在遞歸解決問題的演算法中,考慮所有可能的解決方案。
範例:遞歸計算斐波那契數。
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
大 O 表示法是評估演算法效率和了解程式碼擴充方式的重要工具。透過掌握基礎知識並分析常見模式,您將能夠很好地編寫高效能的 JavaScript 應用程式。
編碼愉快! ?
以上是理解 JavaScript 中的大 O 表示法和時間複雜度的詳細內容。更多資訊請關注PHP中文網其他相關文章!