数据结构——图

Posted zkccpro

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构——图相关的知识,希望对你有一定的参考价值。

图论入门

图是啥?拓扑结构上的定义:由节点和边组成,各节点可由边任意联结形成的拓扑结构。另外,一般来说不允许出现重复边(多条边的起点和终点重复)和自连环(一条边的起点和终点是同一个节点)。

按照边是否有明确指向,可以将图分成有向图和无向图。

可见,从直观印象来说,图就是一种广义上的树结构,允许树的任意层节点互连。因此图数据结构在计算机工程上有着重要而广泛的应用。

说几个我目前看到的图结构应用吧!

  1. 并发式图计算引擎/分布式图计算引擎:

    一种帮助后端业务架构开发者处理线程和数据依赖问题的计算引擎。在繁杂的后端业务中直接使用线程是一个令人头大的问题,危险易错且不一定很有效率。更关键的是难以捋顺清楚整个业务架构的数据流情况,这样的业务架构往往学习成本非常高。而图计算引擎正是解决了这两部分问题,把每个业务都抽象为算子,各算子之间靠数据相连接。并且,图引擎会自动处理算子间的并发问题,以最高效的方式运行整个业务逻辑。

  2. 图数据库:

    图的弟弟——树,在计算机工程中的应用恐怕是最典型的了:关系型数据库,就用到了树结构。但树结构也明显限制了查找的速度和灵活性。而图数据结构相较于树结构正好具备较强的灵活性,因此对于海量关系复杂的数据存储及查询任务,图数据库是一种很好的选择。

总之,图数据结构在现如今信息量膨胀背景下的计算机工程领域中,还是有广泛应用的。特别是电商、通讯公司的搜索/推荐部门,对图结构的使用是很广泛的。下面我们重点看一下图的存储和算法。

一、图的存储表示方法

图这么nb,那该怎么存储呢?如果是让你来存储一张图(1亿节点+10亿边),你会采用什么方案呢?

存储需要均衡占用空间、占用空间稳定性、查询速度、查询速度稳定性等方面;先思考一下!

1. 邻接矩阵

用一个行列数均与图节点个数相等的矩阵表示图,邻接矩阵中的每个点代表两个节点间是否存在边:

图1 邻接矩阵存储图

在邻接矩阵中,针对节点的查找是很快的,邻接矩阵的行列索引直接对应着一个节点。但有个问题就是存储空间占用也很大,可以推算一下成规模的图,用邻接矩阵存储的占用空间。而且,对于边十分稀少的图,明显有大量浪费空间,空间利用率不高。

  • 优点:查找节点特别快
  • 缺点:占用空间特别大;适合存储十分稠密的图(边多)。

2. 邻接表

用一个向量数组来存储图中每个节点与其他节点的连接情况(即边),数组中的向量个数等于图中节点个数:

图2 邻接表存储图

同样,你可以推算一下邻接表存储方式与邻接矩阵的占用空间大小。会发现相同的节点数,用邻接表存储明显更省空间。但这种存储是不稳定的:边越多,占用空间越大、查找一个节点的耗时越多。因此适合存储边更稀疏的图。

  • 优点:较邻接矩阵更省空间
  • 缺点:查找边的速度比邻接矩阵更慢;适合存储稀疏的图(边少)。

二、经典图算法

经过以上两种经典方法的介绍,相信你对图存储有了基本的认识,实际工程中的图数据库存储当然比经典方法更为复杂,考虑了更多因素,用来权衡占用空间、查询性能 以及 稳定性等维度。

那么,存储好了图之后,应该怎么利用图做一些想做的事情呢?这就需要一些图算法来支持。其中最经典的有以下两种,相信刷了足够多力扣题的你,对这两种方法应该不陌生了吧:

1. 深度优先搜索

  • 实现:记录路径的回溯;一般在工程中借助栈,使用迭代来实现。很少使用递归写法,因为不论是图计算还是图存储等等使用场景,都可能碰到图深度很大的情况,如果使用递归很可能把进程栈空间撑爆。这是一种典型的工程考虑!(没错,你如果在校招面试中说出这一点,可以算作一个小加分项吧!)

  • 应用:成环检测、判断两节点是否相连、两节点的路径数。。。

2. 广度优先搜索

  • 实现:和二叉树的层序遍历类似,用队列记录当前节点可达的所有节点。
  • 应用:找两节点最短路径*(十分经典的应用)*

最后,图作为一种数据结构,应该作为校招生的基础知识来掌握。但也要看你面试的部门,如果是搜索/推荐相关部门,那就很可能会被问到!如果不是这方面的部门,可能图的知识算作一个冷门知识了,可以先看一下本文有一个基础的认识。

以上是关于数据结构——图的主要内容,如果未能解决你的问题,请参考以下文章

[译]迈向下一代人工智能:催化神经人工智能革命

图灵机器人api返回数据格式怎么处理php

图灵模型和冯诺依曼模型

图灵程序设计丛书 共多少本?

图灵机冯诺依曼结构哈佛结构

图灵奖得主,程序 = 数据结构 + 算法