1. 算法复杂度与优化思路
复杂度主要分为时间复杂度和空间复杂度,是评判算法性能好坏的核心标准。时间复杂度衡量代码执行耗时,主要看循环嵌套层数,常用级别从优到劣为O(1)、O(logn)、O(n)、O(nlogn)、O(n²);空间复杂度衡量算法运行占用的内存空间大小。
日常优化思路主要是:减少多余循环、降低嵌套层数、减少重复计算、合理复用变量、按需申请内存,在时间和空间之间做合理取舍,优先保证算法执行效率。
2. 线性数据结构原理、优缺点及适用场景
数组:连续内存空间存储,支持下标随机访问,查询速度快;缺点是固定长度、扩容麻烦,插入和删除数据需要移动元素,效率低。适合数据量固定、查询多、增删少的场景。
链表:不连续内存,通过指针连接节点,长度动态可扩展,插入删除高效;不支持随机访问,查询需要从头遍历,速度较慢。适合数据频繁增删、动态扩容的场景。
栈:遵循后进先出规则,只能在栈顶操作数据。优点是逻辑简单、安全性高;缺点只能单向操作,灵活性差。常用于方法调用、浏览器回退、括号校验、逆向逻辑处理。
队列:遵循先进先出规则,从队尾入队、队头出队。适合任务排队、消息队列、请求限流、接口排队处理等有序调度场景。
3. 树形数据结构基础
二叉树:每个节点最多只有两个子节点,结构分层存储,主要用于层级数据展示和分层检索。
二叉搜索树:在二叉树基础上增加排序规则,左子树节点值小于根节点,右子树节点值大于根节点,能够有效提升查找效率。
三种遍历方式:前序遍历(根左右)多用于复制树结构;中序遍历(左根右)可输出有序数据;后序遍历(左右根)多用于删除、释放节点资源。
4. 常见排序算法核心逻辑与适配场景
冒泡排序:相邻元素两两比较交换,每轮冒出最大值。逻辑简单、代码易懂,但嵌套循环多,时间复杂度高,适合少量数据排序,数据量大时效率极低。
选择排序:每轮遍历选出最小值,与起始位置交换。相比冒泡减少交换次数,但整体效率依然偏低,仅适用于小规模数据。
插入排序:默认前段有序,逐个将后续元素插入有序区间。数据接近有序时效率很高,稳定性好,适合基本有序、小规模数据。
快速排序:选取基准值,分区递归排序,二分思想缩减排序范围。平均时间复杂度最优,效率最高,是工程最常用排序算法,适合大规模数据排序;缺点是极端场景下性能会退化,且不稳定。
5. 哈希表原理、冲突解决与应用场景
哈希表基于哈希函数,将key映射为数组下标,实现高效增删改查,理想情况下时间复杂度为O(1),查询速度极快。
哈希冲突:不同key算出相同下标,导致数据覆盖冲突。常见解决方式为链地址法、开放地址法,日常底层大多采用链表法解决冲突。
实际应用场景:常用于缓存存储、键值对存储、接口参数映射、去重场景、用户信息存储、Token映射等,是开发和测试中高频接触的数据结构。
6. 数据结构性能对比与业务选型方案
查询优先场景:优先选用数组、哈希表,随机访问速度快,检索效率高。
增删频繁场景:优先选用链表,无需移动大量元素,动态扩容灵活。
顺序排队场景:选用队列,保证任务先进先出,有序执行。
逆向、回溯场景:选用栈,适配后进先出逻辑。
分层、有序检索场景:选用二叉搜索树,兼顾有序性和查询效率。
快速查找、去重、缓存场景:选用哈希表,读写性能最优。
7. 排序算法适配数据规模总结
小规模、数据有序场景:优先插入排序,稳定且高效;
小规模、无序数据:冒泡、选择排序均可,代码简单易实现;
大规模业务数据:统一使用快速排序,综合性能最优,适配绝大多数业务排序需求。
浙公网安备 33010602011771号