一、概念

: 是一种复杂的非线性数据结构。
图的二元组定义:

图 G 由两个集合 V 和 E 组成,记为:
G=(V, E)  其中: V 是顶点的有穷非空集合,
E 是 V 中顶点偶对(称为边)的有穷集。

通常,也将图 G 的顶点集和边集分别记为 V(G) 和 E(G) 。 E(G) 可以是空集。若 E(G) 为空,则图 G 只有顶点而没有边。

有向图: 若图 G 中的每条边都是有方向的,则称 G 为有向图 (Digraph) 。
无向图: 若图 G 中的每条边都是没有方向的,则称 G 为无向图 (Undigraph) 。
完全图:若无向图中的每个顶点之间存在着一条边,有向图中的每两个定点之间都存在着方向相反的两条边,则称此图为完全图。
稠密图: 当一个图接近完全图时,则称它为稠密图。
稀疏图:当一个图含有较少边数(即e<< n(n-1),双小于号表示非常小于的含义)时,则称它为稀疏图。
简单图:图中每条边的顶点均不相同。
邻接点
有向图:如果 <u, v>∈ E, 则称v为u的邻接点,u为v的逆邻接点。边<u, v>与顶点u和v相关联,从u出发的边称为u的出边或邻接边,而指向顶点u的边称为u的入边或逆邻接边。
无向图:如果(u, v)∈ E, 则称u与v互为邻接点。
顶点的度、入度与出度
依附与某顶点v的边数 称为度;
在有向图中,顶点v的 入度 指以顶点为终点的边的数目。
出度 指以顶点起始点的边的数目;
无向图中出度入度相等。
通路或路径:由m+1个顶点与m条边交替构成的一个序列。
环路:如路径的第一个顶点和最后一个顶点相同,称之为环路。
可达分量:有向图中,若顶点s到v有一条通路,称v是从s可达的。对于s,从s可达的所有顶点的集合叫可达分量。
连通图:无向图中,若一个顶点到另一个顶点有路径,则称这2个顶点是连通的。如果图中任意2顶点都是连通的,则称该图是连通图。
连通分量:指无向图的极大连通子图。
:与图中边有关的实数。
带权图或网:边上具有权值的图。

强连通分量(有向图):顶点s在图G中的可达分量 与 s在镜像图R(G)中的可达分量的交集。

最小生成树:从图中的不同顶点或从同一顶点按不同的优先搜素过程可以得到不同的树。而对于一个连

通网(连通带权图)来说,生成的树不同,每棵树的代价(树中每条边上权值之和)也可能不同,代价最小

的生成树为图的最小生成树。

二、抽象数据类型
ADT Graph{
数据对象D:具有相同性质的数据元素的集合。
数据关系R:R{<u,v>|(u,v∈D)}。
基本操作:
1  int getType();//返回图的类型
2  int getVexNum();//返回图的顶点数
3  int getEdgeNum();//返回图的边数
4  Iterator getVertex();//返回图的所有顶点
5  Iterator getEdge();//返回图的所有边
6  void remove(Vertex v);//删除一个顶点v
7  void remove(Edge e);//删除一条边e
8  Node insert(Vertex v);//添加一个顶点v
9  Node insert(Edge e);//添加一条边e
10  boolean areAdjacent(Vertex u, Vertex v);//判断顶点u、v是否邻接,即是否有边从u到v
11  Edge edgeFromTo(Vertex u, Vertex v);//返回从u指向v的边,不存在则返回null
12  Iterator adjVertexs(Vertex u);//返回从u出发可以直接到达的邻接顶点
13  Iterator DFSTraverse(Vertex v);//对图进行深度优先遍历
14  Iterator BFSTraverse(Vertex v);//对图进行广度优先遍历
15  Iterator shortestPath(Vertex v);//求顶点v到其他顶点的最短路径
16  void generateMST() throws UnsupportedOperation;//求无向图的最小生成树,如果是有向图不支持此操作
17  Iterator toplogicalSort() throws UnsupportedOperation;//求有向图的拓扑序列,无向图不支持此操作
18  void criticalPath() throws UnsupportedOperation;//求有向无环图的关键路径,无向图不支持此操作
}

请看 接口定义 Graph

三、图的存储方法

1、邻接矩阵表示法:采用2个数组来表示图;一个是存储所有顶点信息的一维数组、一个是存储图中顶点之间关联关系的二维数组,这个二维数组称为邻接矩阵。

对于无向图a,邻接矩阵是一个对称矩阵。第i行(i列)非∞元素的个数正好是第i个顶点的度。

对于有向图b,第i行非∞元素的个数是第i个顶点的出度、i列非∞元素的个数是第i个顶点的入度。

邻接矩阵的不足

1、由n个顶点构成的图中最多可以有n2条边,但大多数情况下,边的数目远远达不到这个量级,邻接矩阵中大多数单元都是闲置的。

   2、矩阵结构是静态的,大小N需要预先估计,然后创建N*N的矩阵,而图的规模往往是动态变化的,N估计过大会造成空间浪费,过小则造成空间不够用。

2、邻接表表示法
   链接表是图的一种动态的链式存储方法,类似于树的孩子链表表示法。
对于n个顶点、m条边的无向图,采用邻接表,需要n个表头节点和2m个边表节点。在边稀疏的情  况下,要比使用邻接矩阵节省空间。

  邻接表的特性:

    在无向图中,顶点v的度为v的邻接表中 表表节点的个数。

    在有向图中,顶点v的邻接表中边表的节点个数仅为v的出度。入度需要遍历这个邻接表 或者

  从逆邻接表中获取。

    判断2个顶点直接是否有边需要搜素2个顶点对应的邻接表。不如邻接矩阵方便。

 3、双链式存储结构

 邻接表是图的一种很有效的存储结构,但是在该结构中删除顶点,边,或添加顶点,边的操作实现起来都比较复杂,所需时间代价较大。所以给出双链式存储结构解决上述问题。
 顶点、边都抽象为独立的类,所有的顶点类都存储在一个链接表中,所有的边类也存储在一个链接表中。并在顶点、边之间建立关系。

边中有5个重要的指针域:第一顶点域、第二顶点域、第一边表位置域、第二边表位置域、边位置域。

有向图中:第一顶点域指向该边的起始顶点在顶点表中的位置、第二顶点域指向该边的终止顶点在顶点表中的位置;  第一边表位置域指向边在其起始点的出边表中的位置,第二边表位置域指向边表在其终止点的入边表中的位置;

无向图:二个顶点域分别指向边的两个顶点在顶点表中的位置。第一边表位置域、第二边表位置域分别指向第一、第二顶点的邻接边表中的位置。

边位置域指向边在边表中的位置。

  双链式存储结构的顶点定义 Vertex.java

双链式存储结构的边的定义 Edge.java

四、图的一种简单实现 示意

AbstractGraph.java

java数据结构_笔记(4)_图的更多相关文章

  1. 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现

      本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型   栈是 ...

  2. java数据结构_笔记(5)_图的算法

    图的算法 1 图的遍历图的遍历就是从图中某个顶点出发,按某种方法对图中所有顶点访问且仅访问一次.遍历算法是求解图的连通性问题.拓扑排序和求关键路径等算法的基础. 2 深度优先遍历从图中某个顶点V 出发 ...

  3. 【Java数据结构学习笔记之二】Java数据结构与算法之队列(Queue)实现

      本篇是数据结构与算法的第三篇,本篇我们将来了解一下知识点: 队列的抽象数据类型 顺序队列的设计与实现 链式队列的设计与实现 队列应用的简单举例 优先队列的设置与实现双链表实现 队列的抽象数据类型 ...

  4. 【Java数据结构学习笔记之一】线性表的存储结构及其代码实现

    应用程序后在那个的数据大致有四种基本的逻辑结构: 集合:数据元素之间只有"同属于一个集合"的关系 线性结构:数据元素之间存在一个对一个的关系 树形结构:数据元素之间存在一个对多个关 ...

  5. 【Java数据结构学习笔记之三】Java数据结构与算法之队列(Queue)实现

      本篇是数据结构与算法的第三篇,本篇我们将来了解一下知识点: 队列的抽象数据类型 顺序队列的设计与实现 链式队列的设计与实现 队列应用的简单举例 优先队列的设置与实现双链表实现 队列的抽象数据类型 ...

  6. java数据结构读书笔记--引论

    1 递归简论 需求:求出f(x)=2f(x-1)+x²的值.满足f(0)=0 public class Recursion { // 需求: 求出f(x)=2f(x-1)+x²的值.满足f(0)=0 ...

  7. Java之旅_高级教程_数据结构

    摘自:http://www.runoob.com/java/java-data-structures.html 了解即可 Java 数据结构 Java 工具包提供了强大的数据结构.在Java中的数据结 ...

  8. 20165325 2017-2018-2 《Java程序设计》结对编程_第二周:四则运算

    20165325 2017-2018-2 <Java程序设计>结对编程_第二周:四则运算 一.码云链接 FAO项目的码云链接; 1.Git提交日志已经实现一个功能/一个bug修复的注释说明 ...

  9. 聚焦设计交易与商业落地 DANG·DHUB设计师平台上线【图】_品牌资讯_服饰_太平洋时尚网

    聚焦设计交易与商业落地 DANG·DHUB设计师平台上线[图]_品牌资讯_服饰_太平洋时尚网 聚焦设计交易与商业落地 DANG·DHUB设计师平台上线

随机推荐

  1. apt-get 与 yum 的区别

    一般来说著名的 linux 系统基本上分两大类: RedHat系列:Redhat.CentOS.Fedora等 Debian系列:Debian.Ubuntu等 RedHat 系列 1 常见的安装包格式 ...

  2. Android 数据存储五种方式

    1.概述 Android提供了5种方式来让用户保存持久化应用程序数据.根据自己的需求来做选择,比如数据是否是应用程序私有的,是否能被其他程序访问,需要多少数据存储空间等,分别是: ① 使用Shared ...

  3. PPP协议

    PPP协议PPP协议是二层(数据链路层)协议,常用于拨号上网时客户端向服务器获取IP地址.PPP支持在各种物理类型的点对点串行线路上传输上层协议报文.它具有很多特性,比如支持多协议.提供可选的身份认证 ...

  4. APP敏捷测试,测试和开发并行!

    测试和开发具有同等重要的作用,从一开始,测试和开发就是相向而行的.测试是开发团队的一支独立的.重要的支柱力量. 测试要具备独立性,独立分析业务需求,独立配置测试环境,独立编写测试脚本,独立开发测试工具 ...

  5. 《爵迹》侵权链接多为个人用户分享到个人网盘 总结说明:推广途径为 网盘>微博>博客>贴吧>知道

    网络侵权链接3318条.该片的侵权范围分布相对较均匀,其中微博/博客侵权链接630条.占比19%:贴吧778条.占比23.4%:知道513条.占比15.4%:网盘828条.占比25%:小网站410条. ...

  6. DataSet客户端分页实现

    window.$ClientPageHelper=function(fromDs,toDs){ var pageSize=toDs.get('pageSize'); var elist=fromDs. ...

  7. SQLserver2008数据库备份和还原问题(还原是必须有完整备份)

    首先,我要说明的是你必须拥有完整的数据库备份,下面的还原教程,才算有用,如果其它问题,请搜索别的大牛的解决办法,本方法只适合菜鸟. 这个连接是站长大人的异常恢复方法,有问题可以自己学习http://w ...

  8. 数据挖掘算法(一)C4.5

    统计了14天的气象数据D(指标包括outlook,temperature,humidity,windy),并已知这些天气是否打球(play).如果给出新一天的气象指标数据:sunny,cool,hig ...

  9. css3动画特效:上下晃动的div

    css3动画特效:上下晃动的div <div id="square" class="container animated">上下晃动</div ...

  10. Python学习笔记之Beautiful Soup

    如何在Python3.x中使用Beautiful Soup 1.BeautifulSoup中文文档:http://www.crummy.com/software/BeautifulSoup/bs3/d ...