前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >无向图----无向图的实现

无向图----无向图的实现

作者头像
SuperHeroes
发布2018-05-30 17:50:17
1.9K0
发布2018-05-30 17:50:17
举报
文章被收录于专栏:云霄雨霁云霄雨霁

术语表:

  • 多重图:将含有平行边的图称为多重图。
  • 简单图:将没有平行边和自环的图称为简单图。
  • 相邻:当两个顶点通过一条边相连时,称这两个顶点相邻,并称这条边依附于这两个顶点。
  • 度数:一个顶点的度数即依附于它的边的总数。
  • 简单路径:是一条没有重复顶点的路径。
  • 简单环:是一条(除了起点和终点必须相同外)没有相同顶点的环。
  • 路径或环的长度:其中所包含的边数。(有权无向图则为边的权重和)
  • 连通图:从任一顶点能够达到另一个任意顶点。

无向图的API:

public class Graph Graph(int V)        创建一个含有V个顶点但不含有边的图 int V()        顶点数 int E()        边数 void addEdge(int v,int w)        向图中添加一条边v--w Iterable<Integer> adj(int v)        和v相邻的所有顶点 String toString()        对象的字符串表示

选用数据结构:

  • 邻接矩阵:占用空间太大。对于含有上百万个顶点的图,V^2的空间需求是不能满足的。
  • 邻接表数组:可以实现。使用一个以顶点为索引的列表数组,其中每个元素都是和该顶点相邻的顶点列表。

典型Graph实现的性能复杂度

数据结构

所需空间

添加一条边

检查v、w是否相邻

遍历v所有相邻顶点

边的列表

E

1

E

E

邻接矩阵

V^2

1

1

V

邻接表

E+V

1

degree(V)

degree(V)

邻接集

E+V

logV

logV

logV+degree(V)

使用邻接表实现Graph性能有如下特点:

  • 使用的空间和V+E成正比
  • 添加一条边所需要的时间为常数
  • 遍历顶点v所需要的时间和v的度数成正比

邻接表的Java语言实现:

代码语言:javascript
复制
public class Graph {
	private int V;//顶点数
	private int E;//边数
	private Bag<Integer>[] adj;//邻接表
	public Graph(int V) {
		this.V = V;
		adj = (Bag<Integer>[]) new Bag[V];
		for(int i=0;i<adj.length;i++) {
			adj[i] = new Bag<Integer>();
		}
	}
	public int V() {return V;}
	public int E() {return E;}
	public void addEdge(int v,int w) {
		adj[v].add(w);
		adj[w].add(v);
		E++;
	}
	public Iterable<Integer> adj(int v){return adj[v];}
}

图处理算法的设计模式:

一般我们会将数据结构和基于数据结构的算法分离。为此,我们会为相关的任务创建相关的类,然后采用组合的方式,在算法类中组合使用数据结构类。在接下来的深度优先遍历广度优先遍历中可以看到相关实现。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.12.19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 术语表:
  • 无向图的API:
  • 选用数据结构:
  • 使用邻接表实现Graph性能有如下特点:
  • 邻接表的Java语言实现:
  • 图处理算法的设计模式:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档