時間複雜度和空間複雜度計算
阿新 • • 發佈:2020-03-20
## 先來看下度孃的演算法複雜度百科
演算法複雜度分為時間複雜度和空間複雜度。其作用: 時間複雜度是指執行演算法所需要的計算工作量;而空間複雜度是指執行這個演算法所需要的記憶體空間。(演算法的複雜性體執行該演算法時的計算機所需資源的多少上,計算機資源最重要的是時間和空間(即暫存器)資源,因此複雜度分為時間和空間複雜度。)
## 時間複雜度的計算方法
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