前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >有向图之数据类型和可达性分析

有向图之数据类型和可达性分析

作者头像
大数据和云计算技术
发布2018-07-26 16:02:04
9290
发布2018-07-26 16:02:04
举报

本篇主要讲有向图的两个方面,1、有向图的数据类型,2有向图的可达性分析。要是了解的同学欢迎讨论 。当然拉觉得无趣的也可以跳过。

在我们生活中常见的图数据结构除了无向图以外,还有有向图,这两者的区别就是我无向图向连的两个节点,是可以互相访问的,而再有向图中相连的两个节点只能从其中一个访问被指向的另一个节点。例如儿子和爸爸,你不可能让爸爸叫儿子爸爸,只能儿子叫他爹叫爸爸。

有向图的数据结构

有向图的叔叔类型主要描述有向图的如何用java代码实现的一个过程,方便大家理解后面关于有向图的内容。

这一块是他对应的构造方法,这是以一个有V个节点的但没有边的有向图,他把每一个节点都放到一个袋数据结构中,而对目前这个有向图来说他只有一些节点,而没有对应的节点之间的关系。这就需要我们下面的一个方法。

代码语言:javascript
复制
public Digraph(int V) {
   this.V = V;
   this.E = 0;
   adj = (Bag<Integer>[]) new Bag[V];
   for (int v = 0; v < V; v++) {
      adj[v] = new Bag<Integer>();
   }
}

这个方法是把节点直接用有向的边来连接两个节点,从而逐步构建出一个真正的有向图。由于每一个节点都是一个袋式结构的所以可以把他可以通向的每一个节点加入到他这个袋子里。

代码语言:javascript
复制
public void addEdge(int v, int w) {
   adj[v].add(w);
   E++;
}

整个类最主要的方法就是这两个。靠他们就可以构造出以一个有向图。

有向图的可达性

有向图的可达性是为了解决一个节点是否可以通向另一个节点的问题。例如是否存在s到达给定顶点v的有向路径。

在可达性分析中运用的理念是标记-清除的过程。例如 我从a-》b。然后把b标记,然后去看b可以到达那些节点,并去标记由此,一个一个节点逐渐标记。按这个过程

这个方法的用处是出便利当前节点中的袋结构中的每一个节点看是否便利过要是没有便利过则递归调用dfs方法来对可到达的每一个点进行便利。从而可以看出v可以到达的是有节点。

代码语言:javascript
复制
private void dfs(Digraph G, int v) {
   marked[v] = true;
   for (int w : G.adj(v)) {
      if (!marked[w]) {
         dfs(G, w);
      }
   }
}

而可达性分析就是基于这个方法上上的从而找出s点所有可以直接到达的节点。

代码语言:javascript
复制
public DirectedDFS(Digraph G, int s) {
   marked = new boolean[G.V()];
   dfs(G, s);
}

使用场景我们会在下章和大家分析和描述,大致代码就是这个样子咯 谢谢大家的支持。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-07-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据和云计算技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
图数据库 KonisGraph
图数据库 KonisGraph(TencentDB for KonisGraph)是一种云端图数据库服务,基于腾讯在海量图数据上的实践经验,提供一站式海量图数据存储、管理、实时查询、计算、可视化分析能力;KonisGraph 支持属性图模型和 TinkerPop Gremlin 查询语言,能够帮助用户快速完成对图数据的建模、查询和可视化分析。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档