返回

前端算法入门二:时间空间复杂度和 8 大数据结构的 JavaScript 实现

前端

导语

算法是计算机科学中重要的组成部分,它提供了一套解决问题的方法。对于前端开发者来说,掌握基本算法知识非常有必要,不仅可以提升代码质量,更能提升解决问题的能力。本文将深入浅出地介绍算法的时间复杂度和空间复杂度,以及算法题中涉及的 8 大常见数据结构,并给出相应的 JavaScript(TypeScript)实现代码,还罗列其使用场景,以及相关 LeetCode 题目。

时间复杂度和空间复杂度

时间复杂度

时间复杂度衡量算法执行所需的时间。通常用大 O 符号表示,算法在输入数据规模 n 趋于无穷大时的执行时间。

时间复杂度
O(1) 常数时间,与输入规模无关
O(log n) 对数时间,随着输入规模增加,执行时间以对数级增长
O(n) 线性时间,随着输入规模增加,执行时间以线性级增长
O(n^2) 平方时间,随着输入规模增加,执行时间以平方级增长
O(2^n) 指数时间,随着输入规模增加,执行时间以指数级增长

空间复杂度

空间复杂度衡量算法执行所需的空间。通常也用大 O 符号表示,描述算法在输入数据规模 n 趋于无穷大时所需的内存空间。

空间复杂度 描述
O(1) 常数空间,与输入规模无关
O(log n) 对数空间,随着输入规模增加,所需空间以对数级增长
O(n) 线性空间,随着输入规模增加,所需空间以线性级增长
O(n^2) 平方空间,随着输入规模增加,所需空间以平方级增长

8 大数据结构

数组

数组是一种有序的数据结构,其中元素按索引存储。数组支持快速查找和插入,但在删除或修改元素时效率较低。

场景: 存储有序列表或集合

LeetCode 题目:

链表

链表是一种线性数据结构,其中元素通过指针连接。链表支持快速插入和删除,但查找元素的效率较低。

场景: 存储元素顺序无关且需要频繁修改的列表

LeetCode 题目:

栈是一种后进先出 (LIFO) 数据结构,其中元素按插入顺序存储。栈支持快速压入和弹出元素。

场景: 函数调用、回溯算法

LeetCode 题目:

队列

队列是一种先进先出 (FIFO) 数据结构,其中元素按插入顺序存储。队列支持快速入队和出队元素。

场景: 任务处理、消息传递

LeetCode 题目:

哈希表

哈希表是一种基于键值对的数据结构,其中键映射到值。哈希表支持快速查找、插入和删除元素。

场景: 快速查找或查询数据

LeetCode 题目:

集合

集合是一种不包含重复元素的数据结构。集合支持快速查找、插入和删除元素。

场景: 存储唯一元素或集合运算

LeetCode 题目:

树是一种分层数据结构,其中每个节点都有一个父节点和零个或多个子节点。树支持快速查找、插入和删除元素。

场景: 层次结构、搜索或排序

LeetCode 题目:

图是一种非线性数据结构,其中元素称为顶点,它们通过边连接。图支持查找、遍历和路径搜索。

场景: 社交网络、地图导航

LeetCode 题目:

总结

理解算法的时间复杂度和空间复杂度对于优化算法性能至关重要。掌握常见数据结构的使用场景和实现方法,可以提升代码效率和可维护性。本文提供了前端算法入门的基础知识,希望对你有所帮助。如果你有更深入的问题,欢迎在评论区讨论。