97 lines
2.0 KiB
Markdown
97 lines
2.0 KiB
Markdown
# 1-复杂度
|
|
|
|
* 时间复杂度: 算法运行**时间**随输入规模增长的变化趋势, 关注运行效率
|
|
* 空间复杂度: 算法在运行过程中所需的额外**内存空间**随输入规模增长的变化趋势, 关注内存占用
|
|
|
|
## 常见的时间复杂度
|
|
|
|
### O (1) 常数
|
|
|
|
> 示例:访问数组中的某个元素。算法的执行时间不随输入规模变化
|
|
|
|
```js
|
|
function getFirstElement(arr) {
|
|
return arr[0];
|
|
}
|
|
```
|
|
|
|
### O (log n) 对数
|
|
|
|
> 示例:二分查找。
|
|
|
|
```js
|
|
function binarySearch(arr, target) {
|
|
let left = 0, right = arr.length - 1;
|
|
while (left <= right) {
|
|
let mid = Math.floor((left + right) / 2);
|
|
if (arr[mid] === target) return mid;
|
|
if (arr[mid] < target) left = mid + 1;
|
|
else right = mid - 1;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
```
|
|
|
|
### O (n) 线性
|
|
|
|
> 示例:遍历数组
|
|
|
|
```js
|
|
function findMax(arr) {
|
|
let max = arr[0];
|
|
for (let i = 1; i < arr.length; i++) {
|
|
if (arr[i] > max) max = arr[i];
|
|
}
|
|
return max;
|
|
}
|
|
```
|
|
|
|
### O(n log n) 线性对数
|
|
|
|
> 示例:快速排序、归并排序
|
|
|
|
```js
|
|
function quickSort(arr) {
|
|
if (arr.length <= 1) return arr;
|
|
let pivot = arr[0];
|
|
let left = [], right = [];
|
|
for (let i = 1; i < arr.length; i++) {
|
|
if (arr[i] < pivot) left.push(arr[i]);
|
|
else right.push(arr[i]);
|
|
}
|
|
return [...quickSort(left), pivot, ...quickSort(right)];
|
|
}
|
|
```
|
|
|
|
### O(n²) 平方
|
|
|
|
> 示例:冒泡排序、选择排序
|
|
|
|
```js
|
|
function bubbleSort(arr) {
|
|
let n = arr.length;
|
|
for (let i = 0; i < n - 1; i++) {
|
|
for (let j = 0; j < n - 1 - i; j++) {
|
|
if (arr[j] > arr[j + 1]) {
|
|
// 交换元素
|
|
let temp = arr[j];
|
|
arr[j] = arr[j + 1];
|
|
arr[j + 1] = temp;
|
|
}
|
|
}
|
|
}
|
|
return arr;
|
|
}
|
|
```
|
|
|
|
### O(2ⁿ)
|
|
|
|
> 示例:递归计算斐波那契数列
|
|
|
|
```js
|
|
function fibonacci(n) {
|
|
if (n <= 1) return n;
|
|
return fibonacci(n - 1) + fibonacci(n - 2);
|
|
}
|
|
``` |