01 | 常用数据结构及其特点

面试官您好,常用的数据结构是程序设计和算法实现的基础。它们在存储方式、访问效率、适用场景上各有特点。下面我从 线性结构、树形结构、图、哈希结构 四大类进行系统梳理,并附上核心特性与典型应用。


✅ 一、线性结构(Linear)

1. 数组(Array)
  • 存储:连续内存空间
  • 特点
    • 随机访问快:O(1)
    • 插入/删除慢:O(n)(需移动元素)
    • 大小固定(静态数组)
  • 应用:缓存、矩阵、底层容器(如 ArrayList)
2. 链表(Linked List)
  • 存储:节点分散,通过指针连接
  • 类型:单向、双向、循环
  • 特点
    • 插入/删除快:O(1)(已知位置)
    • 访问慢:O(n)
    • 内存开销大(存指针)
  • 应用:LRU 缓存(LinkedHashMap 底层)、邻接表
3. 栈(Stack)
  • 原则:后进先出(LIFO)
  • 操作push, pop, peek
  • 实现:数组 or 链表
  • 应用:函数调用栈、表达式求值、括号匹配
4. 队列(Queue)
  • 原则:先进先出(FIFO)
  • 变种
    • 双端队列(Deque):两端可进出
    • 优先队列(PriorityQueue):按优先级出队(堆实现)
  • 应用:BFS、任务调度、消息队列

✅ 二、树形结构(Tree)

1. 二叉树(Binary Tree)
  • 每个节点最多两个子节点
2. 二叉搜索树(BST)
  • 性质:左 < 根 < 右
  • 操作:查找/插入/删除平均 O(log n),最坏退化为 O(n)
3. 平衡二叉树(AVL / 红黑树)
  • 目的:防止 BST 退化,保持高度平衡
  • 红黑树特点
    • 近似平衡(最长路径 ≤ 2×最短路径)
    • 插入/删除旋转少,性能稳定
  • 应用TreeMapTreeSet、C++ STL map
4. 堆(Heap)
  • 性质:完全二叉树,父 ≥ 子(大顶堆)或 父 ≤ 子(小顶堆)
  • 操作:建堆 O(n),插入/删除 O(log n)
  • 应用:优先队列、Top-K 问题、堆排序
5. Trie 树(前缀树)
  • 特点:按字符路径存储字符串
  • 优势:前缀匹配极快
  • 应用:搜索引擎 autocomplete、IP 路由

✅ 三、哈希结构(Hash-based)

哈希表(Hash Table)
  • 原理:通过哈希函数将 key 映射到数组下标
  • 冲突处理
    • 链地址法(Java HashMap)
    • 开放寻址法(Python dict)
  • JDK 8+ 优化:链表长度 > 8 → 转红黑树
  • 复杂度:平均 O(1),最坏 O(n)
  • 应用:缓存(Redis)、去重、字典

✅ 四、图(Graph)

  • 表示方式
    • 邻接矩阵:适合稠密图,空间 O(V²)
    • 邻接表:适合稀疏图,空间 O(V+E)
  • 遍历算法
    • DFS(深度优先):递归/栈,用于连通性、拓扑排序
    • BFS(广度优先):队列,用于最短路径(无权图)
  • 应用:社交网络、路径规划、依赖分析

✅ 五、对比总结表

数据结构查找插入删除有序典型应用场景
数组O(1)O(n)O(n)随机访问、缓存
链表O(n)O(1)O(1)频繁增删、LRU
-O(1)O(1)LIFO表达式计算
队列-O(1)O(1)FIFOBFS、任务调度
哈希表O(1)O(1)O(1)去重、缓存
BSTO(log n)O(log n)O(log n)动态排序
红黑树O(log n)O(log n)O(log n)TreeMap
O(1)(顶)O(log n)O(log n)部分有序Top-K、优先队列
----社交关系、路径

✅ 六、选择建议

  • 需要快速查找? → 哈希表
  • 需要有序 + 动态增删? → 红黑树
  • 求 Top-K? → 堆
  • 处理字符串前缀? → Trie
  • 表示关系网络? → 图

✅ 总结一句话:

数据结构是算法的基石,没有“最好”,只有“最合适”——根据时间/空间复杂度需求和业务场景选择,才能写出高效代码。

谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

走过冬季

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值