2025-03-29 14:35:49 +08:00

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);
}
```