常用数据结构

159 阅读4分钟

常用数据结构

以下是计算机科学中常用数据结构的分类整理,涵盖基础概念、操作复杂度、应用场景及代码示例:


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 |

| | 快速获取最大/最小值 | 仅能访问根节点 | 优先队列、任务调度 |


高级数据结构(扩展)

  1. 跳表(Skip List):多层链表加速查找(Redis有序集合底层实现)。

  2. 并查集(Union-Find):高效处理集合合并与查询(如社交网络连通性)。

  3. 布隆过滤器(Bloom Filter):空间高效的概率型数据结构(缓存穿透防护)。


学习建议

  1. 理解原理:动手实现每个数据结构(如用Python编写链表、哈希表)。

  2. 刷题巩固:LeetCode/HackerRank练习(如《剑指Offer》经典题)。

  3. 分析场景:根据问题需求选择最优数据结构(如高频查询用哈希表,有序需求用树)。

  4. 扩展阅读:《算法导论》《数据结构与算法分析》等经典书籍。