用一句话理解数据结构: 数据结构 = 数据 + 结构 = 数据怎么存 + 怎么取、怎么用。
数组/链表:基础骨架
栈/队列:控制顺序
树:用来快速查找、排序
哈希表:用来极速查找
图:描述复杂关系
主要用来解决 3 个核心问题:
1. 数据怎么放最省空间
2. 数据怎么找最快
3. 数据怎么增删改最方便
最核心的 4 类数据结构
一. 线性结构:像排队一样
1.数组(Array)
一段连续内存
优点:随机访问快,下标直接找
缺点:插入、删除慢,大小固定
2.链表(LinkedList)
数据分散,靠指针连在一起
优点:插入、删除快
缺点:不能随机访问,要从头找
3.栈(Stack)
先进后出(LIFO)
典型场景:函数调用、括号匹配、递归
4.队列(Queue)
先进先出(FIFO)
典型场景:排队、消息队列、任务调度
二. 树形结构:像家族树
1.二叉树
每个节点最多两个孩子
2.二叉搜索树 BST
左小右大,用来快速查找
3.平衡二叉树(AVL、红黑树)
防止树歪掉,保证查找稳定
C++ STL map、set 底层就是红黑树
4.堆(Heap)
完全二叉树
最大堆 / 最小堆
用途:优先队列、堆排序、TOP-K
三. 哈希结构:查得最快的神器
1.哈希表(Hash Table)
key → 哈希函数 → 下标
平均:O(1) 增删改查
缺点:会冲突,要处理(链地址、开放地址)
四. 图结构:最复杂、最真实
节点 + 边
有向图、无向图、有权图
核心算法:BFS 广度优先、DFS 深度优先、最短路径(Dijkstra、Floyd)、最小生成树
数据结构的灵魂:时间复杂度
最常用的几个
O(1):常数级,最快
O(log n):对数级,非常快(二分、树)
O(n):线性,还行(遍历)
O(n²):平方,很慢(暴力)