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

文章目录

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

前言

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

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

图的初印象

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

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

教科书

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

(1)图的定义
数据结构从未如此简单——图(一)_第1张图片
(2)无向图的示例

数据结构从未如此简单——图(一)_第2张图片
(3)图的邻接矩阵存储表示

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

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

力扣

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

数据结构从未如此简单——图(一)_第4张图片
(2)给你一个可以用图建模的应用题

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

数据结构从未如此简单——图(一)_第5张图片
算法题其实是对我们掌握知识的一种考验,在训练过程中,我们可以对图的各种算法进行演练。

工作中的实际应用

在很多软件中会有一些问题是图建模的。比如游戏中的地图,每个地块作为一个节点,地块之间的连接作为边,可以使用广度优先搜索等算法来确定两个点之间的最短路径。
数据结构从未如此简单——图(一)_第6张图片

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

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

我们的学习方法

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

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

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

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

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

(1)学习图的存储

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

(2)学习最短路径

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

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

你可能感兴趣的:(数据结构从未如此简单,数据结构,算法,图论,学习方法)