数据结构从未如此简单——图(一)

文章目录

  • 前言
  • 图的初印象
    • 教科书
    • 力扣
    • 工作中的实际应用
    • 我们的学习方法

前言

个人感觉数据结构学习最大的难点就是抽象。这些概念和算法都是从许多源问题中抽离、精炼、总结出来的。我们学习的看似是最精华的部分,但是忽略了推导过程,很容易变成死记硬背,碰到新问题也很难解决。

因此,我打算对数据结构重新梳理一遍,找找这些算法的源头,对不同的点进行深入思考,争取融会贯通。

图的初印象

我们接触数据结构通常有3个来源:

  1. 教科书
  2. 算法题(力扣、PAT等题库)
  3. 实际工作

教科书

下面3张图片分别是《数据结构(C++语言版)》里截取的。

(1)图的定义
在这里插入图片描述
(2)无向图的示例

在这里插入图片描述
(3)图的邻接矩阵存储表示

在这里插入图片描述
可以看到,教科书中的数据结构会用严谨的数学语言来描述,而示例代码为了适用于任何类型的数据,会进行抽象设计。我们阅读这样的内容的时候,脑子里要做好几层转换,比较费力。

对于教科书,我们通过更通俗的描述理解了以后,再用来确认细节是不错的。而且教科书里的内容权威、全面、系统,就让人觉得很踏实。不会存在那种东一榔头西一棒槌,还需要自己去总结知识点的情况。

力扣

选了2道用了图数据结构的题目,我们可以看下题目中对图的描述,还有给出的图数据。
(1)直接给你一个图
这种题目中的graph,通常节点用序号表示,再给你一个二维数组,用来表示边列表。

在这里插入图片描述
(2)给你一个可以用图建模的应用题

这种类型也蛮多的,有的在分析问题的过程中就自然地把图画出来了,也就能识别出这是用图建模的问题。有的则是比较难想到可以用图来解决,但是见得多了,也很容易可以识别,比如棋盘格、岛屿类问题等。

在这里插入图片描述
算法题其实是对我们掌握知识的一种考验,在训练过程中,我们可以对图的各种算法进行演练。

工作中的实际应用

在很多软件中会有一些问题是图建模的。比如游戏中的地图,每个地块作为一个节点,地块之间的连接作为边,可以使用广度优先搜索等算法来确定两个点之间的最短路径。
在这里插入图片描述

在实际应用中用代码来表示图,通常会更复杂,比如节点不再只是用一个简单的数字表示,游戏地块可能包含了很多其他的属性。

对于实际工作,学好了图的理论,看别人代码的时候更容易理解;另外,接到实际开发任务的时候,也能完成得更轻松。

我们的学习方法

可以看到,教科书->算法题库->实际应用,这是一个抽象程度逐步减少的过程。前人通过【实际应用】总结出了【数据结构理论】,而我们学习则是通过【理解理论】去【解决实际问题】。

对于学习来说,直接上手解决实际问题,还需要考虑很多数据结构以外的业务知识(比如游戏地图,需要考虑游戏运行模式等;网络通信,需要考虑网络设备的传输速率等),复杂性会高很多,花费的时间也更多。为了提高效率,我们可以通过相对没那么复杂的算法题来练习。

对于数据结构的学习方法,我认为最好的方式是这样:

  1. 通过了解实际应用,激发好奇心和增加学习动力
  2. 通过教科书确定我们要学习的范围并划分知识点
  3. 通过算法题锻炼单点能力
  4. 通过实际应用题对不同能力进行综合运用,加深理解

但是,这四步不是一个线性的过程。在我们学习的每一步都可以进行这样的循环,举2个例子:

(1)学习图的存储

  • 抛出问题,如何存储一个游戏地图?
  • 图的存储方式有邻接矩阵、邻接表和边列表等
  • 用邻接矩阵创建一个图的类,要求包含添加边、删除边等方法
  • 实际创建一个游戏地图,需要用图来存储。

(2)学习最短路径

  • 抛出问题,如何找到游戏地点A到游戏地点B的最短寻路路径?
  • 最短路径算法有:Dijkstra 、Bellman-Ford等。
  • 找到给定一个图的两点间最短路径。
  • 找到游戏任意两个地点间的最短路径,并高亮显示出来。

当然,如果已经有很强的学习动力和明确的目标,也可以省略中间的某些步骤,高效地针对某些知识点进行训练。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/188266.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java学习 10.Java-数组习题

一、创建一个 int 类型的数组, 元素个数为 100, 并把每个元素依次设置为 1 - 100 代码实现 public static void main(String[] args) {int[] arrnew int[100];for (int i 0; i < arr.length; i) {arr[i]i1;}System.out.println(Arrays.toString(arr));} 运行结果 二、改变…

react类式组件的生命周期和useEffect实现函数组件生命周期

概念 生命周期是一个组件丛创建,渲染,更新,卸载的过程,无论是vue还是react都具有这个设计概念,也是开发者必须熟练运用的,特别是业务开发,不同的生命周期做不同的事是很重要的. ....多说两句心得,本人是先接触vue的,无论是vue2还是vue3的生命周期,在理解和学习上都会比react更…

Spring IoC注解式开发

2023.11.11 注解的存在主要是为了简化XML的配置。Spring6倡导全注解开发。 负责声明Bean的注解&#xff0c;常见的包括四个&#xff1a; ComponentControllerServiceRepository 通过源码可以发现&#xff0c;Controller、Service、Repository这三个注解都是Component注解的别名…

【pytorch深度学习】使用张量表征真实数据

使用张量表征真实数据 本文为书pytorch深度学习实战的一些学习笔记和扩展知识&#xff0c;涉及到的csv文件等在这里不会给出&#xff0c;但是我会尽量脱离这一些文件将书本想要表达的内容给展示出来。 文章目录 使用张量表征真实数据1. 加载图像文件2. 改变布局3. 加载目录下…

【Gradle-12】分析so文件和依赖的关系

1、前言 在包大小的占比中&#xff0c;so文件的占比往往是最高的&#xff0c;动辄几兆的大小多一个都会把包大小的指标打爆。 而在各厂商要求对手机CPU ARM架构进行分包适配的情况下&#xff0c;你更需要知道哪些依赖是没有适配v7a/v8a的&#xff0c;这将影响你的APP在应用市场…

Vue3 + Naive-ui Data Table 分页页码显示不全

当使用naive-ui 表格并且使用分页组件的时候 需要增加 remote

C++使用线程池模拟异步事件处理机制

在C很多框架中都有异步事件处理机制&#xff0c;这导致我们在看源码时经常很疑惑&#xff0c;难以理解&#xff0c;而其中包含的编程套路可能是一些成熟的技术&#xff0c;只是我们不熟悉&#xff0c;比如WebRTC中类似于Qt的信号槽机制&#xff0c;线程事件处理, 或者使用系统异…

Sensor 点亮出图后,颜色偏红或者偏绿是为什么?

这是因为 sensor balck level 的值配置的不正确导致&#xff0c;black level 的值一般在效果参数的 calibration 参数里面。 在驱动调试阶段&#xff0c;我们一般都是复用其他已调试好的&#xff0c;sensor 的驱动文件及效果文件&#xff0c; 而不同 sensor 的 balck level 的…

【qemu逃逸】XCTF 华为高校挑战赛决赛-pipeline

前言 虚拟机用户名: root 无密码 设备逆向与漏洞分析 程序没有去符合, 还是比较简单. 实例结构体如下: 先总体说一下流程: encode 为 base64 编码函数, decode 为 base64 解码函数. 然后 encPipe 和 decPipe 分别存放编码数据和解码数据, 分别有四个: 其中 EncPipeLine 中…

网页推理游戏

目录 python challenge &#xff08;0&#xff09; &#xff08;1&#xff09; &#xff08;2&#xff09; The Riddle &#xff08;1&#xff09; &#xff08;2&#xff09; &#xff08;3&#xff09; &#xff08;4&#xff09; Nazo &#xff08;1&#xff09;…

【Spring】SpringBoot日志

SpringBoot日志 日志概述日志使用打印日志获取日志对象使用日志对象打印日志日志框架介绍门面模式SLF4J框架介绍(simple logging facade for java) 日志格式说明日志级别日志级别的分类日志级别的使用 日志配置配置日志级别日志持久化配置日志文件的路径和文件名配置日志文件的…

【tgcalls】Instance接口的实例类的创建

tg 里有多个版本,因此设计了版本管理的map,每次可以选择一个版本进行实例创建这样,每个客户端就可以定制开发了。tg使用了c++20创建是要传递一个描述者,里面是上下文信息 G:\CDN\P2P-DEV\tdesktop-offical\Telegram\ThirdParty\tgcalls\tgcalls\Instance.cpp可以看到竟然是…

【数据结构】顺序表 | 详细讲解

在计算机中主要有两种基本的存储结构用于存放线性表&#xff1a;顺序存储结构和链式存储结构。本篇文章介绍采用顺序存储的结构实现线性表的存储。 顺序存储定义 线性表的顺序存储结构&#xff0c;指的是一段地址连续的存储单元依次存储链性表的数据元素。 线性表的&#xf…

单词规律问题

给定一种规律 pattern 和一个字符串 s &#xff0c;判断 s 是否遵循相同的规律。 这里的 遵循 指完全匹配&#xff0c;例如&#xff0c; pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。 示例1: 输入: pattern “abba”, s “dog cat cat d…

【Git】Git分支与标签掌握这些技巧让你成为合格的码农

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Git》。&#x1f3af;&#x1f3af; &#x1f449…

vue Sts认证后直传图片到阿里云OSS

后端进行sts认证生成临时身份凭证&#xff0c;前端通过凭证直传图片等文件到OSS中 一 OSS配置 增加用户和角色&#xff0c;创建OSS bucket 1.1 添加用户 登录阿里云管理控制台&#xff0c;右侧头像&#xff0c;进入访问控制 点击左侧导航栏的身份管理的用户&#xff0c;点击…

MySQL的索引和复合索引

由于MySQL自动将主键加入到二级索引&#xff08;自行建立的index&#xff09;里&#xff0c;所以当select的是主键或二级索引就会很快&#xff0c;select *就会慢。因为有些列是没在索引里的 假设CA有1kw人咋整&#xff0c;那我这个索引只起了前一半作用。 所以用复合索引&am…

探索微信小程序框架的精华——高质量的优秀选择

目录 引言&#xff1a; 1. 框架性能 2. 开发者工具支持 3. 文档和社区支持 4. 扩展能力 5. 使用率和稳定性 结语&#xff1a; 引言&#xff1a; 微信小程序作为一种轻量级、高效便捷的应用形式&#xff0c;已经在移动应用领域占据了重要地位。而其中&#xff0c;选择一个…

【EI会议征稿】JPCS独立出版-第五届新材料与清洁能源国际学术会议(ICAMCE 2024)

JPCS独立出版-第五届新材料与清洁能源国际学术会议&#xff08;ICAMCE 2024&#xff09; 2024 5th International Conference on Advanced Material and Clean Energy 第五届新材料与清洁能源国际学术会议&#xff08;ICAMCE 2024&#xff09;将于2024年2月23-25日在中国▪长沙…

【论文阅读】多模态NeRF:Cross-Spectral Neural Radiance Fields

https://cvlab-unibo.github.io/xnerf-web intro 从不同的light spectrum sensitivity获取信息&#xff0c;同时需要obtain a unified Cross-Spectral scene representation – allowing for querying, for any single point, any of the information sensed across spectra。…