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

【数据结构】数据结构整体大纲

数据结构用来干什么的?很简单,存数据用的。 (这篇文章仅介绍数据结构的大纲,详细讲解放在后面的每一个章节中,逐个击破)

那为什么不直接使用数组、集合来存储呢 ——> 如果有成千上亿条数据呢?假如说:有一块连续的40w个字节大小的数据被存储在内存空间当中,请问,这个时候我需要提取出其中的某一条数据,不方便进行操作。

数组有个问题,数据一旦太大,如果想在内存中找到特定的空间很难,而我们将数据零散的四处分配在不同的空间中,所以我们采用了数据结构的方式进行数据的存储,然后中间通过指针的方式将这些数据串起来。创建之后,从此以后,这些数据形成了一个链条,所以,当我们知道一个链条的起始点,一个一个链接中的节点往下找,便可以找到这个链条其中的每一个数据,这便是数据结构的本质,这个链条被称为 链表。
请添加图片描述
根据上图的逻辑,我们现在要存储 10 20 30 40 50 60 六个数据使它们形成一个链表,该怎么写呢?

struct node
{int d;struct node *next;
};struct node *p1 = (struct node *)malloc(sizeof(struct node));
p1->d = 10;struct node *p2 = (struct node *)malloc(sizeof(struct node));
p2->d = 20;
p1->next = p2;struct node *p3 = (struct node *)malloc(sizeof(struct node));
p3->d = 30;
p2->next = p3;
p1->next->next->d;  // 30//如此以往,环环相扣,首位相连

这便是数据结构的本质与基础,很简单吧。数据结构一点都不难,只要能够理解数据之间串联方式的内在逻辑,再看数据结构的各种方式不过是根据以上图基础的变种而已。它们的目的都是 链接零散在内存空间中数据 而存在的,用一些具有规则、规律的方式或者结构,对数据进行存储、插入、删除、查找、更新的过程。

什么是数据

  • 广义:你在计算机里看到的一切 —— 现实生活中的一切事物皆是数据。
  • 狭义:代码产生的一系列数据:int a = 10; ——> a是数据,10也是数据。

什么是结构?

  • 指的是关系 ——> 存储关系,逻辑关系,算法关系等。

什么是数据结构?

  • 研究数据与数据之间的关系。例如:

关系:

  1. 研究分析 数据 与 数据之间的关系 ----------------------------> 逻辑关系(结构):表示数据运算之间的抽象关系(如邻接关系、从属关系等),按每个数据元素可能具有的 直接前驱数直接后继数 将逻辑结构分为“线性结构”和非线性结构两大类。
    1.1 集合
    数据元素除了“同属于一个集合”外,无其他关系。例子: 鸡,鸭,鹅 属于 —> 禽类
    1.2 线性结构
    指数据元素之间存在 一个对一个 的关系,形成有序的集合。这样结构中,每个数据元素都有一个明确的 前驱后继,除了第一个元素没有前驱,最后一个元素没有后继,就像一辆火车一样一节节车厢链接在一起。
    1.3 树状结构
    呈现一个对多个的关系(自上而下)。
    1.4 图形结构
    呈现多对多的关系(人工智能)。
    例如:脑神经,数据元素呈现多对多的关系。
  2. 将这种关系保存在计算机中 -------------------------------------> 存储关系(结构) :存储结构是数据的逻辑结构在计算机存储器中的映射。存储结构是通过计算机语言所编制的程序来实现的。
    2.1 顺序存储
    将这些数据依次存储在一块连续的空间中(数组)
    2.2 链式存储
    给每一个数据单独申请一个独立的空间,利用指针建立它们之间的关系。(构造数据用结构体形式去实现)
  3. 通过某种手段,修改在计算机中保存的关系 ----------------> 算法(狭义:增删改查)
    3.1 插入 删除 修改 替换 排序 (增删改查操作)

数据结构是计算机科学的核心内容,主要研究如何高效地组织、存储和操作数据。不同的数据结构适用于不同的应用场景,可以显著提高程序的性能和算法的效率。这篇文章是数据结构的完整学习大纲,涵盖了基础概念、常用数据结构及其相关算法、应用场景等内容。学习数据结构时,建议按照从简单到复杂的顺序,由浅入深逐步深入理解每种结构的实现和应用。

数据结构的作用:

  • 提高程序的可维护性和扩展性:数据结构通过抽象化数据的存储和操作,使程序更易维护和扩展。

解决特定领域的问题:

  • 数据结构广泛应用于操作系统、数据库、网络、人工智能、大数据等领域,解决特定问题。比如说:B+树 用于数据库索引,图结构 用于建模网络。
  1. 数据结构的定义和分类:高效的存储与操作数据
    1.1 数据结构提供了一种合理的方式来组织和存储数据,以支持各种数据操作(如插入、删除、查询、排序等)。
    1.2 例如:使用 数组 可以快速按索引访问数据。使用 哈希表 实现快速查找。
  2. 数据结构与算法的关系
  3. 时间复杂度与空间复杂度
    3.1 大 O 表示法
    3.2 最优、最坏、平均复杂度分析;合理选择数据结构可以显著降低算法的时间复杂度。
    3.3 例如,使用 实现优先队列,使插入和删除的时间复杂度从 O(n) 降为 O(log n)。
  4. 基本操作:插入、删除、查找、更新。

数据结构整体大纲

数据结构的分类

(1)线性数据结构

  • 数据元素按线性顺序排列。
  • 数据元素之间存在 一个对一个 的关系,形成有序的集合。这样结构中,每个数据元素都有一个明确的 前驱后继,除了第一个元素没有前驱,最后一个元素没有后继,就像一辆火车一样一节节车厢链接在一起。
  • 常见例子:
    • 数组(Array)
    • 链表(Linked List):单向链表、单向循环链表、双向链表、双向循环链表、内核链表。
    • 栈(Stack)
    • 队列(Queue)
    • 双端队列(Deque)

(2)非线性数据结构

  • 数据元素之间不一定是线性关系,可以是层次关系或网状关系。
  • 常见例子:
    • 树(Tree)
    • 图(Graph)

(3)哈希结构

  • 通过哈希函数将数据映射到特定位置,支持快速查找和插入。
  • 常见例子:
    • 哈希表(Hash Table)

(4)高级数据结构

  • 基于基础数据结构的抽象或优化。
  • 常见例子:
    • 堆(Heap)
    • 并查集(Union-Find)
    • 字典树(Trie)
    • 跳表(Skip List)
    • B 树与 B+ 树

各数据结构的详细介绍

1. 数组(Array)
作用:存储固定大小的连续数据,支持随机访问。
解决的问题:快速按索引访问数据。
应用场景

  • 实现栈、队列。
  • 存储二维或多维矩阵数据(如图像处理)。
  • 动态数组(如 C++ 的 std::vector 和 Python 的 list)。

2. 链表(Linked List)
作用:通过节点链式存储数据,支持动态插入和删除。
解决的问题:在不知道数据大小或需要频繁插入/删除时提供灵活的存储方式。
种类

  • 单向链表、单向循环链表、双向链表、双向循环链表、内核链表。

应用场景

  • 内存管理(如空闲内存块管理)。
  • LRU 缓存(使用双向链表和哈希表实现)。
  • 实现队列和其他数据结构。

3. 栈(Stack)
作用:后进先出(LIFO)的数据结构。
解决的问题:用于处理具有递归或嵌套结构的数据。
常见操作:push(入栈),pop(出栈),peek(查看栈顶元素)。
应用场景

  • 函数调用栈(保存函数调用上下文)。
  • 括号匹配问题(如验证表达式合法性)。
  • 表达式求值(如中缀转后缀表达式)。

4. 队列(Queue)
作用:先进先出(FIFO)的数据结构。
解决的问题:适用于需要按顺序处理任务的场景。
种类

  • 普通队列、双端队列(Deque)、优先队列。

应用场景

  • 任务调度(如操作系统中的进程调度)。
  • 广度优先搜索(BFS)。
  • 实现消息队列(如 RabbitMQ)。

5. 树(Tree)
基本概念:节点、根、叶子、子树、高度、深度。
作用:层次化存储数据,便于快速查找、插入和删除。
解决的问题:高效存储和操作有层次关系的数据。
种类

  • 二叉树、二叉搜索树(BST)、平衡二叉树(如 AVL 树、红黑树)、堆。

应用场景

  • 文件系统(如目录结构)。
  • 数据检索(如表达式树)。
  • 数据库索引(如 B+ 树)。

6. 图(Graph)
基本概念:存顶点、边、权重、度。
作用:存储网状关系的数据。
解决的问题:建模网络、路径规划等问题。
常见表示

  • 邻接矩阵、邻接表。
  • 有向图 vs 无向图。

应用场景

  • 网络路由(如最短路径算法:Dijkstra)。
  • 社交网络分析。
  • 电路设计、推荐系统。

7. 哈希表(Hash Table)
基本概念:哈希函数,键值对存储。
作用:通过哈希函数支持快速插入和查找。
解决的问题:快速检索键值对。
冲突解决方法

  • 链地址法、开放地址法。

应用场景

  • 缓存(如 LRU 缓存)。
  • 数据去重。
  • 实现字典(如 Python 的 dict)。

8. 堆(Heap)
作用:动态维护最大值或最小值。
解决的问题:快速找到优先级最高的元素。
种类

  • 大顶堆、小顶堆。
  • 完全二叉树。

应用场景

  • 优先队列。
  • Top-K 问题(如实时流数据分析)。
  • 堆排序。

高级数据结构

9. 并查集(Union-Find)
作用:解决连通性问题。
解决的问题:动态合并集合并查询集合所属。
优化

  • 路径压缩、按秩合并。

应用场景

  • 网络连通性。
  • Kruskal 最小生成树算法。

10. 字典树(Trie)
作用:高效存储和检索字符串集合。
解决的问题:快速搜索前缀匹配数据。

应用场景

  • 搜索引擎的自动补全。
  • 拼写检查。
  • 字符串去重。

11. 平衡树
作用:插入、删除、旋转操作,性质与平衡维护数据。
解决的问题:性质与平衡维护;应用:STL 的 mapset

应用场景

  • AVL 树。
  • 红黑树。

12. 跳表(Skip List)
作用:通过引入多级索引(多层链表)以提高操作效率,是平衡树(如 AVL 树、红黑树)的高效替代方案,能够在有序数据集合中快速进行查找、插入和删除操作。
解决的问题:时间复杂度分析:O(log n)

应用场景

  • 数据库索引。
  • 有序集合操作。

13. B 树与 B+ 树
作用:平衡多路查找树,适合磁盘存储。
解决的问题:高效管理和检索大规模数据。

应用场景

  • 数据库索引(如 MySQL)。
  • 文件系统(如 NTFS)。

数据结构解决的问题及对应应用场景

问题类型解决问题的数据结构应用场景
快速查找和插入哈希表、平衡树(红黑树、AVL 树)数据检索、缓存、字典实现
动态优先级管理堆(大顶堆、小顶堆)优先队列、任务调度、实时流数据的 Top-K 问题
快速存储和检索字符串字典树(Trie)拼写检查、搜索引擎自动补全
路径或连通性问题图(邻接表、邻接矩阵)、并查集网络路由、社交网络分析、最小生成树
数据的层次化存储与操作树(BST、B+ 树)文件系统、数据库索引
处理动态长度的数据链表(单链表、双向链表)内存管理、链式存储
任务调度或顺序问题队列、双端队列(Deque)操作系统进程调度、消息队列
递归或嵌套问题函数调用栈、表达式求值、括号匹配
搜索和路径规划问题图(DFS、BFS)、堆(用于 Dijkstra)地图导航、最短路径算法
大规模数据的排序与检索堆、平衡树(红黑树)、B+ 树外部排序、数据库查询、文件系统

常用算法与数据结构结合

  1. 排序算法
    • 冒泡排序、选择排序、插入排序
    • 快速排序、归并排序、堆排序
    • 桶排序、计数排序、基数排序
    • 时间复杂度及适用场景
  2. 搜索算法
    • 线性搜索
    • 二分搜索
    • 深度优先搜索(DFS)、广度优先搜索(BFS)
    • A* 搜索算法(启发式搜索)
  3. 字符串匹配算法
    • 暴力匹配
    • KMP 算法
    • Rabin-Karp 算法
    • Trie 树(前缀树)

综上。
数据结构的作用:通过合理组织和存储数据,解决效率、存储和操作问题。
学习掌握的过程由浅入深:先掌握基础数据结构(数组、链表、栈、队列),再逐步学习复杂的数据结构(树、图、哈希)。
结合算法:理解排序、搜索、字符串匹配等算法中使用的数据结构。
解决的问题:快速查找、动态优先级管理、路径规划、大规模数据检索等。
应用场景:从操作系统、数据库、网络路由到人工智能、大数据分析,数据结构是解决实际问题的重要工具。

每种数据结构都有其独特的特性和适用场景,学习时需结合理论与应用,理解其实现原理和使用方法,以便在实际开发中合理选用。

以上。仅供学习与分享交流,请勿用于商业用途!转载需提前说明。

我是一个十分热爱技术的程序员,希望这篇文章能够对您有帮助,也希望认识更多热爱程序开发的小伙伴。
感谢!

相关文章:

【数据结构】数据结构整体大纲

数据结构用来干什么的?很简单,存数据用的。 (这篇文章仅介绍数据结构的大纲,详细讲解放在后面的每一个章节中,逐个击破) 那为什么不直接使用数组、集合来存储呢 ——> 如果有成千上亿条数据呢&#xff…...

【C++基础】09、结构体

一、结构体(struct) C/C 数组允许定义可存储相同类型数据项的变量,但是结构体是 C 中另一种用户自定义的可用的数据类型,它允许存储不同类型的数据项。 结构体用于表示一条记录,假设现在想要跟踪图书馆中书本的动态,可能需要跟踪每…...

大恒相机开发(2)—Python软触发调用采集图像

大恒相机开发(2)—Python软触发调用采集图像 完整代码详细解读和功能说明扩展学习 这段代码是一个Python程序,用于从大恒相机采集图像,通过软件触发来采集图像。 完整代码 咱们直接上python的完整代码: # version:…...

QT的前景与互联网岗位发展

qt是用来干什么的 --》桌面应用开发(做电脑的应用程序,面对客户端)。 主要用于开发跨平台的应用程序和用户界面(UI)。它是一个全面的C库集合,提供了构建软件应用所需的各种工具和功能。 客户端开发的重…...

青藤入选工信部“2024年网络安全技术应用典型案例拟支持项目名单”

近日,工业和信息化部公示了“2024年网络安全技术应用典型案例拟支持项目名单”,青藤云安全联合某股份制银行共同申报的主机威胁狩猎平台项目凭借其技术先进性及行业示范性成功入选。 网络安全技术应用试点示范工作是由工业和信息化部、国家互联网信息办公…...

NVIDIA GPU 内部架构介绍

NVIDIA GPU 架构 NVIDIA GPU 的 SM(Streaming Multiprocessor) 和 GPC(Graphics Processing Cluster) 是 GPU 架构中的关键组成部分。它们决定了 GPU 的计算能力和性能,以下是对这两个参数的详细介绍: 1. …...

重温设计模式----装饰模式

文章目录 装饰模式定义UML 图其主要优点包括:装饰模式的主要角色有:C 代码示例总结 装饰模式定义 动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式必生成子类更加灵活 装饰模式(Decorator Pattern&…...

第十六章 C++ 字符串

C 字符串 C 提供了以下两种类型的字符串表示形式: C 风格字符串C 引入的 string 类类型 C 风格字符串 C 风格的字符串起源于 C 语言,并在 C 中继续得到支持。字符串实际上是使用 null 字符 终止的一维字符数组。因此,一个以 null 结尾的…...

MySQL中Seconds_Behind_Master是怎么计算的

目录 1.Seconds_Behind_Master计算方式2.Seconds_Behind_Master 计算方式会存在什么问题3.更好的方式3.1 实现方法3.2 优点在MySQL中,Seconds_Behind_Master是一个用于表示从库(Slave)落后于主库(Master)的时间(以秒为单位)的指标。 1.Seconds_Behind_Master计算方式 其…...

React Native 集成原生Android功能

React Native 集成原生功能完整指南 前言 在 React Native 开发中,我们经常需要使用设备的原生功能,比如蓝牙、打印机等。本文将以集成打印机功能为例,详细介绍如何在 React Native 项目中集成 Android 原生功能。 集成步骤概述 创建原生…...

Mac mini m4安装PD和Crack和关闭SIP

文章目录 说明PD下载地址Crack下载地址PD版本补丁版本说明SIP简介SIP关闭方法启用 SIP:补充说明 说明 参考文章地址 PD下载地址 PD20.0.0 PD20.0.1 PD20.1.0 PD20.1.1 PD20.1.2 PD20.1.3 Crack下载地址 Parallels Desktop Activation Tool PD版本补丁版本…...

详解C语言中的关键词:extern以及它需要注意的事项

extern 是C语言中一个非常重要的关键字,用于声明变量或函数的 外部链接性,即在当前文件中使用另一个文件中定义的变量或函数。以下是 extern 的作用和使用场景: 1. extern 的作用 跨文件访问: extern 告诉编译器,某个…...

框架程序设计-简答以及论述

目录 maven的pom作用: Pointcut("execution(*com.example.dome.*.*(……))") 缓存的作用,redis配置过程 Redis配置过程: SpringBoot缓存配置过程: AOP的五种增强注解: 论述题:包结构作用、…...

ce第六次作业

1、判断当前磁盘剩余空间是否有20G,如果小于20G,则将报警邮件发送给管理员,每天检查一次磁盘剩余空间。 [rootServer ~]# yum install -y mailx [rootServer ~]# yum -y install bind-utils [rootServer ~]# vim /etc/mail.rc set from15339…...

为何页面搜索应避免左模糊和全模糊查询???

前言 在构建高效且可扩展的Web应用程序时,数据库查询的性能是影响用户体验的关键因素之一。特别是对于涉及大量数据的页面搜索功能,选择正确的查询方式不仅可以提升应用的速度,还能显著改善用户交互体验。 B-Tree索引与最左前缀匹配特性 1…...

AI可信论坛亮点:合合信息分享视觉内容安全技术前沿

前言 在当今科技迅猛发展的时代,人工智能(AI)技术正以前所未有的速度改变着我们的生活与工作方式。作为AI领域的重要盛会,CSIG青年科学家会议AI可信论坛汇聚了众多青年科学家与业界精英,共同探讨AI技术的最新进展、挑…...

在 Mac M2 上安装 PyTorch 并启用 MPS 加速的详细教程与性能对比

1. 安装torch 在官网上可以查看安装教程,Start Locally | PyTorch 作者安装了目前最新的torch版本2.5.1,需要提前安装python3.9及以上版本,作者python版本是python3.11最新版本 使用conda安装torch,在终端进入要安装的环境&…...

生成式人工智能在生产型企业中的应用

生成式人工智能(Generative AI)是指使用人工智能来创建新内容,如文本、图像、音乐、音频和视频等。生成式人工智能在生产型企业中的应用涵盖了内容创作与自动化、数据分析与决策支持、生产流程优化、产品设计与开发、客户服务与沟通、员工培训…...

Linux逻辑卷管理

目录 实验要求 实验操作 1、 为Linux新添加一块SCSI磁盘/dev/sdc,容量为1024MB。在该磁盘上创建三个分区sdc1、sdc2、sdc3,大小为128MB,标识为Linux native分区。 2、 在三个分区上创建物理卷;将三个物理卷加入VolGroup00卷组&…...

机器人加装电主轴【铣削、钻孔、打磨、去毛刺】更高效

机器人加装电主轴进行铣削、钻孔、打磨、去毛刺等作业,展现出显著的优势,并能实现高效加工。 1. 高精度与高效率 电主轴特点:高速电主轴德国SycoTec的产品,转速可达100000rpm,功率范围广,精度≤1μm&#…...

opencv sdk for java中提示无stiching模块接口的问题

1、问题介绍 安卓项目中有新的需求,在 jni 中增加 stiching_detail.cpp 中全景拼接的实现。 但是在编译时,出现大量报错,如下截图所示 实际上,其他opencv的接口函数 例如 core dnn等都能正常使用,直觉上初步怀疑 ope…...

今天最新早上好问候语精选大全,每天问候,相互牵挂,彼此祝福

1、朋友相伴,友谊真诚永不变!彼此扶持绿树荫,共度快乐雨后天!一同分享的表情,愿我们友情长存,一生相伴永相连! 2、人生几十年,苦累伴酸甜,风华不再茂,雄心非当…...

五种IO模型- 阻塞IO、非阻塞IO、多路复用IO、信号驱动IO以及异步IO

在操作系统中处理输入/输出(IO)操作的过程中,存在多种方式,包括阻塞IO、非阻塞IO、多路复用IO、信号驱动IO以及异步IO。这些方式在操作系统实现和应用程序编写时有着不同的适用场景和性能特征。接下来,我将逐一介绍它们…...

Vscode GStreamer插件开发环境配置

概述 本教程使用vscode和Docker搭建Gstreamer2.24的开发环境,可以用于开发调试Gstreamer程序或者自定义插件开发。 1. vscode依赖插件 C/C Extension Pack(ms-vscode.cpptools-extension-pack):该插件包包含一组用于 Visual St…...

flask基础

from flask import Flask, requestapp Flask(__name__)# app.route(/) # def hello_world(): # put applications code here # return Hello World!app.route(/) # 路由 当用户访问特定 URL 时,Flask 会调用对应的视图函数来处理请求 def index():return …...

Java日志框架:log4j、log4j2、logback

文章目录 配置文件相关1. properties测试 2. XMl使用Dom4j解析XML Log4j与Log4j2日志门面 一、Log4j1.1 Logges1.2 Appenders1.3 Layouts1.4 使用1.5 配置文件详解1.5.1 配置根目录1.5.2 配置日志信息输出目的地Appender1.5.3 输出格式设置 二、Log4j22.1 XML配置文件解析2.2 使…...

鸿蒙-expandSafeArea使用

应用未使用setWindowLayoutFullScreen()接口设置窗口全屏布局时,默认使能组件安全区布局。可以使用expandSafeArea属性扩展安全区域属性进行调整 扩展安全区域属性原理 布局阶段按照安全区范围大小进行UI元素布局。布局完成后查看设置了expandSafeArea的组件边界&…...

【es6复习笔记】Spread 扩展运算符(8)

在现代前端开发中,JavaScript 的扩展运算符(Spread Operator)是一个非常有用的特性,它允许你将数组或对象展开,以便在函数调用、数组拼接、对象复制等场景中更方便地处理数据。扩展运算符(spread&#xff0…...

第22天:信息收集-Web应用各语言框架安全组件联动系统数据特征人工分析识别项目

#知识点 1、信息收集-Web应用-开发框架-识别安全 2、信息收集-Web应用-安全组件-特征分析 一、ICO图标: 1、某个应用系统的标示,如若依系统有自己特点的图标;一旦该系统出问题,使用该系统的网站都会受到影响; 2、某个公…...

后端-redis

Redis RedisString类型String类型的常用命令 Hash类型Hash类型的常用命令 List类型List类型的常用命令 Set类型Set类型的常用命令 SortedSet类型SortedSet类型的常用命令 Redis序列化缓存更新策略缓存穿透缓存雪崩缓存击穿 Redis Redis是一个key-value的数据库,key…...