当前位置: 首页 > article >正文

数据结构泛谈

数据结构是计算机科学中用于组织、管理和存储数据的一种方式;

它决定了数据的存储布局以及如何有效地操作这些数据;

是算法设计和性能优化的基础,选择合适的数据结构可以显著提升程序的运行效率。

数据结构我们可以这么拆解:数据 + 结构

为什么?下面我要说骚话了

数据——对应的是储存特性,我们要使用合适的数据结构高效的存储数据,这个我们可以认作是数据结构中的一个方面,体现在物理存储上面,计算机实际是如何进行数据存储的:

存储结构

存储结构是逻辑结构在计算机中的实现方式,分为以下两种(其实考虑到计算机的存储结构设计以及局部性原理,所有的存储都是一个内存块,讨论逻辑地址,那么一个连续的数据需要存储,只存在两种存储形式,连续的内存块和不连续的,而不连续的内存块以什么形式联系在一起就可以分为 更多的逻辑结构):

  • 顺序存储: 数据存储在连续的内存单元中。
    • 优点:存取速度快。
    • 缺点:插入和删除效率低。
  • 链式存储: 数据存储在非连续的内存单元中,通过指针连接。
    • 优点:插入和删除效率高。
    • 缺点:访问速度较慢。

结构——词重点就是结构,对应的是逻辑特性,就和抽象的联系起来,讨论的就是逻辑性的关系:

逻辑结构

逻辑结构指数据之间的逻辑关系,主要分为以下四种:

  • 集合结构: 数据元素之间仅有“属于同一个集合”的关系。
    • 例如:集合 {A, B, C}。
  • 线性结构: 数据元素之间是一对一的关系。
    • 例如:数组、链表。
  • 树形结构: 数据元素之间是一对多的关系。
    • 例如:二叉树、B 树。
  • 图结构: 数据元素之间是多对多的关系。
    • 例如:邻接矩阵、邻接表。

常见数据结构简介

数据结构特点优点缺点应用场景
数组顺序存储,支持随机访问访问效率高(O(1))插入和删除效率低(O(n))频繁访问元素,数据大小固定
链表链式存储,每个节点包含数据和指针插入和删除效率高(O(1))访问效率低(O(n))动态数据存储,数据大小变化频繁
先进后出(LIFO)的线性结构简单易用,支持递归调用不适合需要随机访问的场景递归调用、括号匹配、表达式求值
队列先进先出(FIFO)的线性结构顺序处理操作方便不支持随机访问任务调度、消息队列
哈希表基于键值对存储,通过哈希函数快速定位元素查找、插入和删除效率高(平均 O(1))需要处理哈希冲突,空间利用率低数据快速查找,频繁增删操作
分层结构,节点之间是一对多的关系快速查找,层级关系清晰平衡维护成本高(如平衡二叉树)层级关系表示、快速查找
顶点和边组成的结构,用于表示复杂关系表示多对多关系灵活复杂度高,存储和操作消耗较大网络连接、路径规划、社交网络分析

数据结构选择参考

因素描述
操作类型数据是否需要频繁插入、删除、修改或查询?
数据大小数据量较大时,空间复杂度可能成为关键问题。
数据关系数据之间是否存在特定的逻辑关系(如层级、顺序或网状)?
访问模式是否需要随机访问或按顺序访问?

数据结构学习建议(都是鬼话,谁能背下来,反正我不能……)

  1. 掌握基础结构: 熟悉数组、链表、栈和队列的实现和应用。
  2. 理解复杂结构: 深入学习树和图的各种类型和操作。
  3. 分析复杂度: 学会评估时间复杂度和空间复杂度。
  4. 动手实践: 多用代码实现和优化常见数据结构。
  5. 结合实际: 根据具体问题选择合适的数据结构解决。

数据结构和算法:

纯纯的相互纠缠不清,你中有我、我中有你,上面说了我们背不下来,我们还是记常用算法吧,常用stl你啥都能了解了,记不住的时候知道有哪些相关的数据结构就行了。算法啥的我们也是这样的,学了记不住没关系,大家都是代码“文抄公”谁也别笑谁,知道有哪些对付哪种问题,你再上网查吧,别对自己那么狠(当然有狠人,我给跪下,emmmm)

(下面是废话)

  • 数据结构是算法的载体,不同的数据结构为算法的实现提供不同的支持。
    • 例如:堆排序依赖于堆数据结构,深度优先搜索(DFS)依赖于栈。
  • 算法是对数据结构的操作和优化。
    • 例如:二分查找基于有序数组,Dijkstra 算法基于图。

我在这个系列中会逐步解析基本的数据结构……再见


http://www.kler.cn/a/445869.html

相关文章:

  • C++版实用时间戳类(Timestamp)
  • hive注释comment中文乱码解决
  • 并发控制之CyclicBarrier
  • POD 存储、PV、PVC
  • 数据结构与算法学习笔记----SPFA判断负环
  • Qt for Python (PySide6)设置程序图标和任务栏图标
  • git以及gitee仓库注册创建
  • 38.在 Vue 3 中使用 OpenLayers 导出地图为 PDF
  • C#.net CAD二次开发调试时进行日志记录并输出错误
  • 【Python】【数据分析】深入探索 Python 数据可视化:Plotly 绘图库全面解析
  • 使用LS-DYNA对秸秆进行切削仿真(记录版)
  • 免费开源!推荐一款网页版数据库管理工具!
  • edge_tts 实现实时流式语音播放输出
  • 安装指定版本的python这里以3.11为例子
  • 【Tomcat】第五站:Servlet容器
  • mfc140.dll是什么东西?mfc140.dll缺失的几种具体解决方法
  • 腾讯云云开发 Copilot 深度探索与实战分享
  • STM32单片机芯片与内部33 ADC 单通道连续DMA
  • 子域提取工具,子域名收集神器,支持多种数据源和枚举选项,域名发现工具,可以为任何目标枚举海量的有效子域名,安全侦察工具,利用证书透明原则监控部署的新子域
  • html在线转换工具集合大全
  • AFL-Fuzz 的使用
  • 五十个网络安全学习项目——(九)无线网络安全分析
  • windows 钉钉缓存路径不能修改 默认C盘解决方案
  • Python 【大模型】之 使用千问Qwen2-VL 大模型训练LaTeX数学公式图,并进行LaTeX图识别测试
  • 校园快领系统|Java|SSM|VUE| 前后端分离
  • 模型训练之优化器