常用数据结构
以下是计算机科学中常用数据结构的分类整理,涵盖基础概念、操作复杂度、应用场景及代码示例:
1. 数组(Array)
-
定义:连续内存空间存储相同类型元素,支持随机访问。
-
操作复杂度:
-
访问:
O(1) -
插入/删除:
O(n)(需移动元素)
-
-
应用场景:快速查找、缓存、矩阵运算。
-
代码示例:
arr = [1, 2, 3, 4] print(arr[2]) # 输出3(索引从0开始)
2. 链表(Linked List)
-
定义:节点通过指针连接,分为单向链表和双向链表。
-
操作复杂度:
-
插入/删除:
O(1)(已知位置时) -
查找:
O(n)
-
-
应用场景:高频插入删除(如LRU缓存、浏览器历史记录)。
-
代码示例(单向链表节点):
class Node: def __init__(self, val): self.val = val self.next = None head = Node(1) head.next = Node(2)
3. 栈(Stack)
-
定义:后进先出(LIFO),仅允许在栈顶操作。
-
核心操作:
-
push():入栈(O(1)) -
pop():出栈(O(1))
-
-
应用场景:函数调用栈、括号匹配、撤销操作。
-
代码示例(Python列表模拟):
stack = [] stack.append(1) # push top = stack.pop() # pop
4. 队列(Queue)
-
定义:先进先出(FIFO),队尾插入,队头删除。
-
变种:
-
双端队列(Deque):两端均可操作。
-
优先队列(Priority Queue):按优先级出队(基于堆实现)。
-
-
操作复杂度:
- 入队/出队:
O(1)(普通队列)或O(logn)(优先队列)
- 入队/出队:
-
应用场景:任务调度、消息队列、BFS算法。
-
代码示例(Python
deque):from collections import deque q = deque() q.append(1) # 入队 front = q.popleft() # 出队
5. 树(Tree)
-
常见类型:
-
二叉树(Binary Tree):每个节点最多两个子节点。
-
二叉搜索树(BST):左子树值 < 根 < 右子树值(查找
O(logn),退化为链表时O(n))。 -
平衡树(AVL/红黑树):自动平衡,保证操作
O(logn)。 -
堆(Heap):完全二叉树,根节点为最大(大顶堆)或最小(小顶堆)值。
-
-
应用场景:
-
BST:动态有序数据(如数据库索引)。
-
堆:优先队列、Top K问题。
-
Trie树:字典检索、自动补全。
-
-
代码示例(二叉树节点):
class TreeNode: def __init__(self, val): self.val = val self.left = None self.right = None
6. 图(Graph)
-
定义:由顶点(Vertex)和边(Edge)组成,分为有向图和无向图。
-
存储方式:
-
邻接矩阵:适合稠密图,查询边存在性
O(1)。 -
邻接表:适合稀疏图,节省空间。
-
-
应用场景:社交网络、路径规划(如Dijkstra算法)、推荐系统。
-
代码示例(邻接表):
graph = { 'A': ['B', 'C'], 'B': ['D'], 'C': [], 'D': [] }
7. 哈希表(Hash Table)
-
定义:通过哈希函数将键映射到值,解决冲突的方法包括:
-
链地址法:冲突元素组成链表。
-
开放寻址法:探测下一个空槽。
-
-
操作复杂度:
- 插入/删除/查找:平均
O(1),最坏O(n)(哈希冲突严重时)。
- 插入/删除/查找:平均
-
应用场景:快速查找(如字典、缓存、数据库索引)。
-
代码示例(Python字典):
hash_map = {} hash_map["name"] = "Alice" # 插入 print(hash_map.get("name")) # 查找
8. 集合(Set)
-
定义:存储唯一元素,支持并集、交集等操作。
-
底层实现:通常基于哈希表或平衡树。
-
操作复杂度:
- 插入/删除/查找:平均
O(1)(哈希表)或O(logn)(平衡树)。
- 插入/删除/查找:平均
-
应用场景:去重、成员检测(如敏感词过滤)。
-
代码示例:
s = set() s.add(1) print(1 in s) # True
对比总结
| 数据结构 | 优势 | 劣势 | 典型应用 |
|------------|-------------------------------|-------------------------------|-----------------------|
| 数组 | 快速随机访问 | 插入/删除效率低 | 矩阵运算、缓存 |
| 链表 | 高效插入/删除 | 无法快速随机访问 | LRU缓存、浏览器历史 |
| 哈希表 | 平均O(1)的增删查 | 内存占用高,无序存储 | 字典、数据库索引 |
| 二叉搜索树 | 有序数据快速查找 | 可能退化为链表 | 数据库索引、有序Map |
| 堆 | 快速获取最大/最小值 | 仅能访问根节点 | 优先队列、任务调度 |
高级数据结构(扩展)
-
跳表(Skip List):多层链表加速查找(Redis有序集合底层实现)。
-
并查集(Union-Find):高效处理集合合并与查询(如社交网络连通性)。
-
布隆过滤器(Bloom Filter):空间高效的概率型数据结构(缓存穿透防护)。
学习建议
-
理解原理:动手实现每个数据结构(如用Python编写链表、哈希表)。
-
刷题巩固:LeetCode/HackerRank练习(如《剑指Offer》经典题)。
-
分析场景:根据问题需求选择最优数据结构(如高频查询用哈希表,有序需求用树)。
-
扩展阅读:《算法导论》《数据结构与算法分析》等经典书籍。