|
1 | 1 | # 数据结构概述 |
| 2 | + 数据结构是数据组织、存储和管理的方式,也就是把数据聚合在一起,以便进行加工整理。不同的数据结构会决定数据的访问、操作和处理的效率。 |
2 | 3 |
|
3 | | - 数据结构就是数据组织存储方式,也就是把数据聚合在一起,以便进行加工整理。把数据从一种结构换成另一种结构就是数据处理,这是编程最常见的工作。 |
4 | | - |
5 | | - - **数据类型**一般分为整型、字节、浮点、字符、和布尔等类,也就是生活中的数字和文字,把它按照一定规则分下类,不同语言略有些不同。 |
6 | | - - **数据结构**有两种分类方法: |
7 | | - - 线性结构(数据按顺序一一相连,前后有固定的关系),数组、链表、栈、队列等。非线性结构(数据非一一相连,据没有固定的顺序),如树和图。 |
8 | | - - 集合结构(数据无关系)、线性结构(数据一对一)、树形结构(数据一对多)、图形结构(数据多对多)。 |
| 4 | + - **数据结构** 数据结构主要分为以下两大类: |
| 5 | + - **线性结构**:数据元素按顺序排列,元素之间存在一对一的关系。例如数组、链表、栈、队列等。 |
| 6 | + - **非线性结构**:数据元素之间没有固定的顺序关系,元素之间可能是一对多或多对多的关系。例如树、图等。 |
9 | 7 |
|
10 | | -## 基础结构有以下8种: |
11 | | -<a href="https://zhuanlan.zhihu.com/p/582174773"><img src="https://pic1.zhimg.com/80/v2-a158ff27cd3add6b7707359f09c79ac8_1440w.webp"></a> |
12 | | - |
13 | | -参见:[如何学好编程?一文彻底搞懂](https://zhuanlan.zhihu.com/p/582174773) |
| 8 | + - **数据类型与数据结构** |
| 9 | + - 数据类型是对数据的一种分类,例如整型、字节、浮点、字符、和布尔等。不同的数据类型具有不同的取值范围和操作方式。 |
| 10 | + - 数据类型是数据结构的基础,数据结构将多个数据按类型和规则组织起来,提供更高效的操作方式。 |
14 | 11 |
|
| 12 | +## 常见基础结构有以下8种: |
| 13 | +<a href="https://zhuanlan.zhihu.com/p/582174773"><img src="https://pic1.zhimg.com/80/v2-a158ff27cd3add6b7707359f09c79ac8_1440w.webp"></a> |
15 | 14 | - 数组(Array),聚合数据的集合,可以实现线性和非线性。 |
16 | 15 | - 链表(Linked List),线性结构,数据以链式结构存储。 |
17 | | - - 树(Tree),非线性结构,模拟树状结构性质的数据集合,一个顶点。 |
18 | | - - 堆(Heap),非线性结构,特殊的树形数据结构,一般指完全二叉树。 |
19 | 16 | - 栈(Stack),线性结构,后进先出。 |
20 | 17 | - 队列(Queue),线性结构,先进先出。 |
| 18 | + - 树(Tree),非线性结构,模拟树状结构性质的数据集合,一个顶点。 |
| 19 | + - 堆(Heap),非线性结构,特殊的树形数据结构,一般指完全二叉树。 |
21 | 20 | - 图(Graph),非线性结构,节点相互连接,每个节点都可以作为顶点。 |
22 | 21 | - 散列(Hash),线性结构,根据键访问储存位置的数据结构。 |
23 | 22 |
|
24 | | -# 8种基础数据结构 |
| 23 | +### 数据结构对比表 |
| 24 | + |
| 25 | +| 数据结构 | 类型 | 结构特点 | 存储方式 | 主要操作 | 时间复杂度(平均) | 优点 | 缺点 | 应用场景 | |
| 26 | +| --------------- | ----------- | ------------------------------------ | ------------------------------------- | ------------- | ------------------------- | ------------------------------------ | ------------------------------ | -------------------------------- | |
| 27 | +| **数组** | 线性 | 聚合数据的集合,可实现线性和非线性 | 连续内存块 | 插入、查找、删除 | 查找:O(1) 插入/删除:O(n) | 快速访问,通过索引可以直接访问元素 | 插入删除时需要移动元素 | 常用于存储已知大小和不频繁修改的元素 | |
| 28 | +| **链表** | 线性 | 数据以链式结构存储,每个元素包含指向下一个元素的指针 | 由节点组成,每个节点包含数据和指针 | 插入、删除 | 查找:O(n) 插入/删除:O(1) | 动态内存分配,不需要预留空间 | 查找操作慢,不适合随机访问 | 实现队列、栈,动态数据存储等 | |
| 29 | +| **栈** | 线性 | 后进先出(LIFO) | 通过链表或数组实现 | 入栈、出栈 | 入栈/出栈:O(1) | 直观、简单,适合递归问题的解决 | 限制较多,仅适用于LIFO场景 | 递归调用、函数调用栈、撤销操作等 | |
| 30 | +| **队列** | 线性 | 先进先出(FIFO) | 通过链表或数组实现 | 入队、出队 | 入队/出队:O(1) | 高效的先进先出操作 | 仅支持FIFO,功能较单一 | 任务调度、进程管理、缓存等 | |
| 31 | +| **树** | 非线性 | 层级结构,每个节点有一个父节点和多个子节点 | 节点通过指针链接,每个节点有多个子节点 | 查找、插入、删除 | 查找、插入、删除:O(log n) | 适合分层存储和检索 | 复杂度较高,不适用于所有场景 | 文件系统、数据库索引、表达式树等 | |
| 32 | +| **堆** | 非线性 | 特殊的树形结构,一般为完全二叉树,最大堆或最小堆 | 完全二叉树 | 插入、删除最大/最小元素 | 插入/删除:O(log n) | 高效的优先级操作,适用于排序和队列 | 查找、更新任意元素不方便 | 优先级队列、堆排序、图算法等 | |
| 33 | +| **图** | 非线性 | 节点相互连接,每个节点都可以作为顶点 | 节点与边通过指针或数组存储 | 查找、遍历 | 查找/遍历:O(V + E) | 灵活建模,表示复杂关系 | 复杂度较高,尤其是图较大时 | 社交网络、交通网络、搜索引擎等 | |
| 34 | +| **散列** | 线性 | 根据键访问存储位置的数据结构 | 数组结合哈希函数映射 | 插入、查找、删除 | 查找:O(1) 插入/删除:O(1) | 高效的查找,插入和删除操作 | 可能出现哈希冲突,性能下降 | 数据库索引、缓存、字典等 | |
| 35 | +| **列表** | 线性 | 顺序存储数据,可以包含重复元素 | 顺序集合,如链表或数组 | 插入、删除、查找 | 查找:O(n) 插入/删除:O(1) | 灵活、支持重复元素,适合遍历 | 查找不够高效,内存开销较大 | 数据存储、任务调度、操作日志等 | |
| 36 | +| **结构体** | 线性 | 组合多种数据类型的集合,适合存储不定量的数据 | 通过连续存储位置组合不同数据类型 | 访问字段、修改字段 | 访问字段:O(1) | 灵活组合多种数据类型,支持多样化 | 存储开销较大,字段固定不灵活 | 记录数据、定义对象、组织信息等 | |
| 37 | + |
| 38 | +## 数据结构具体说明 |
| 39 | + |
| 40 | +### 1. [数组(Array)](./array/) |
| 41 | +数组是相同类型数据元素的有序集合,每个元素通过索引访问。数组在内存中是连续存储的,因此访问速度非常快,但插入和删除操作的效率较低。 |
| 42 | + |
| 43 | +**应用场景**: |
| 44 | +- 存储一组固定大小的数据。 |
| 45 | +- 需要快速随机访问元素的场景。 |
| 46 | + |
| 47 | +**特点**: |
| 48 | +- 内存连续,访问速度快。 |
| 49 | +- 大小固定,插入和删除效率低。 |
25 | 50 |
|
26 | | -## 数组(Array) |
27 | | -相同类型数据元素的有序集合。每个元素都有唯一的索引,可以通过索引快速访问。 |
| 51 | +--- |
28 | 52 |
|
29 | | -**应用**:数组适用于需要快速访问元素的场景,如一组数字、字符等。然而,数组在添加或删除元素时效率较低。 |
| 53 | +### 2. [链表(Linked List)](./linked/) |
| 54 | +链表由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表在内存中是非连续存储的,因此可以动态添加或删除元素。 |
30 | 55 |
|
31 | | -## 链表(Linked List) |
32 | | -由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表在内存中不是连续存储,可以动态添加或删除元素。 |
| 56 | +**应用场景**: |
| 57 | +- 需要频繁插入和删除的场景。 |
| 58 | +- 实现栈、队列等数据结构。 |
33 | 59 |
|
34 | | -**应用**:链表适用于需要频繁插入和删除的场景,但随机访问效率较低。 |
| 60 | +**特点**: |
| 61 | +- 内存非连续,插入和删除效率高。 |
| 62 | +- 随机访问效率低。 |
35 | 63 |
|
36 | | -## 树(Tree) |
37 | | -一种层次化的数据结构,由一个根节点和若干个子节点组成。每个子节点可能有自己的子节点,形成树状结构。 |
| 64 | +--- |
38 | 65 |
|
39 | | -**应用**:常见的树结构包括二叉树、红黑树等。可以用于组织数据,例如文件系统、数据库索引等。 |
| 66 | +### 3. [栈(Stack)](./stack/) |
| 67 | +栈是一种遵循 **后进先出(LIFO)** 原则的数据结构。元素只能在栈顶插入(压栈)或删除(弹栈)。 |
40 | 68 |
|
41 | | -## 堆(Heap) |
42 | | -一种特殊的树状数据结构,满足堆属性。根据堆的类型,最小堆(Min-Heap)和最大堆(Max-Heap)是常见的形式。 |
| 69 | +**应用场景**: |
| 70 | +- 函数调用栈。 |
| 71 | +- 表达式求值(如括号匹配)。 |
| 72 | +- 递归算法。 |
43 | 73 |
|
44 | | -**应用**:堆被广泛用于实现优先队列、堆排序以及在算法优化中使用。 |
| 74 | +**特点**: |
| 75 | +- 操作受限,只能在栈顶进行插入和删除。 |
| 76 | +- 简单高效。 |
45 | 77 |
|
46 | | -## 栈(Stack) |
47 | | -遵循后进先出(LIFO)原则的数据结构。元素只能在栈顶插入或删除。 |
| 78 | +--- |
48 | 79 |
|
49 | | -**应用**:栈适用于需要倒序处理数据的场景,如递归、表达式解析等。 |
| 80 | +### 4. [队列(Queue)](./queue/) |
| 81 | +队列是一种遵循 **先进先出(FIFO)** 原则的数据结构。元素从队尾添加(入队),从队头删除(出队)。 |
50 | 82 |
|
51 | | -## 队列(Queue) |
52 | | -遵循先进先出(FIFO)原则的数据结构。元素从队尾添加,并从队头删除。 |
| 83 | +**应用场景**: |
| 84 | +- 任务调度。 |
| 85 | +- 消息队列。 |
| 86 | +- 广度优先搜索(BFS)。 |
53 | 87 |
|
54 | | -**应用**:适用于排队、任务调度等场景。 |
| 88 | +**特点**: |
| 89 | +- 操作受限,只能在队尾添加,队头删除。 |
| 90 | +- 适用于排队场景。 |
55 | 91 |
|
56 | | -## 图(Graph) |
57 | | -由节点(顶点)和边组成,表示对象之间的关系。节点可以代表实体,边可以代表实体之间的关联。 |
| 92 | +--- |
58 | 93 |
|
59 | | -**应用**:图用于表示复杂的关系,例如社交网络、网络拓扑等。 |
| 94 | +### 5. [树(Tree)](./tree/) |
| 95 | +树是一种层次化的数据结构,由一个根节点和若干个子节点组成。每个子节点可能有自己的子节点,形成树状结构。 |
60 | 96 |
|
61 | | -## 散列(Hashing) |
62 | | -散列是一种技术,用于将数据映射到哈希值,以便快速查找、插入和删除。 |
| 97 | +**应用场景**: |
| 98 | +- 文件系统。 |
| 99 | +- 数据库索引(如B树、B+树)。 |
| 100 | +- 组织数据(如家谱、组织结构)。 |
63 | 101 |
|
64 | | -**应用**:散列在许多数据结构和应用中非常重要,例如哈希表、哈希地图、数据缓存等。 |
| 102 | +**特点**: |
| 103 | +- 非线性结构,适合表示层次关系。 |
| 104 | +- 常见的树结构包括二叉树、平衡树、红黑树等。 |
| 105 | + |
| 106 | +--- |
| 107 | + |
| 108 | +### 6. [堆(Heap)](./heap/) |
| 109 | +堆是一种特殊的树形数据结构,通常是一个完全二叉树。堆分为**最小堆**和**最大堆**,最小堆的每个节点的值都小于或等于其子节点的值,最大堆则相反。 |
| 110 | + |
| 111 | +**应用场景**: |
| 112 | +- 优先队列。 |
| 113 | +- 堆排序。 |
| 114 | +- 算法优化(如Dijkstra算法)。 |
| 115 | + |
| 116 | +**特点**: |
| 117 | +- 快速查找最大或最小元素。 |
| 118 | +- 插入和删除操作的时间复杂度为O(log n)。 |
| 119 | + |
| 120 | +--- |
| 121 | + |
| 122 | +### 7. [图(Graph)](./graph/) |
| 123 | +图由节点(顶点)和边组成,表示对象之间的关系。节点可以代表实体,边可以代表实体之间的关联。 |
| 124 | + |
| 125 | +**应用场景**: |
| 126 | +- 社交网络。 |
| 127 | +- 网络拓扑。 |
| 128 | +- 路径搜索(如最短路径问题)。 |
| 129 | + |
| 130 | +**特点**: |
| 131 | +- 非线性结构,适合表示复杂关系。 |
| 132 | +- 常见的图算法包括深度优先搜索(DFS)和广度优先搜索(BFS)。 |
| 133 | + |
| 134 | +--- |
| 135 | + |
| 136 | +### 8. [散列(Hash)](./hash/) |
| 137 | +散列是一种通过哈希函数将数据映射到哈希值的技术,以便快速 |
65 | 138 |
|
66 | 139 | # 其他常见数据结构 |
67 | 140 |
|
68 | | -## 二叉树(Binary Tree) |
| 141 | +## [二叉树(Binary Tree)](./tree/) |
69 | 142 | 一种树形数据结构,每个节点最多有两个子节点,包括普通二叉树、满二叉树、完全二叉树和平衡二叉树等。 |
70 | 143 |
|
71 | 144 | **应用**:广泛应用于算法、数据结构、搜索和排序等领域。二叉搜索树适用于快速查找、添加和删除操作。 |
72 | 145 |
|
73 | | -## 集合(Set) |
| 146 | +## [集合(Set)](./set/) |
74 | 147 | 一种不允许重复元素的数据结构。主要用于集合操作,如添加、删除、查询等。 |
75 | 148 |
|
76 | 149 | **应用**:集合适用于没有重复数据的场景,提供集合运算,如并集、交集和差集等。 |
77 | 150 |
|
78 | | -## 映射(Map) |
| 151 | +## [映射(Map)](./map/) |
79 | 152 | 存储键-值对,并允许通过键快速查找对应的值。键必须唯一,但值可以重复。 |
80 | 153 |
|
81 | 154 | **应用**:映射用于高效的数据检索、数据关联以及数据结构之间的关联。如缓存实现、数据库索引、负载均衡等。 |
82 | 155 |
|
83 | | -## 哈希表(Hash Table) |
| 156 | +## [哈希表(Hash Table)](./hash/) |
84 | 157 | 一种高效的数据结构,使用哈希函数将键映射到对应的值。提供快速的查找、插入和删除操作。 |
85 | 158 |
|
86 | 159 | **应用**:哈希表用于快速查找、插入和删除数据的场景,例如字典、映射、缓存等。 |
|
89 | 162 | - **HashMap**:一种哈希表实现,不是线程安全的,适用于单线程或自行管理同步的场景。 |
90 | 163 | - **HashTable**:一种线程安全的哈希表,适用于多线程环境,但由于同步机制,性能可能较低。 |
91 | 164 |
|
92 | | -## 优先队列(Priority Queue) |
| 165 | +## [优先队列(Priority Queue)](./queue/) |
93 | 166 | 优先队列是一种特殊的队列,元素的顺序根据优先级排列,而非插入顺序。 |
94 | 167 |
|
95 | 168 | **应用**:优先队列常用于实现任务调度、事件驱动、路径搜索等场景。 |
96 | 169 |
|
97 | | -## 结构体(struct) |
| 170 | +## [结构体(struct)](./struct/) |
98 | 171 | 一种数据结构,用于组合一组相关的数据,以便将它们作为一个整体来处理。结构体在许多编程语言中都有支持,struct与class有点类似,struct见于C、C++、Go、Rust等语言。class用于Java和C#、JS、Python、PHP等。 |
99 | 172 |
|
100 | 173 | **应用**: 用于创建具有特定属性的复杂数据类型,封装相关数据,还可用于数据包或消息的结构以及定义内存中的数据存储结构。 |
101 | 174 |
|
| 175 | + |
| 176 | +## 参见: |
| 177 | +[如何学好编程?一文彻底搞懂](https://zhuanlan.zhihu.com/p/582174773) |
0 commit comments