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

文章目录

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

前言

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

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

图的初印象

我们接触数据结构通常有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.mfbz.cn/a/132785.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言求解有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

完整代码: /*有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月 又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 程序分析: 兔子的规律为数列1,1,2,3,5,8…

MySQL中的json使用注意

MySQL中json是一种重要的数据类型 好的点在于其不必事先定义列得名称啥的 不过不要将明显的关系型数据作为json来存储,例如用户余额、姓名、身份证等,这些是用户必须包含的数据 json适合存储的是给每个用户(或者物品)打的标签&…

超简单的Linux FTP服务搭建教程

目录 前言1、检查vsftp是否已安装2、安装vsftpd3、启动ftp服务4、测试ftp服务5、上传文件配置总结 前言 本文记录了在Kylin Linux Desktop V10(SP1)系统上搭建FTP服务的过程。FTP是File Transfer Protocol的缩写,译为文件传输协议,是用于在网络上进行文…

docker复制镜像文件

一、复制镜像 #1. 查找本机已有的镜像docker images |grep xxxx#2. 将镜像复制出来指向到xxxx.tar的文件中 docker save 343cca04e31d > xxxx.tareg: 二、加载镜像 直接将拷贝好的镜像包直接加载即可 docker load < myimage.tar

NO.304 二维区域和检索 - 矩阵不可变

题目 给定一个二维矩阵 matrix&#xff0c;以下类型的多个请求&#xff1a; 计算其子矩形范围内元素的总和&#xff0c;该子矩阵的 左上角 为 (row1, col1) &#xff0c;右下角 为 (row2, col2) 。 实现 NumMatrix 类&#xff1a; NumMatrix(int[][] matrix) 给定整数矩阵 …

组成原理备考学习 day2 (2.1)

组成原理备考学习 day2 第二章 数据的表示和运算2.1 数制和编码2.1.1 进位计数法进制转换BCD码 2.1.4 字符2.1.5 校验原理2.1.6 海明校验码2.1.7 循环冗余校验码 第二章 数据的表示和运算 2.1 数制和编码 2.1.1 进位计数法 进制转换 16进制的字母为H BCD码 2.1.4 字符 2.…

基于CST的电磁感应透明设计与机制研究

前言 电磁感应透明&#xff08;EIT&#xff09;最早在量子力学中提出&#xff0c;但是量子系统实验条件十分苛刻且费用较高&#xff0c;超材料的出现对电磁感应透明的研究提供了一种新的方法。利用超材料单元结构设计灵活&#xff0c;通过排列不同结构可以实现操控电磁波而且能…

Arduino到底适不适合做产品

文章目录 一、Arduino性能很低&#xff0c;不如树莓派等开发板&#xff0c;所以不要用Arduino做开发二、Arduino程序效率很低&#xff0c;所以不要用Arduino做开发三、Arduino只能开发玩具&#xff0c;不能做产品四、Arduino开发板成本太高&#xff0c;不适合做产品总结个人见解…

【图像分类】【深度学习】【Pytorch版本】 GoogLeNet(InceptionV2)模型算法详解

【图像分类】【深度学习】【Pytorch版本】 GoogLeNet(InceptionV2)模型算法详解 文章目录 【图像分类】【深度学习】【Pytorch版本】 GoogLeNet(InceptionV2)模型算法详解前言GoogLeNet(InceptionV2)讲解Batch Normalization公式InceptionV2结构InceptionV2特殊结构GoogLeNet(I…

[量化投资-学习笔记011]Python+TDengine从零开始搭建量化分析平台-MACD金死叉策略回测

在上一章节 MACD金死叉中结束了如何根据 MACD 金死叉计算交易信号。 目录 脚本说明文档&#xff08;DevChat 生成&#xff09;MACD 分析脚本安装依赖库参数配置查询与解析数据计算 MACD 指标判断金叉和死叉计算收益绘制图形运行脚本 本次将根据交易信号&#xff0c;模拟交易。更…

《数字图像处理-OpenCV/Python》连载(41)图像的旋转

《数字图像处理-OpenCV/Python》连载&#xff08;41&#xff09;图像的旋转 本书京东优惠购书链接&#xff1a;https://item.jd.com/14098452.html 本书CSDN独家连载专栏&#xff1a;https://blog.csdn.net/youcans/category_12418787.html 第 6 章 图像的几何变换 几何变换分…

数据分析实战 | 贝叶斯分类算法——病例自动诊断分析

目录 一、数据及分析对象 二、目的及分析任务 三、方法及工具 四、数据读入 五、数据理解 六、数据准备 七、模型训练 八、模型评价 九、模型调参 十、模型预测 一、数据及分析对象 CSV文件——“bc_data.csv” 数据集链接&#xff1a;https://download.csdn.net/d…

RocketMQ(一):基本概念和环境搭建

Spring源码系列文章 RocketMQ(一)&#xff1a;基本概念和环境搭建 目录 一、RocketMQ简介二、各个MQ产品的比较三、RocketMQ重要概念1、基本概念2、消息从发送到被消费的的流程3、生产和消费理解 四、RocketMQ安装1、下载RocketMQ2、解压并配置环境变量3、修改nameServer的运行…

微软和Red Hat合体:帮助企业更方便部署容器

早在2015年&#xff0c;微软就已经和Red Hat达成合作共同为企业市场开发基于云端的解决方案。时隔两年双方在企业市场的多个方面开展更紧密的合作&#xff0c;今天两家公司再次宣布帮助企业更方便地部署容器。 双方所开展的合作包括在微软Azure上部署Red Hat OpenShift&#xf…

学习c#的第四天

目录 C# 变量 C# 中的变量定义与初始化 接受来自用户的值 C# 中的 Lvalues 和 Rvalues 不同类型变量进行运算 静态变量 局部变量 C# 常量 整数常量 浮点常量 字符常量 字符串常量 定义常量 扩展知识 Convert.ToDouble 与 Double.Parse 的区别 静态常量和动态常…

Vue中的常用指令v-html / v-show / v-if / v-else / v-on / v-bind / v-for / v-model

前言 持续学习总结输出中&#xff0c;Vue中的常用指令v-html / v-show / v-if / v-else / v-on / v-bind / v-for / v-model 概念&#xff1a;指令&#xff08;Directives&#xff09;是Vue提供的带有 v- 前缀 的特殊标签属性。可以提高操作 DOM 的效率。 vue 中的指令按照不…

Hadoop入门——数据分析基本步骤

文章目录 1.概述2.分析步骤2.1第一步 明确分析目的和思路2.2第二步 数据收集2.3第三步 数据处理2.4第四步 数据分析2.5第五步 数据展现2.6第六步 报告撰写 3.总结 1.概述 2.分析步骤 2.1第一步 明确分析目的和思路 2.2第二步 数据收集 2.3第三步 数据处理 2.4第四步 数据分析 …

Java Web——HTTP协议

目录 1. HTTP协议概述 1.1. HTTP数据传输格式 1.2. HTTP协议特点 2. HTTP 1.0和HTTP 1.1 3. HTTP请求协议 3.1. GET方式请求协议 3.2. POST方式请求协议 3.3. GET请求和POST请求的区别 4. HTTP相应协议 4.1. 响应状态码 如果两个国家进行会晤需要遵守一定的礼节。所以…

ConcurrentHashMap详解

要避免 HashMap 的线程安全问题&#xff0c;有多个解决方法&#xff0c;比如改用 HashTable 或者 Collections.synchronizedMap() 方法。 但是这两者都有一个问题&#xff0c;就是性能&#xff0c;无论读还是写&#xff0c;他们两个都会给整个集合加锁&#xff0c;导致同一时间…

顺序图——画法详解

百度百科的定义&#xff1a; 顺序图是将交互关系表示为一个二维图。纵向是时间轴&#xff0c;时间沿竖线向下延伸。横向轴代表了在协作中各独立对象的类元角色。类元角色用生命线表示。当对象存在时&#xff0c;角色用一条虚线表示&#xff0c;当对象的过程处于激活状态时&…
最新文章