1. 程式人生 > >時間複雜度和空間複雜度計算

時間複雜度和空間複雜度計算

## 先來看下度孃的演算法複雜度百科 演算法複雜度分為時間複雜度和空間複雜度。其作用: 時間複雜度是指執行演算法所需要的計算工作量;而空間複雜度是指執行這個演算法所需要的記憶體空間。(演算法的複雜性體執行該演算法時的計算機所需資源的多少上,計算機資源最重要的是時間和空間(即暫存器)資源,因此複雜度分為時間和空間複雜度。) ## 時間複雜度的計算方法 1. 找到基本語句,通常是迴圈; 2. 保留最高次冪且忽略係數; 3. 用大O符號表述。 常見的演算法時間複雜度排列為: O(1) < O(logn) < O(n) < O(n*logn) < O(n^2) < O(n^3) < ... < O(2^n) < O(3^n) < ... < O(n!) ### 例子: 時間複雜度 O(1) ```js function fun(n) { console.log('Hello, World!'); } // O(1) ``` ### 例子: 時間複雜度 O(n) ```js function fun(n) { for (var i = 0; i < n; i++) { // 迴圈次數為 n console.log('Hello, World!'); // 迴圈體複雜度為 O(1) } } // O(n*1) -> O(n) ``` ### 例子: 時間複雜度 O(n^2) ```js function fun(n) { for (var i = 0; i < n; i++) { // 迴圈次數為 n for (var j = 0; j < n; j++) { // 迴圈次數為 n console.log('Hello, World!'); // 迴圈體複雜度為 O(1) } } } // O(n*n*1) -> O(n^2) ``` ### 例子: 保留最高次冪且忽略係數 ```js // 保留最高次冪且忽略係數 function fun(n) { for (var i = 0; i < n; i++) { // 迴圈次數為 n console.log('Hello, World!'); // 迴圈體複雜度為 O(1) } for (var i = 0; i < n; i++) { // 迴圈次數為 n for (var j = 0; j < n; j++) { // 迴圈次數為 n console.log('Hello, World!'); // 迴圈體複雜度為 O(1) } } for (var i = 0; i < n; i++) { // 迴圈次數為 n for (var j = 0; j < n; j++) { // 迴圈次數為 n console.log('Hello, World!'); // 迴圈體複雜度為 O(1) } } } // O(n, 2n^2) -> O(n^2) ``` ### 例子: 概率 ```js function fun() { while (Math.random() < 0.5) { // Math.rendom [0,1) 期望值為2 console.log('Hello, World!'); // 迴圈體複雜度為 O(1) } return true; } // O(2*1) -> 忽略係數2 -> O(1) ``` ## 空間複雜度計算方法 空間複雜度是指執行這個演算法所需要的記憶體空間。 常見的空間複雜度只有 O(1)、O(n)、O(n^2)。 ### 例子: 空間複雜度 O(1) ```js function fun(n) { var num = n + 1; return num; } // O(1) ``` ### 例子: 空間複雜度 O(n) ```js function fun(n) { var arr = new Array(n).fill('0'); return arr; } // O(n) 陣列的長度根據 n 變化 ``` ### 例子: 空間複雜度 O(n^2) ```js function fun(n) { var arr = []; for (var i = 0; i < n; i++) { arr[i] = []; for (var j = 0; j < n; j++) { arr[i][j] = j; } } return arr; } // O(n^2) ``` ## JavaScript常見演算法的時間複雜度和空間複雜度 | Name | Best | Average | Worst | Memory | Stable | |-|-|-|-|-|-| |氣泡排序|n|n^2|n^2|1|Yes| |選擇排序|n^2|n^2|n^2|1|No| |插入排序|n|n^2|n^2|1|Yes| |堆排序|n*log(n)|n*log(n)|n*log(n)|1|No| |歸併排序|n*log(n)|n*log(n)|n*log(n)|n|Yes| |快速排序|n*log(n)|n*log(n)|n^2|log(n)|No