数据结构和算法重点概念

来自:小麦

数据结构

  • 数组(Array):

    • 逻辑结构:线性,元素类型相同。

    • 存储方式:一段连续内存,支持 O(1) 随机访问。

    • 更新成本:插入/删除需整体搬移元素,平均 O(n);容量固定,扩容需重新分配与拷贝。

    • 适用场景:元素数量可预估、以读为主或需频繁按下标访问的场合,如矩阵运算、哈希表桶、静态查找表。

  • 链表(Linked List):

    • 逻辑结构:线性,通过节点指针维持次序。

    • 存储方式:内存非连续,节点“见缝插针”。

    • 更新成本:已知前驱节点时插入/删除 O(1);访问必须顺序遍历,O(n)。

    • 适用场景:数据量动态变化大、以插入/删除为主且不需随机访问的场合,如 LRU 缓存、多项式表示、内存池管理。

  • 栈(Stack):

    • 逻辑结构:LIFO 线性表,仅栈顶可进出。

    • 核心操作:push / pop,时间复杂度均为 O(1)。

    • 适用场景:函数调用链、表达式求值、括号匹配、深度优先搜索(DFS)、浏览器历史记录。

  • 队列(Queue):

    • 逻辑结构:FIFO 线性表,队尾入、队头出。

    • 核心操作:enqueue / dequeue,时间复杂度均为 O(1)。

    • 适用场景:任务调度、消息缓冲、广度优先搜索(BFS)、打印队列、生产者-消费者模型。

  • 字符串(String):

    • 逻辑结构:元素为字符的线性序列,通常以数组或链表实现。

    • 常见操作:模式匹配(KMP、BM)、子串查找、前缀树索引。

    • 适用场景:文本处理、编译器词法分析、搜索引擎、正则引擎。

  • 树(Tree):

    • 逻辑结构:非线性层次结构,每个节点最多两个子树。

    • 重要变型:BST(搜索)、AVL/红黑树(平衡)、堆(优先队列)、Trie(前缀树)。

    • 遍历方式:前序、中序、后序、层序,时间 O(n)。

    • 适用场景:

      • 搜索与排序:二叉搜索树、堆排序

      • 表达式解析:语法树

      • 哈夫曼编码:最优前缀码

      • 索引结构:B+/B- 树在数据库与文件系统

  • 图(Graph):

    • 逻辑结构:非线性,顶点+边,可带权/有向。

    • 存储方式:邻接矩阵 O(V²)、邻接表 O(V+E)。

    • 核心算法:

      • 遍历:DFS、BFS

      • 最短路径:Dijkstra、Floyd-Warshall、A*

      • 最小生成树:Prim、Kruskal

      • 拓扑排序、关键路径、最大流

    • 适用场景:社交网络、路径规划、电路布线、依赖解析、推荐系统。

算法

算法的分类:

  • 排序算法:

    • 如快速排序、归并排序、堆排序、插入排序等,需理解其原理、时间复杂度及稳定性。
  • 查找算法:

    • 包括顺序查找、二分查找、哈希查找等,重点理解二分查找的前提条件和哈希冲突的处理。
  • 图算法与树算法:

    • 如深度优先搜索(DFS)、广度优先搜索(BFS)、最短路径(Dijkstra)、最小生成树(Prim/Kruskal)以及二叉树的遍历(前序、中序、后序、层序)

算法复杂度(大 O 表示法):

  • 时间复杂度:

    • 它描述了算法执行所需的时间随输入规模增长的变化趋势。

    • O(1)(常数阶)< O(log n)(对数阶)< O(n)(线性阶)< O(n log n)(线性对数阶)< O(n²)(平方阶) < O(2ⁿ)(指数阶)

  • 空间复杂度:

    • 它衡量的是算法在运行过程中临时占用存储空间大小的增长情况。同样用大O符号表示,关注的是随着输入规模增加,算法所需的额外内存空间的变化趋势。