数据结构—(概述)
目录
一 数据结构,相关概念
1. 数据结构:
2. 数据(Data):
3. 数据元素(Data Element):
4. 数据项:
5. 数据对象(Data Object):
6. 容器(container):
7. 结点(Node):
8. 迭代器(iterator):
9. 前驱 节点:
10. 后继 节点:
二 数据结构分类
1. 逻辑结构分类
1. 集合结构
2. 线性结构
3. 树型结构
4. 图状结构或网状结构
2. 物理结构分类
1. 顺序存储结构
2. 链接存储结构
3. 数据索引存储结构
4. 数据散列存储结构 hash
5. 总结
性能对比与分析
3. 总结
逻辑结构与物理结构的对应关系
一 数据结构,相关概念
1. 数据结构:
是相互之间存在一种或多种特定关系的数据元素的集合。不同的数据元素之间不是独立的,而是存在特定的关系,我们将这些关系成为结构。
2. 数据(Data):
是对信息的一种符号表示。在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。(数据不仅包含整型、实型等数值类型,还包括字符及声音、图像、视频等非数值类型。)
3. 数据元素(Data Element):
是数据的基本单位在计算机程序中通常作为一个整体进行考虑和处理。一个数据元素可由若干个数据项组成。
4. 数据项:
一个数据元素可以由若干个数据项组成。(比如:人可以有眼耳口鼻这些数据项)。数据项是数据不可分割的最小单位。
5. 数据对象(Data Object):
是性质相同的数据元素的集合。是数据的一个子集。
6. 容器(container):
装入数据元素的外部对象。一般是先有数据关系,再有可以装入数据元素的容器,一个容器对应一个数据元素,可以把它想象成一个纸箱。
7. 结点(Node):
数据关系中,用于建立关系支撑的连接点,比如路由器网关,树的分叉;与节点接近但有所区别。
8. 迭代器(iterator):
一个超级接口! 是可以遍历集合的对象,为各种容器提供了公共的操作接口。
9. 前驱 节点:
数据值小于节点n,且与节点n数值最接近的节点(记为节点m)
10. 后继 节点:
数据值大于节点n,且数值最接近节点n的第一个节点(记为节点m)
11. 检索(索引 index):
根据索引快速的找到数据元素;
12. 遍历:
将数据对象中的所有数据元素全部访问一遍;
13. 动态扩容:
数据对象中的数据元素数量发生变化。
二 数据结构分类
数据结构是计算机中组织、管理和存储数据的方式,分为 逻辑结构 和 物理结构(存储结构)。二者的核心区别在于:
逻辑结构:关注数据元素之间的抽象关系(如顺序、层次、连接等),与计算机存储无关。
物理结构:数据在内存中的实际存储方式(如连续存储、分散存储),直接影响程序性能。
1. 逻辑结构分类
逻辑结构的分类与特点
逻辑结构类型 描述 典型示例 应用场景 线性结构 数据元素间呈一对一关系,形成序列。 数组、链表、栈、队列 顺序操作(如遍历、排序) 树形结构 数据元素间呈一对多关系,形成层次结构。 二叉树、B树、堆、字典树 文件系统、数据库索引、决策模型 图结构 数据元素间呈多对多关系,形成网络结构。 有向图、无向图、邻接表/矩阵 社交网络、路径规划、依赖分析 集合结构 数据元素间无明确逻辑关系,仅属于同一集合。 哈希集合、无序列表 去重、成员检测、数学集合运算 ![]()
1. 集合结构
定义:数据元素之间无明确逻辑关系,仅属于同一集合。
特点:
关注元素的唯一性和存在性,而非顺序或关联。
核心操作:插入、删除、查找。
常见类型:
哈希集合(HashSet):基于哈希表实现,查找时间复杂度O(1)。
示例:Python的
set
类型。树集合(TreeSet):基于平衡二叉搜索树实现,元素有序。
示例:Java的
TreeSet
。应用场景:
数据去重:快速检测重复元素。
成员检测:判断元素是否存在于集合中。
集合运算:并集、交集、差集(如数据库查询优化)。
2. 线性结构
定义:数据元素之间存在一对一的顺序关系,形成线性序列。每个元素有且仅有一个直接前驱和一个直接后继。
特点:
元素按顺序排列,无分支。
支持遍历、插入、删除等操作。
常见类型:
数组:连续内存存储,支持快速随机访问。
示例:
int arr[5] = {1, 2, 3, 4, 5};
链表:通过指针链接非连续内存块,支持动态扩展。
示例:单链表、双向链表。
栈(Stack):后进先出(LIFO),如函数调用栈。
操作:
push
(入栈)、pop
(出栈)。队列(Queue):先进先出(FIFO),如任务调度队列。
操作:
enqueue
(入队)、dequeue
(出队)。应用场景:
数组:需要快速访问元素的场景(如排序)。
链表:频繁插入/删除的场景(如实现队列)。
栈:撤销操作、表达式求值。
队列:消息队列、打印任务管理。
3. 树型结构
定义:数据元素之间存在一对多的层次关系,形成树状层级结构。
特点:
每个节点最多有一个父节点,但可以有多个子节点。
具有唯一的根节点,叶子节点无子节点。
常见类型:
二叉树:每个节点最多有两个子节点。
示例:二叉搜索树(BST)、平衡二叉树(AVL树)。
B树/B+树:多路平衡查找树,用于数据库索引。
堆(Heap):完全二叉树,支持快速插入和删除最值。
类型:最大堆、最小堆。
字典树(Trie):用于字符串前缀匹配,如输入法提示。
应用场景:
文件系统:目录与子目录的层次关系。
数据库索引:B+树加速数据查询。
哈夫曼编码:压缩算法中构建最优前缀树。
4. 图状结构或网状结构
定义:数据元素之间可存在多对多的复杂关系,形成网络结构。
特点:
顶点(节点)表示实体,边表示实体间的关系。
边可带权重(如距离、成本)或方向(有向图/无向图)。
常见类型:
邻接矩阵:二维数组表示顶点间连接关系。
空间复杂度:O(V²),适合稠密图。
邻接表:链表数组存储每个顶点的邻居。
空间复杂度:O(V + E),适合稀疏图。
有向图:边有方向(如微博关注关系)。
无向图:边无方向(如微信好友关系)。
应用场景:
社交网络:用户之间的关注/好友关系。
路径规划:Dijkstra算法求最短路径。
推荐系统:基于图的关系挖掘(如PageRank)。
2. 物理结构分类
物理结构的分类与特点
物理结构类型 描述 实现方式 优缺点 适用逻辑结构 顺序存储 数据元素在内存中连续存储。 数组、动态数组 优点:随机访问快;
缺点:插入/删除效率低线性结构(数组、栈、队列) 链式存储 数据元素通过指针链接,存储位置不连续。 单链表、双向链表、树节点指针 优点:插入/删除灵活;
缺点:访问效率低线性结构、树、图 索引存储 通过索引表记录数据地址,数据本身可分散存储。 数据库索引、文件系统 优点:快速定位;
缺点:索引维护开销集合、线性结构 散列存储 利用哈希函数计算存储位置,数据按计算结果存放。 哈希表、布隆过滤器 优点:查找极快;
缺点:哈希冲突处理集合、键值对存储 总结对比
存储结构 C语言实现 时间复杂度(插入/查找) 适用场景 顺序存储 数组 插入/删除 O(n),访问 O(1) 静态数据、高频随机访问 链接存储 链表 插入/删除 O(1),访问 O(n) 动态数据、频繁修改 索引存储 结构体数组 + 索引表 插入 O(n log n),查找 O(log n) 数据库、文件系统 散列存储 哈希表 + 链地址法 插入/查找 O(1)(平均) 缓存、字典、去重
1. 顺序存储结构
定义:数据元素在内存中按顺序连续存放,通过元素下标直接访问。
特点:
物理连续:元素地址连续,无额外指针开销。
随机访问:通过下标直接定位元素,时间复杂度为 O(1)。
特性 说明 优点 访问速度快;内存利用率高(无指针开销)。 缺点 插入/删除需移动大量元素,效率低;容量固定(动态数组扩容有额外成本)。 实现方式 数组、动态数组(如 C++ 的 vector
)。适用场景 数据量固定或变化小,需频繁随机访问的场景(如排序、矩阵运算)。 示例:
int arr[5] = {1, 2, 3, 4, 5}; // 定义数组 printf("%d", arr[2]); // 直接访问第3个元素(输出:3)
2. 链接存储结构
定义:数据元素通过指针链接,存储位置不连续。
特点:
动态分配:内存按需分配,支持灵活扩展。
链式访问:通过指针跳转访问元素,时间复杂度为 O(n)。
特性 说明 优点 插入/删除效率高(仅修改指针);无需预先分配内存。 缺点 访问效率低(需遍历);指针占用额外内存。 实现方式 单链表、双向链表、树结构(如二叉树的指针实现)。 适用场景 频繁插入/删除的场景(如队列、图结构)。 示例:
struct Node { int data; struct Node *next; }; // 定义节点 struct Node a = {10}, b = {20}; a.next = &b; // 手动链接两个节点 printf("%d", a.next->data); // 输出:20
3. 数据索引存储结构
定义:通过索引表记录数据地址,数据本身可分散存储。
特点:
快速定位:索引表存储键与物理地址的映射。
分层管理:索引与数据分离,需维护索引一致性。
特性 说明 优点 支持高效范围查询;适合大规模数据管理。 缺点 索引维护复杂(增删需同步更新);存储开销大(需额外索引空间)。 实现方式 B树、B+树(数据库索引)、文件分配表(FAT)。 适用场景 数据库索引、文件系统、有序数据查询(如按范围搜索)。 示例:
int data[3] = {100, 200, 300}, index[3] = {0, 1, 2}; // 数据与索引表 printf("%d", data[index[1]]); // 通过索引访问(输出:200)
4. 数据散列存储结构 hash
定义:通过哈希函数计算数据存储位置,直接定位内存地址。
特点:
快速查找:理想情况下时间复杂度为 O(1)。
冲突处理:需解决哈希冲突(如开放寻址法、链地址法)。
特性 说明 优点 查找速度极快;适合精确匹配查询。 缺点 哈希冲突影响性能;不支持范围查询。 实现方式 哈希表、布隆过滤器、一致性哈希。 适用场景 缓存系统(如 Redis)、字典、去重(如 HashSet
)。示例:
struct HashNode { int key; struct HashNode *next; } *table[10] = {NULL}; // 哈希表 int idx = 5 % 10; table[idx] = &(struct HashNode){5, NULL}; // 插入键5 printf("%d", table[idx]->key); // 输出:5
5. 总结
性能对比与分析
操作类型 顺序存储(数组) 链式存储(链表) 散列存储(哈希表) 索引存储(B树) 随机访问 O(1) O(n) O(1)(平均) O(log n) 插入/删除 O(n) O(1) O(1)(平均) O(log n) 空间利用率 高(连续存储) 低(指针额外开销) 中等(哈希表负载因子) 中等(索引结构) 适用场景 静态数据、频繁访问 动态数据、频繁修改 快速查找、去重 有序数据、范围查询
存储结构 核心代码 关键特点 顺序存储 int arr[5]; arr[2]=3;
连续内存,直接访问 链接存储 struct Node { ... }; a.next = &b;
动态指针,灵活增删 索引存储 data[index[1]]
索引表加速定位 散列存储 table[hash(key)] = &node;
哈希函数映射,冲突处理
3. 总结
逻辑结构与物理结构的对应关系
逻辑结构 支持的物理结构 典型实现示例 线性结构 顺序存储、链式存储 - 数组(顺序存储)
- 链表(链式存储)树形结构 链式存储、顺序存储(完全二叉树) - 二叉树(指针链式)
- 堆(数组顺序存储)图结构 链式存储(邻接表)、顺序存储(邻接矩阵) - 邻接表(链表实现)
- 邻接矩阵(二维数组实现)集合结构 散列存储、索引存储 - 哈希集合(散列存储)
- 有序集合(B树索引存储)
相关文章:

数据结构—(概述)
目录 一 数据结构,相关概念 1. 数据结构: 2. 数据(Data): 3. 数据元素(Data Element): 4. 数据项: 5. 数据对象(Data Object): 6. 容器(container): 7. 结点(Node)ÿ…...
python打卡day34
GPU训练及类的call方法 知识点回归: CPU性能的查看:看架构代际、核心数、线程数GPU性能的查看:看显存、看级别、看架构代际GPU训练的方法:数据和模型移动到GPU device上类的call方法:为什么定义前向传播时可以直接写作…...

华为OD机试真题—— 流水线(2025B卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
2025 B卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…...

【数据架构01】数据技术架构篇
✅ 9张高质量数据架构图:大数据平台功能架构、数据全生命周期管理图、AI技术融合架构等; 🚀无论你是数据架构师、治理专家,还是数字化转型负责人,这份资料库都能为你提供体系化参考,高效解决“架构设计难、…...
【安全攻防与漏洞】HTTPS中的常见攻击与防御
HTTPS 中常见攻击与防御策略涵盖中间人攻击(MITM)、SSL剥离、重放攻击等,帮助构建安全的 HTTPS 通信环境: 一、中间人攻击(MITM) 攻击原理 场景:攻击者通过伪造证书或劫持网络流量,…...
esp32cmini SK6812 2个方式
1 #include <SPI.h> // ESP32-C系列的SPI引脚 #define MOSI_PIN 7 // ESP32-C3/C6的SPI MOSI引脚 #define NUM_LEDS 30 // LED灯带实际LED数量 - 确保与实际数量匹配! #define SPI_CLOCK 10000000 // SPI时钟频率 // 颜色结构体 st…...

【数据集】30 m地表温度LST数据集
目录 数据概述🔧研究目标与意义🧠 算法核心组成1. 地表比辐射率(LSE)估算2. 大气校正(Atmospheric Correction)LST反演流程图📊 精度验证与评估结果参考《Generating the 30-m land surface temperature product over continental China and USA from Landsat 5/7/8 …...

【CATIA的二次开发07】草图编辑器对象结构及应用
【CATIA的二次开发07】草图编辑器对象结构及应用 草图编辑器(SketchEditor)是用于创建和编辑2D草图的核心对象。其对象结构遵循CATIA的层级关系,以下是详细说明及代码示例: 一、核心对象结构图 Application │ └─ Documents│└─ Document (.CATPart)│└─ Part│└─…...

IT | 词汇科普手册Ⅱ
目录 1.报文(Message) 2.Token(令牌) Token vs. Cookie Token vs. Key "碰一碰"支付 3.NFC 4.Nginx 5.JSON 6.前置机 前置机vs.Nginx反向代理 以PDA、WMS举例前置机场景 7.RabbitMQ 核心功能 1.报文(Message) 报文(Message)是系统或组件之…...

【 java 基础问题 第一篇 】
目录 1.概念 1.1.java的特定有哪些? 1.2.java有哪些优势哪些劣势? 1.3.java为什么可以跨平台? 1.4JVM,JDK,JRE它们有什么区别? 1.5.编译型语言与解释型语言的区别? 2.数据类型 2.1.long与int类型可以互转吗&…...
以前端的角度理解 Kubernetes(K8s)
作为一名前端开发者,我们每天都在与 React、Vue、Webpack 等工具打交道,而 Kubernetes(K8s)听起来更像是后端或运维的“专属领域”。但实际上,K8s 的核心思想和前端开发中的某些模式高度相似。那么咱们用熟悉的类比帮助…...

自用git记录
像重复做自己在网上找的练习题,这种类型的git仓库管理,一般会用到以下命令: git revert a1b2c3 很复杂的git历史变成简单git历史 能用git rebase -i HEAD~5^这种命令解决,就最好(IDEA还带GUI,很方便&…...
pyhton基础【2】基本语法
一. 注释 单行注释 以#开头,#右边的所有的内容当做说明,起辅助说明作用 # 我是一个单行注释 print(Hello) 多行注释 """ 在三引号中的注释被称之为多行注释 可以写很多行的功能说明 """ 二. 交互模式 终端输入代码…...
python数据结构-列表详解
Python中的列表(List)是一种序列类型的数据结构,它支持元素的动态添加和删除,可以容纳任意类型的数据,包括数字、字符串、甚至是其他列表或其他复杂数据结构。列表因其灵活性和广泛的应用场景,成为Python中最常用的数据结构之一。…...

本地环境下 前端突然端口占用问题 针对vscode
1.问题背景 本地运行前端代码,虚拟机中使用nginx反向代理。两者都使用vscode进行开发。后端使用vscode远程连接。在前端发起一次接口请求后,后端会产生新的监听端口,出现如下图的提示情况。随后前端刷新,甚至无法正常显示界面。 …...
flutter 项目调试、flutter run --debug调试模式 devtools界面说明
Flutter DevTools 网页界面说明 1. 顶部导航栏 Inspector:查看和调试 Widget 树,实时定位 UI 问题。Performance-- 性能分析面板,查看帧率、CPU 和 GPU 使用情况,识别卡顿和性能瓶颈。Memory-- 内存使用和对象分配分析ÿ…...
在局域网(LAN)中查看设备的 IP 地址
在局域网(LAN)中查看设备的 IP 地址,可以使用以下几种方法: 方法 1:使用 ipconfig(Windows) 1. 打开 CMD: 按 Win R,输入 cmd,回车。 2. 输入命令&#…...
Axure 基本用法学习笔记
一、元件操作基础 1. 可见性控制 隐藏/显示:可以设置元件的可见性,使元件在特定条件下隐藏或可见 应用场景:创建动态交互效果,如点击按钮显示隐藏内容 2. 层级管理 层级概念:元件有上下层关系,上层元件…...
使用 Hyperlane 实现 WebSocket广播
使用 Hyperlane 实现 WebSocket广播 hyperlane 框架原生支持 WebSocket 协议,开发者无需关心协议升级过程,即可通过统一接口处理 WebSocket 请求。本文将介绍如何使用 hyperlane 实现服务端的单点发送与广播发送功能,以及如何配套实现一个简…...
SQL每日一题(5)
前言:五更!五更琉璃!不对!是,五更佩可! 原始数据: new_hires reasonother_column1other_column2校园招聘信息 11社会招聘信息 22内部推荐信息 33猎头推荐信息 44校园招聘信息 55社会招聘信息…...
git提交通用规范
提交类型 类型说明feat新增功能或特性fix修复Bugdocs文档更新(README、CHANGELOG、注释等)style代码样式调整(空格、分号、格式等,不改变逻辑)refactor代码重构(既非新增功能,也非修复Bug的代码…...

C++ - 仿 RabbitMQ 实现消息队列(3)(详解使用muduo库)
C - 仿 RabbitMQ 实现消息队列(3)(详解使用muduo库) muduo库的基层原理核心概念总结:通俗例子:餐厅模型优势体现典型场景 muduo库中的主要类EventloopMuduo 的 EventLoop 核心解析1. 核心机制:事…...

docker部署XTdrone
目录 一、前置准备 二、依赖安装 三、ros安装 四、gazebo安装 五、mavros安装 六、PX4的配置 七、Xtdrone源码下载 八、xtdrone与gazebo(实际上应该是第四步之后做这件事) 九、键盘控制 参考链接:仿真平台基础配置 语雀 一、前置准…...

图解 | 大模型智能体LLM Agents
文章目录 正文1. 存储 Memory1.1 短期记忆 Short-Term Memory1.1.1 模型的上下文窗口1.1.2 对话历史1.1.3 总结对话历史 1.2 长期记忆Long-term Memory 2. 工具Tools2.1 工具的类型2.2 function calling2.3 Toolformer2.3.1 大模型调研工具的过程2.3.2 生成工具调用数据集 2.4 …...
Lambda表达式的方法引用详解
Lambda表达式的方法引用详解 1. 方法引用的概念与作用 定义:方法引用(Method Reference)是Lambda表达式的一种简化写法,允许直接通过方法名引用已有的方法。核心目的:减少冗余代码,提升可读性,尤其在Lambda仅调用一个现有方法时。语法符号:双冒号 ::。2. 方法引用的四种…...

echarts设置标线和最大值最小值
echarts设置标线和最大值最小值 基本ECharts图表初始化配置 设置动态的y轴范围(min/max值) 通过markPoint标记最大值和最小值点 使用markLine添加水平参考线 配置双y轴图表 自定义标记点和线的样式(颜色、符号等) 响应式调整图表大…...
gcc编译构建流程
0. 项目结构 /home/pi/test/ ├── src/ │ ├── add/ │ │ ├── add.cpp │ │ ├── add.h │ └── log/ │ ├── log.cpp │ ├── log.h │ ├── data.h ├── main.cppmain.cpp代码 // main.cpp #include "log.h&quo…...

Maven 中央仓库操作指南
Maven 中央仓库操作指南 登录注册 在 Maven Central 登录(注册)账号。 添加命名空间 注册 通过右上角用户菜单跳转到命名空间管理页面: 注册命名空间: 填入你拥有的域名并注册: 刚提交的命名空间状态是Unverified…...

BUUCTF——RCE ME
BUUCTF——RCE ME 进入靶场 <?php error_reporting(0); if(isset($_GET[code])){$code$_GET[code];if(strlen($code)>40){die("This is too Long.");}if(preg_match("/[A-Za-z0-9]/",$code)){die("NO.");}eval($code); } else{highlight…...
clickhouse-1-特性及docker化安装
clickhouse-1-特性及docker化安装 1.核心特性1.1.列式存储与高效压缩1.2.向量化执行引擎1.3.分布式架构与高可用性1.4.多样化的表引擎1.5.实时处理能力2.安装2.1 拉取镜像2.2 创建容器3.连接4.使用4.1.创建数据库5.其他5.1 primary key5.2 ENG…...