有哪些数据结构?
一 概述
数据结构是存储、组织和管理数据的方式,它决定了数据的访问和修改效率。选择正确的数据结构对于设计高效的算法和程序至关重要。
下面将数据结构分为两大类进行介绍:基本数据结构和高级数据结构。
二 基本数据结构
基本数据结构是构建更复杂数据结构的基础,通常在编程中会直接或间接地提供支持。
1 数组
(1)描述:在内存中连续存储的一系列相同类型的元素。通过索引(下标)可以直接访问任何一个元素。
(2) 特点:
优点:随机访问速度快(时间复杂度 O(1))。
缺点:大小固定(静态数组),插入和删除元素效率低(平均需要 O(n) 时间),因为需要移动其他元素。
(3)变种:动态数组(如 C++ 的 vector,Java 的 ArrayList),可以自动扩容。
2 链表
(1) 描述:由一系列节点组成,每个节点包含数据和指向下一个节点(或前后节点)的指针。数据在内存中不要求连续。
(2) 特点:
优点:插入和删除元素效率高(时间复杂度 O(1),如果已知位置)。
缺点:随机访问效率低(时间复杂度 O(n)),需要从头遍历;需要额外的空间存储指针。
(3) 常见类型:
单向链表:节点只指向下一个节点。
双向链表:节点指向前一个和后一个节点。
循环链表:尾节点指向头节点,形成一个环。
3 栈
(1) 描述:一种后进先出(LIFO)的线性结构。只能在表的一端(栈顶)进行插入(压栈)和删除(弹栈)操作。
(2) 类比:一摞盘子,你只能取最上面的那个,也只能在最上面放新的。
(3) 应用:函数调用栈、表达式求值、撤销(Undo)操作。
4 队列
(1) 描述:一种先进先出(FIFO)的线性结构。元素从队尾进入,从队头离开。
(2) 类比:排队买票,先来的人先买到票离开。
(3) 应用:任务调度、消息队列、广度优先搜索(BFS)。
(4) 常见变种:
双端队列:两端都可以进行插入和删除。
优先队列:出队顺序由元素的优先级决定,通常用堆实现。
5 哈希表
(1) 描述:通过一个哈希函数将键映射到数组中的一个位置,从而实现快速访问。
(2) 特点:
优点:在平均情况下,插入、删除和查找的速度都非常快(时间复杂度 O(1))。
缺点:哈希冲突(不同的键映射到同一位置);遍历顺序不确定。
(3) 应用:字典、集合、缓存、对象表示。
6 树
(1) 描述:一种分层的非线性数据结构,由节点和边组成。每个树有一个根节点,下面连接着子树。
(2) 常用术语:根、父节点、子节点、叶节点、深度、高度。
(3)常见类型:
二叉树:每个节点最多有两个子节点(左子节点和右子节点)。
二叉搜索树:左子树所有节点的值小于根节点,右子树所有节点的值大于根节点。这使得搜索、插入、删除的平均效率可以达到 O(log n)。
平衡二叉搜索树:如 AVL 树、红黑树,通过自平衡操作确保树不会退化成链表,从而保证最坏情况下操作效率也是 O(log n)。
7 堆
(1) 描述:一种特殊的完全二叉树,满足堆属性:父节点的值总是大于或等于(最大堆)或小于或等于(最小堆)其所有子节点的值。
(2) 特点:根节点总是最大或最小的元素。
(3) 应用:优先队列、堆排序。
8 图
(1) 描述:由顶点和连接顶点的边组成的集合。可以表示多对多的关系。
(2) 分类:
有向图:边有方向。
无向图:边无方向。
带权图:边上有权重(或成本)。
(3) 应用:社交网络、地图导航、网络路由。
二、 高级数据结构
通常由基本数据结构组合或扩展而成,用于解决特定领域的问题。
1 Trie(字典树/前缀树)
(1)描述:一种专门用于处理字符串的树形结构。从根到某个节点的路径代表一个字符串前缀。
(2)特点:非常适合用于字符串的快速检索、前缀匹配和自动补全。
(3)应用:搜索引擎提示、拼写检查、IP 路由表。
2 并查集
(1)描述:一种用于处理不相交集合合并及查询问题的数据结构。主要支持两个操作:查找元素属于哪个集合,以及合并两个集合。
(2) 特点:效率非常高(接近常数时间)。
(3)应用:连通分量检测(如图中的朋友圈)、动态连通性。
3 布隆过滤器
(1) 描述:一种概率型数据结构,用于快速判断一个元素是否绝对不存在或可能存在于一个集合中。
(2)特点:空间效率极高,但有一定的误判率(可能把不存在的元素判为存在,但不会把存在的判为不存在)。
(3) 应用:缓存穿透防护、垃圾邮件过滤、大规模数据去重。
4 跳表
(1)描述:在有序链表的基础上,增加多级索引,以加快搜索速度。
(2)特点:实现简单,效率与平衡树相媲美(平均 O(log n)),在 Redis 等系统中被广泛应用。
5 B树 / B+树
(1)描述:一种多路平衡搜索树,设计用于高效处理磁盘I/O。一个节点可以有多个子节点。
(2)特点:矮胖的树形结构,减少了磁盘访问次数。
(3)应用:数据库索引、文件系统。
6 线段树 & 树状数组
(1) 描述:用于处理数组区间查询(如区间求和、求最小值)和点更新操作的高效数据结构。
(2)特点:可以在 O(log n) 时间内完成查询和更新。
(3)应用:范围统计、区间修改。
7 位图
(1)描述:用比特位(bit)来存储数据(通常是布尔值),每个比特位表示一个状态(存在/不存在,真/假)。
(2)特点:极其节省空间。
(3) 应用:快速去重、排序、判断元素是否存在。
三 总结
选择数据结构时,需要考虑你的核心操作是什么。
(1)需要快速访问,已知索引? 数组。
(2)需要频繁在两端插入删除? 链表。
(3) 需要后进先出(LIFO)? 栈。
(4)需要先进先出(FIFO)? 队列。
(5)需要快速的键值对查找?哈希表。
(6)数据需要有序,并支持快速查找、插入、删除? 平衡二叉搜索树。
(7) 需要快速获取最大/最小值? 堆。
(8)需要表示网络关系? 图?
(9)需要处理字符串前缀? Trie。
(10)需要处理集合合并与查询? 并查集。
(11)需要海量数据下判断存在性,且可接受一定误差? 布隆过滤器。
(12)数据量巨大,存储在磁盘上,需要索引? B+树。
