数据结构泛谈
数据结构是计算机科学中用于组织、管理和存储数据的一种方式;
它决定了数据的存储布局以及如何有效地操作这些数据;
是算法设计和性能优化的基础,选择合适的数据结构可以显著提升程序的运行效率。
数据结构我们可以这么拆解:数据 + 结构
为什么?下面我要说骚话了
数据——对应的是储存特性,我们要使用合适的数据结构高效的存储数据,这个我们可以认作是数据结构中的一个方面,体现在物理存储上面,计算机实际是如何进行数据存储的:
存储结构
存储结构是逻辑结构在计算机中的实现方式,分为以下两种(其实考虑到计算机的存储结构设计以及局部性原理,所有的存储都是一个内存块,讨论逻辑地址,那么一个连续的数据需要存储,只存在两种存储形式,连续的内存块和不连续的,而不连续的内存块以什么形式联系在一起就可以分为 更多的逻辑结构):
- 顺序存储: 数据存储在连续的内存单元中。
- 优点:存取速度快。
- 缺点:插入和删除效率低。
- 链式存储: 数据存储在非连续的内存单元中,通过指针连接。
- 优点:插入和删除效率高。
- 缺点:访问速度较慢。
结构——词重点就是结构,对应的是逻辑特性,就和抽象的联系起来,讨论的就是逻辑性的关系:
逻辑结构
逻辑结构指数据之间的逻辑关系,主要分为以下四种:
- 集合结构: 数据元素之间仅有“属于同一个集合”的关系。
- 例如:集合 {A, B, C}。
- 线性结构: 数据元素之间是一对一的关系。
- 例如:数组、链表。
- 树形结构: 数据元素之间是一对多的关系。
- 例如:二叉树、B 树。
- 图结构: 数据元素之间是多对多的关系。
- 例如:邻接矩阵、邻接表。
常见数据结构简介
数据结构 | 特点 | 优点 | 缺点 | 应用场景 |
---|---|---|---|---|
数组 | 顺序存储,支持随机访问 | 访问效率高(O(1)) | 插入和删除效率低(O(n)) | 频繁访问元素,数据大小固定 |
链表 | 链式存储,每个节点包含数据和指针 | 插入和删除效率高(O(1)) | 访问效率低(O(n)) | 动态数据存储,数据大小变化频繁 |
栈 | 先进后出(LIFO)的线性结构 | 简单易用,支持递归调用 | 不适合需要随机访问的场景 | 递归调用、括号匹配、表达式求值 |
队列 | 先进先出(FIFO)的线性结构 | 顺序处理操作方便 | 不支持随机访问 | 任务调度、消息队列 |
哈希表 | 基于键值对存储,通过哈希函数快速定位元素 | 查找、插入和删除效率高(平均 O(1)) | 需要处理哈希冲突,空间利用率低 | 数据快速查找,频繁增删操作 |
树 | 分层结构,节点之间是一对多的关系 | 快速查找,层级关系清晰 | 平衡维护成本高(如平衡二叉树) | 层级关系表示、快速查找 |
图 | 顶点和边组成的结构,用于表示复杂关系 | 表示多对多关系灵活 | 复杂度高,存储和操作消耗较大 | 网络连接、路径规划、社交网络分析 |
数据结构选择参考
因素 | 描述 |
---|---|
操作类型 | 数据是否需要频繁插入、删除、修改或查询? |
数据大小 | 数据量较大时,空间复杂度可能成为关键问题。 |
数据关系 | 数据之间是否存在特定的逻辑关系(如层级、顺序或网状)? |
访问模式 | 是否需要随机访问或按顺序访问? |
数据结构学习建议(都是鬼话,谁能背下来,反正我不能……)
- 掌握基础结构: 熟悉数组、链表、栈和队列的实现和应用。
- 理解复杂结构: 深入学习树和图的各种类型和操作。
- 分析复杂度: 学会评估时间复杂度和空间复杂度。
- 动手实践: 多用代码实现和优化常见数据结构。
- 结合实际: 根据具体问题选择合适的数据结构解决。
数据结构和算法:
纯纯的相互纠缠不清,你中有我、我中有你,上面说了我们背不下来,我们还是记常用算法吧,常用stl你啥都能了解了,记不住的时候知道有哪些相关的数据结构就行了。算法啥的我们也是这样的,学了记不住没关系,大家都是代码“文抄公”谁也别笑谁,知道有哪些对付哪种问题,你再上网查吧,别对自己那么狠(当然有狠人,我给跪下,emmmm)
(下面是废话)
- 数据结构是算法的载体,不同的数据结构为算法的实现提供不同的支持。
- 例如:堆排序依赖于堆数据结构,深度优先搜索(DFS)依赖于栈。
- 算法是对数据结构的操作和优化。
- 例如:二分查找基于有序数组,Dijkstra 算法基于图。
我在这个系列中会逐步解析基本的数据结构……再见