Android开发Android技术知识Android开发

数据结构-图

2017-02-25  本文已影响0人  Rayhaha

数据结构 - 图


目录:


基本概念

图是由结点和他们之间连线的集合

无向图

无向图.png
无向图解析.png

有向图

有向图.png 有向图解析.png

储存结构

储存结构.png

邻接矩阵

使用数组的形式来储存数据

有向图邻接矩阵.png 无向图邻接矩阵.png

邻接表

使用顶点以及其弧的指向来储存数据

邻接表存储.png 邻接表代码构造.png

十字链表(有向图)

使用顶点以及其弧的指向来储存数据

十字链表数据储存.png

这里以V1顶点为例说明:

十字链表代码构造.png

邻接多重表(无向图)

使用顶点以及边的连接指向来储存数据

邻接多重表数据储存.png

顶点表示很清晰简单
这里以V1 ->V4边为例说明:

邻接多重表代码构造.png

图的遍历

实例-图.png

深度优先搜索

对于上图
A顶点开始进行深度优先搜索的顺序为:
A - B - C - E - F - D - G - H
丢弃了 F - B , H -D 这两条边,形成了一棵树

广度优先搜索

对于上图
A顶点开始进行广度优先搜索的顺序为:
A - B - D - C - F - G - H - E
丢弃了E - F 和 G - H 这两条边,形成了一棵树

最小生成树

当遍历的时候涉及边的权值问题,就要使用最小生成树来解决

最小生成树前.png

如图:上面的数值是边的权值,可以理解为修路的成本,每个顶点可以理解为一个城市,如何最节约成本完成城市之间的连通就需要使用最小生成树。
最小生成树后:

最小生成树后.png

普里姆算法(Prim)

普里姆算法(Prim).png

过程:

  1. 选定一个点A,放入点集合
  2. 关于A的所有的边放入 待选边集合
  3. 待选边集合选取权值最小的边 A - F (1),放入边集合
  4. 边集合中提取出未在点集合的点F,放入点集合
  5. 刷新待选边集合,列出所有AF有关的边
  6. 选出权值最小不会与当前已选边形成闭环的边,然后放入边集合
  7. 以此类推,得出所有,既是最小生成树

Prim算法后:

普里姆算法(Prim)后.png

克鲁斯卡尔算法(Kruskal)

克鲁斯卡尔算法(Kruskal).png

过程:

  1. 列出所有边的集合
  2. 依次选取权值最小的边,同时将涉及的点加入点集合
  3. 选取的边不能与已选边构成闭合
  4. 当点集合中出现了所有点以后,需要让所有点能连通,形成生成树(边 = 点 - 1)

Kruskal算法后:

克鲁斯卡尔算法(Kruskal)后.png

最后
对数据结构的基本认识和理解到这里就结束了
关于图的代码实现,在有了队列,栈,线性表的实践过后,代码的转换肯定是没问题的
重点在于对上面所说知识点的深入理解和逻辑转换
再次感谢慕课网的James老师
PS:
后面我会写一写,从零开始的Android组件化开发的记录博文

上一篇下一篇

猜你喜欢

热点阅读