T(n) = O(f(n))
表示代码执行时间随数据规模增长的变化趋势
例如:T(n)=O(2n2 + 2n + 3)
$$ log_3(n)=log_3(2)*log_2(n) $$
$$ \frac{log_3(n)}{log_3(2)}=log_2(n) $$
对数换底公式如下:
$$ log_a(b)=\frac{log_c(b)}{log_c(a)} $$
$$ log_c(b)=log_c(a)*log_a(b) $$
$$ log_c(a)=\frac{log_c(b)}{log_a(b)} $$
深度优先搜索(DFS)和广度优先搜索(BFS)是两种常用的图遍历算法,它们的时间复杂度通常都是O(V + E),其中V是顶点数,E是边数。这是因为在最坏的情况下,每个顶点和每条边都会被访问一次。然而,空间复杂度可能有所不同:
这些算法展示了常见的时间复杂度类别:
function findMax(arr: number[]): number {
let max = arr[0];
for (let i = 1; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
const array = [1, 3, 5, 7, 9];
console.log(findMax(array)); // 输出:9
二分搜索,在已经排序的数组内找到指定的元素。通过目标值与数组中间元素的比较,可以每次把搜索范围缩小一半。
算法复杂度分析:
function binarySearch(arr: number[], target: number): number {
let left = 0;
let right = arr.length - 1;
while (left <= right) {
let mid = Math.floor((left + right) / 2);
if (arr[mid] === target) {
return mid;
} else if (arr[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
const sortedArray = [1, 2, 3, 4, 5, 6, 7, 8, 9];
console.log(binarySearch(sortedArray, 4)); // 输出:3
归并排序的思路是把一个大问题分成多个小问题来解决。然后将小问题合并。
复杂度分析:
function mergeSort(arr: number[]): number[] {
const length = arr.length;
if (length <= 1) return arr;
const middle = Math.floor(length / 2);
const left = mergeSort(arr.slice(0, middle));
const right = mergeSort(arr.slice(middle));
const merged = merge(left, right);
return merged;
}
function merge(left: number[], right: number[]): number[] {
const result: number[] = [];
let i = 0;
let j = 0;
while (left.length > i && right.length > j) {
if (left[i] < right[j]) {
result.push(left[i]);
i++;
} else {
result.push(right[j]);
j++;
}
}
while (left.length > i) {
result.push(left[i]);
i++;
}
while (right.length > j) {
result.push(right[j]);
j++;
}
return result;
}
console.log(mergeSort([3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]));
// 输出:[1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]
function bubbleSort(arr: number[]): number[] {
for (let i = 0; i < arr.length; i++) {
for (let j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
let temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return arr;
}
console.log(bubbleSort([5, 3, 8, 4, 2])); // 输出:[2, 3, 4, 5, 8]
function fibonacci(n: number): number {
if (n <= 1) {
return n;
}
return fibonacci(n - 1) + fibonacci(n - 2);
}
console.log(fibonacci(10)); // 输出:55
我们常见的空间复杂度就是 O(1)、O(n)、O(n2),像 O(logn)、O(nlogn) 这样的对数阶复杂度平时都用不到。
如果您有任何问题、建议或合作意向,欢迎通过此表单与我联系。我会尽快回复您的留言。