图(数据结构)

图简介

在计算机程序设计中,图是最常用的结构之一。一般来说,对于数据存储是用不到图,图一般是用来辅助解决某些具体的问题的用的。

图是一种与树相似的数据结构,从数学意义上讲,树是图当中的一种,但是图的应用方 式又和树是不同的图是没有这样固定的结构的。

图的形状是由物理或抽象的问题所决定的

这个就是一个典型的图,从这个例子中进一步我们可以知道: 图并不是要反映城市在地图上的地理位置,它重点放在图中的节点和边之间的关系,描述哪个些节点连着哪些边,这些边又连着另外的哪里节点。反映这些节点的连通性(或非连通性)。

顶点 :图中的节点

边 : 连接顶点的线

邻接 : 如果两个顶点被同一条边连接,就称这两个顶点是邻接的,如上图 I 和 G 就是邻接的,而 I 和 F 就不是。有时候也将和某个指定顶点邻接的顶点叫做它的邻居,比如顶点 G 的邻居是 I、H、F。

路径: 路径是边的序列,比如从顶点B到顶点J的路径为 BAEJ,当然还有别的路径 BCDJ,BACDJ等等。

连通图 : 从任意一个节点开始,至少有一条路径可以连接到其他所有的节点,那么这个图就是联通图。

有联通图就有非连通图:

有向图和无向图:

如果图中的边没有方向,可以从任意一边到达另一边,则称为无向图;比如双向高速公路,A城市到B城市可以开车从A驶向B,也可以开车从B城市驶向A城市。但是如果只能从A城市驶向B城市的图,那么则称为有向图。

有权图和无权图:

图中的边被赋予一个权值,权值是一个数字,它能代表两个顶点间的物理距离,或者从一个顶点到另一个顶点的时间,这种图被称为有权图;反之边没有赋值的则称为无权图。

在程序中表示图

顶点 :在大多数情况下,顶点表示某个真实世界的对象,这个对象必须用数据项来描述

/**
 * 用来表示图中的顶点
 */
public class Vertex {

    /**
     * 顶点
     */
    public char label;

    /**
     * 判断(顶点)是否被访问
     */
    public boolean isVisited;

    public Vertex(char label) {
        this.label = label;
        isVisited = false;
    }

}

边: 图并不像树,图没有固定的结构,图的每个顶点可以与任意多个顶点相连,为了模拟这种自由形式的组织结构,用如下两种方式表示图:邻接矩阵和 和 邻接表(一条边连接两个顶点,这两个顶点就是邻接的)

                       

邻接矩阵

邻接矩阵是一个二维数组,数据项表示两点间是否存在边,如果图中有 N 个顶点,邻接矩阵就是 N*N 的数组。上图用邻接矩阵表示如下:

1表示有边,0表示没有边,也可以用布尔变量true和false来表示。顶点与自身相连用 0 表示,所以这个矩阵从左上角到右上角的对角线全是 0 。

注意:这个矩阵的上三角是下三角的镜像,两个三角包含了相同的信息,这个冗余信息看似低效,但是在大多数计算机中,创造一个三角形数组比较困难,所以只好接受这个冗余,这也要求在程序处理中,当我们增加一条边时,要更新邻接矩阵的两部分,而不是一部分。

邻接表

邻接表是一个链表数组(或者是链表的链表),每个单独的链表表示了有哪些顶点与当前顶点邻接。

(转载请标明出处)

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值