❤️ 前面已经解释了什么是算法? 其实就是解决问题的一系列步骤操作、逻辑。
✅ 对于同一个问题,我们往往有很多种解决思路和方法,也就是可以采用不同的算法。
举个例子(现实例子):在一个庞大的图书馆中,我们需要找一本书
方式一:顺序查找
方式二:先分类找,分类中找这本书
方式三:找到检索电脑,查找书的位置,直到找到
在具体一个程序中的案例:让我们用两种不同算法查找数组中(数组有序)给定元素的复杂度
/**
- 顺序查找
- @param array 查找的数组
- @param 查找的元素
- @returns 查找到的索引,未找到返回-1
*/
function sequentSearch(array: number[], num: number) {
for (let i = 0; i < array.length; i++) {
const element = array[i];
if (element === num) return i;
}
return -1;
}
const index = sequentSearch([1, 3, 5, 10, 100, 222, 333, 334, 555, 556], 222);
console.log(index);
✅ 方式二:二分查找
function binarySearch(array: number[], num: number) {
// 1. 定义左右索引
let left = 0;
let right = array.length - 1;
// 2.开始查找
while (left <= right) {
let mid = Math.floor((left + right) / 2);
const midNum = array[mid];
if (midNum === num) {
return mid;
} else if (midNum < num) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
const index = binarySearch([1, 3, 5, 10, 100, 222, 333, 334, 555, 556], 222);
console.log(index);
export {};
npm install hy-algokit
import sequentSearch from './01_查找算法-顺序查找';
import binarySearch from './02_查找算法-二分查找';
import { testOrderSearchEfficiency } from 'hy-algokit';
testOrderSearchEfficiency(sequentSearch);
testOrderSearchEfficiency(binarySearch);
❤️ 顺序查找算法的时间复杂度是 O(n)
❤️ 二分查找算法的时间复杂度是 O(log n)
T(n)= 4n⌃2^ - 2n + 2
**n
增大 时, n^2^
项开始 占据主导地位,其他各项可以被忽略。n = 500
✓ 4n2 项是 2n 项的 1000倍大,因此在大多数场合下, 省略后者对表达式的值的影响将是乐意忽略不计的。
进一步,如果我们与任一其他级的表达式比较, n2的系数也是无关紧要的的。
这样,针对第一个例子, T(n)= 4 n2 - 2n + 2,大O符号就记下剩余的部分,写作:
T(n) ∈ O(n2)
或者
T(n) = O(n2)
符号 | 名称 |
---|---|
O(1) | 常数(阶、下同) |
O(log n) | 对数 |
O(n) | 线性、次线性 |
O(n log n) | 线性对数、或者对数线性、拟线性、超线性 |
O(n2) | 平方 |
O(n2) , Interger(c > 1) | 多项式,有时叫作‘代数’(阶) |
O(cn) | 指数,有时叫作“几何”(阶) |
空间复杂度指的是,程序运行过程中所需要的额外存储空间。
:举例
当空间复杂度很大时,可能会导致内存不足,程序崩溃。
在平时进行算法优化时,我们通常会进行如下考虑:
Data Structure | Access | Search | Insertion | Deletion |
---|---|---|---|---|
Array | O(1) |
O(N) |
O(N) |
O(N) |
Linked List | O(N) |
O(N) |
O(1) |
O(1) |
数组是一种连续的存储结构,通过下标可以直接访问数组中的任意元素。
链表,是一种链式存储结构,通过指针链接起来的节点组成,访问链表中元素需要从头结点开始遍历
在实际开发中,选择使用数组还是链表需要根据具体应用场景来决定
【数据结构与算法——TypeScript】系列笔记:
1. 【数据结构与算法——TypeScript】数组、栈、队列、链表