结构算法导论——图

来源:互联网 发布:mac版office2016怎么样 编辑:程序博客网 时间:2024/05/19 23:25

一、追根溯源


        简单的理解是用来存储数据和解决问题,而且是存储复杂的数据和解决复杂的问题,一般的问题由链或树就解决了。那具体解决什么问题呢?最常见的就是最短最佳路径,常见的有铺设个设备啦,乘车的线路等等

二、思维导图






三、知识剖析

术语:

        1.图是一种由一个顶点集V合一个边集E构成的数据结构。

        若顶点的偶对是有序的,称为有向图,若是无序的则称为无向图。




        2.在无向图中,假若顶点V和顶点W之间存在一条边,则称顶点V和W互为邻接点。

        与顶点V关联的边的条数称为顶点V的度

        3.简单路径:序列中顶点不重复出现的路径。    简单回路:序列中第一个顶点和最后一个顶点相同的简单路径。

        4.若图中任意两个顶点之间都有路径想通,则称此图为连通图,若无向图为非连通图,则图中各个极大连通子图称作此图的连通分量

        5.假设图中有n个顶点,e条边(或弧),则含有e=n(n-1)/2条边的无向图称作 无向完全图;含有e=n(n-1)条弧的有向图称作有向完全图

        6.假设一个连通图有n个顶点和e条边,其中n-1条边和n个顶点构成一个极小连通子图,这边是此连通图的生成树

        7.出度:以顶点为弧尾的弧的数目;入度:以顶点为弧头的弧的数目

存储结构

        1.邻接矩阵的特点:

        无向图的邻接矩阵为对称矩阵;有向图的连接矩阵不一定为对称矩阵。

        利用邻接矩阵,容易判断两个顶点之间是否有边相关联

        无向图中顶点Vi的度是邻接矩阵A中第i行(或第i列)元素之和

        有向图中,顶点Vi的出度是A中第i行元素之和,顶点Vi的入度是A中第i列元素之和。

        2.矩阵的建立

        1)无向图




        2)有向图



邻接表

        对于无向图,第i个单链表中的结点表示依赖于顶点Vi的边,对于有向图是以顶点Vi结尾的弧,这个单链表称为Vi的邻接表

        表头结点两个域:vertex(存放顶点的信息)firstarc(邻接表第一个结点)

表结点两个域:adjvex(在数组Adjlist中的序号)nextarc(本链表中的下一结点)

        一个无向图有n个顶点,e条边,它的链接表需要n个头结点和2e个表结点。

        e<<n(n-1)/2时,邻接表省内存

        单链表中其邻接点域的值为i的结点的个数是顶点Vi的入度。

图的遍历

        1.定义:从图中某个顶点出发访问图中每个顶点一次且仅一次的过程

        2.方法:

        1)深度优先搜索

        基本思想:假定以图中某个顶点Vi为出发点,首先访问出发点Vi,然后任选一个Vi的未访问过的邻接点Vj,以Vj为新的出发点继续深度优先搜索

        特点:

        搜索到达某个顶点时,如果这个顶点的所有邻接点都被访问过,那么返回到前一个被访问的顶点,从下一个没有被访问的邻接点开始

        顶点的访问序列不是唯一的

        查找邻接点方法:

        一是邻接表为存储结构:顺序查找链表,时间复杂度为O(n+e),n为顶点数,c为边数

        二是邻接矩阵存储结构:通过循环语句顺序访问邻接矩阵的某一行,时间复杂度为O(n^2),n为顶点数

        2)广度优先搜索

        基本思想:从图中某个顶点Vi出发,在访问了Vi之后一次访问Vi的所有邻接点,然后从这些邻接点在按此方法去遍历其它顶点

        查找邻接点方法:

        一是邻接表为存储结构:顺序查找链队列

        二是邻接矩阵存储结构:循环语句访问邻接矩阵的某一行

        3)相似比较

        深度优先类似树的先序遍历;广度优先类似树的层次遍历

        深度优先可以看成是一个递归过程,调用DFS,计算非连通图的连通分量个数;广度优先可以看成是一个队列先进先出,调用BFS,计算非连通图分量个数

        连通分量的个数就是调用DFS或BFS的次数(DFS和BFS了解点这里)

最小生成树

        1.共同特点:

        生成树的顶点个数与图的顶点个数相同;是图的极小连通子图;一个有n个顶点的连通图的生成树有n-1条边

        生成树中任意两个顶点间的路径是唯一的;含n个顶点n-1条边的图不一定是生成树

        2.构造方法

        1)普里姆算法(Prim)

        基本思想:以某个顶点作为生成树的跟,随后添加新的顶点,选取这两个顶点之间权重最小的那条边上的顶点作为下一次的构造顶点,直至n个顶点为止

        基本过程:

        图中n个顶点分成两个集合;U集合为已经在生成树上的顶点集;V-U集合为尚未落在生成树中的顶点集;不断地选取联通U中与V-U中顶点的权值最小的边




        2)克鲁斯卡尔算法(Kruskal)

        基本思想:为使生成树上边的权值之和达到最小,则应使生成树中每一条边的权值尽可能的小

        具体做法:先构造一个只含有n个顶点的子图,然后从权值最小的边开始,若它的添加不是子图产生回路,则加上这条边,重复,直至加上n-1条边为止


拓扑排序

        1.AOV网

        如果以图中的顶点来表示活动,有向边表示活动之间的优先关系,这种用顶点表示活动的有向图称为AOV网。

        2.排序

        通常顶点的拓扑有序序列是不唯一的

        1.定义:检测有向图中是否存在回路的方法之一是求有向图中顶点的一个满足下列性质的排列:若在有向图中从u到v有一条弧,则在此序列中u一定排在v之前,称有向图的这个操作为拓扑排序。

        2.具体操作

        1).从有向图中选取一个没有前驱的顶点,并输出之;2).从有向图中删去此顶点以及所有以他为尾的弧



        没有前驱的顶点=入度为零的顶点;删除顶点及以他为尾的弧=弧头顶点的入度减1

        时间复杂度:O(n+e)

1 0
原创粉丝点击