数据结构与算法:图形结构

小微 科技数据结构与算法:图形结构已关闭评论128字数 5244阅读模式
摘要作者:Gofy出处:https://www.cnblogs.com/gaofei200/p/13849762.html图图形结构是一种比树形结构更复杂的非线性结构。在树形结构中,结...

出处:https://www.cnblogs.com/gaofei200/p/13849762.html

图形结构是一种比树形结构更繁杂的非线性结构。在树形结构中,结点间拥有分支层次关系,每一一层上的结点只能以及上一层中的最多一个结点相关,但可能以及下一层的多个结点相关。而在图形结构中,任意两个结点之间均可能相关,即结点之间的邻接关系可以是任意的。文章源自微观生活(93wg.com)微观生活-https://93wg.com/8528.html

因而,图形结构被用于描写各种繁杂的数据对象,在自然科学、社会科学以及人文科学等许多领域有着无比广泛的利用 。图形结构在计算机科学、人工智能、电子路线分析、最短路径寻觅、工程规划、化学化合物分析统计力学、遗传学、节制论语言学以及社会科学等方面均有不同程度的利用可以这样说,图形结构在所有数据结构中利用最为广泛。如在地铁站中的路线图:文章源自微观生活(93wg.com)微观生活-https://93wg.com/8528.html

图的定义

图是一种数据结构,其中节点可以拥有零个或多个相邻元素,两个节点的连接称之为边,节点在图形结构中也被称为顶点,一个顶点到另外一个顶点的经由的的路线称为路径。文章源自微观生活(93wg.com)微观生活-https://93wg.com/8528.html

图形结构有3种类型:无向图、有向图、带权图文章源自微观生活(93wg.com)微观生活-https://93wg.com/8528.html

无向图:顶点A与顶点B之间的边是无方向的,可以从A到B,也能够从B到A文章源自微观生活(93wg.com)微观生活-https://93wg.com/8528.html

有向图:顶点A与顶点B之间的边是有方向的,可以从A到B,但不可以从B到A文章源自微观生活(93wg.com)微观生活-https://93wg.com/8528.html

带权图:顶点A与顶点B之间的边是带有属性的,如A到B的 距离。文章源自微观生活(93wg.com)微观生活-https://93wg.com/8528.html

图的表达方式

图的表达方式有两种:邻接矩阵以及邻接表文章源自微观生活(93wg.com)微观生活-https://93wg.com/8528.html

邻接矩阵文章源自微观生活(93wg.com)微观生活-https://93wg.com/8528.html

邻接矩阵是表示图形中各顶点之间的关系,矩阵的行以及列对应各顶点,坐标位置上的值对于它们之间的关系,1为连接, 0为没有连接。在程序顶用二维数组来实现。文章源自微观生活(93wg.com)微观生活-https://93wg.com/8528.html

邻接表

邻接表只关系存在的边,不需要去为不存在的边分配空间,因而比邻接矩阵来讲,防止了没必要的空间挥霍。在程序顶用数组+链表的情势实现,数组存储对应的顶点,链表存储该顶点连接的所有顶点。

图的搜寻算法

图形结构基础属性以及办法

下列的代码演示都是以邻接矩阵表达方式来实现的

//图形结构
class Graph {
//存储图中所有顶点
private List<String> vertexes;
//图形结构的邻接矩阵
private int[][] matrix;
//各顶点走访情况,true为已走访,false为未走访
private boolean[] visited;

/**
* 依据传入的顶点信息生成矩阵
* @param s
*/
public Graph {
vertexes = new ArrayList<>;
for {
vertexes.add;
}
matrix = new int[s.length][s.length];
}

/**
* 将俩个顶点连接,即生成边
* @param index1 顶点在聚拢中的索引
* @param index2
*/
public void connect{
if {
throw new RuntimeException;
}
//将新的邻接添加的邻接矩阵中
matrix[index1][index2] = 1;
matrix[index2][index1] = 1;
}

/**
* 展现邻接矩阵
*/
public void showGraphMatrix{
for {
System.out.println);
}
}

/**
* 获取顶点在邻接矩阵对应行row中的第一个邻接顶点下标
* @param row
* @return 当有邻接顶点时返回邻接顶点下标,没有则返回-1
*/
public int getFirstNeighbor{
for{
if {
return i;
}
}
return -1;
}

/**
* 获取顶点在邻接矩阵对于行row中col列的下一个邻接顶点
* @param row
* @param col
* @return 当有邻接顶点时返回邻接顶点下标,没有则返回-1
*/
public int getNeighbor{
for {
if {
return i;
}
}
return -1;
}
}

深度优先搜寻

深度优先搜寻属于图算法的一种,英文缩写为DFS即Depth First Search.其进程扼要来讲是对每一一个可能的分支路径深刻到不能再深刻为止,而且每一个节点只能走访一次。这样的走访策略是优先往纵向进行深刻发掘,而不是对一个顶点的所有邻接顶点进行横线走访。简单来讲就是一条路走到死,不行再掉头。

思路:从当前顶点选一个与之连接而未走访过的顶点,将当前节点往该邻接顶点挪动,如果邻接顶点没有未走访的,则回溯到上一个顶点位置,继续该步骤。直到所有顶点都走访过。

往邻接但未走访过的顶点挪动

邻接顶点没有未走访的,进行回溯,直到遇到未走访的邻接顶点

当所有顶点都被走访过时,退出算法

下面是深度优先搜寻的进程动画

代码演示

public void dsf{
visited = new boolean[vertexes.size];
//以在聚拢中下标为0的顶点,进行深度搜寻
dsf;
}

/**
* 深度优先搜寻
* @param visited
* @param row
*/
public void dsf{
//输出当前顶点
System.out.print + &34;);
//将当前顶点设为已走访
visited[row] = true;
//获取当前顶点的邻接顶点下标
int index = getFirstNeighbor;
//如果当前顶点有邻接顶点则进行深度搜寻
while {
//当邻接顶点未走访时,则递归遍历
if {
dsf;
}
//当邻接顶点已走访时,则寻觅另外一个邻接顶点
index = getNeighbor;
}
}

宽度优先搜寻

宽度优先搜寻算法(又称广度优先搜寻)是最简便的图的搜寻算法之一,这一算法也是不少重要的图的算法的原型。Dijkstra单源最短路径算法以及Prim最小生成树算法都采取了以及宽度优先搜寻相似的思想。其别号又叫BFS,属于一种盲目搜索法,目的是系统地开展并检查图中的所有节点,以找寻结果。换句话说,它其实不斟酌结果的可能位置,彻底地搜寻整张图,直到找到结果为止。

宽度优先搜寻算法相似于一个分层搜寻的进程,宽度优先搜寻算法需要一个队列以维持走访过顶点的顺序,以便按这个顺序来走访这些顶点的邻接顶点。

思路:顺次走访当前顶点的邻接顶点,并按走访顺序将这些邻接顶点存储在队列中,铛铛前顶点的所有邻接顶点都被走访后,从队列中弹出一个顶点,以该顶点为当前顶点继续该步骤,直到所有顶点都被走访过。

顺次走访当前顶点的所有邻接顶点,并把这些邻接顶点按走访顺序存储在队列中

当前顶点没有未走访的邻接顶点,从队列中弹出一个顶点,以该弹出顶点继续走访未走访的邻接顶点

注意,尽管图中的顶点都已经走访过了,但还是要等队列中的所有顶点弹出走访后,算法才收场

下面时宽度优先搜寻的进程动画

代码演示

public void bfs{
visited = new boolean[vertexes.size];
////以在聚拢中下标为0的顶点,进行广度优先搜寻
bfs;
}

/**
* 广度优先搜寻
* @param visited
* @param row
*/
public void bfs{
//创立队列,存储遍历邻接顶点的顺序
LinkedList queue = new LinkedList;
//输出当前顶点
System.out.print + &34;);
//将当前顶点设为已走访
visited[row] = true;
//将当前顶点加入队列中
queue.add;
//当队列不为空时,即有未搜寻的邻接顶点,进行搜寻
while ){
//按顺序从队列中弹出邻接顶点下标
int last = queue.removeFirst;
//获取该弹出顶点的邻接顶点下标
int index = getFirstNeighbor;
//当弹出顶点有邻接顶点时,进行广度搜寻
while{
//当邻接顶点未走访时
if{
//输出该邻接顶点
System.out.print + &34;);
//把该邻接顶点设为已走访
visited[index] = true;
//将该邻接顶点加入队列
queue.addLast;
}
//继续寻觅弹出顶点的另外一个邻接顶点
index = getNeighbor;
}
}
}

完全演示代码

public class GraphDemo {
public static void main {
String[] s = {&34;,&34;,&34;,&34;,&34;,&34;,&34;};
Graph graph = new Graph;
//A-B A-C A-G A-F F-D F-E D-E E-G
graph.connect;
graph.connect;
graph.connect;
graph.connect;
graph.connect;
graph.connect;
graph.connect;
graph.connect;
graph.showGraphMatrix;

graph.dsf;//A -> B -> C -> F -> D -> E -> G ->
System.out.println;
graph.bfs;//A -> B -> C -> F -> G -> D -> E ->
}
}

//图形结构
class Graph {
//存储图中所有顶点
private List<String> vertexes;
//图形结构的邻接矩阵
private int[][] matrix;
//各顶点走访情况,true为已走访,false为未走访
private boolean[] visited;

/**
* 依据传入的顶点信息生成矩阵
* @param s
*/
public Graph {
vertexes = new ArrayList<>;
for {
vertexes.add;
}
matrix = new int[s.length][s.length];
}

/**
* 将俩个顶点连接,即生成边
* @param index1 顶点在聚拢中的索引
* @param index2
*/
public void connect{
if {
throw new RuntimeException;
}
//将新的邻接添加的邻接矩阵中
matrix[index1][index2] = 1;
matrix[index2][index1] = 1;
}

/**
* 展现邻接矩阵
*/
public void showGraphMatrix{
for {
System.out.println);
}
}

public void dsf{
visited = new boolean[vertexes.size];
//以在聚拢中下标为0的顶点,进行深度优先搜寻
dsf;
}

/**
* 深度优先搜寻
* @param visited
* @param row
*/
public void dsf{
//输出当前顶点
System.out.print + &34;);
//将当前顶点设为已走访
visited[row] = true;
//获取当前顶点的邻接顶点下标
int index = getFirstNeighbor;
//如果当前顶点有邻接顶点则进行深度搜寻
while {
//当邻接顶点未走访时,则递归遍历
if {
dsf;
}
//当邻接顶点已走访时,则寻觅另外一个邻接顶点
index = getNeighbor;
}
}

public void bfs{
visited = new boolean[vertexes.size];
////以在聚拢中下标为0的顶点,进行广度优先搜寻
bfs;
}

/**
* 广度优先搜寻
* @param visited
* @param row
*/
public void bfs{
//创立队列,存储遍历邻接顶点的顺序
Queue queue = new ArrayDeque;
//输出当前顶点
System.out.print + &34;);
//将当前顶点设为已走访
visited[row] = true;
//将当前顶点加入队列中
queue.add;
//当队列不为空时,即有未搜寻的邻接顶点,进行搜寻
while ){
//按顺序从队列中弹出邻接顶点下标
int last = queue.poll;
//获取该弹出顶点的邻接顶点下标
int index = getFirstNeighbor;
//当弹出顶点有邻接顶点时,进行广度搜寻
while{
//当邻接顶点未走访时
if{
//输出该邻接顶点
System.out.print + &34;);
//把该邻接顶点设为已走访
visited[index] = true;
//将该邻接顶点加入队列
queue.add;
}
//继续寻觅弹出顶点的另外一个邻接顶点
index = getNeighbor;
}
}
}

/**
* 获取顶点在邻接矩阵对应行row中的第一个邻接顶点下标
* @param row
* @return 当有邻接顶点时返回邻接顶点下标,没有则返回-1
*/
public int getFirstNeighbor{
for{
if {
return i;
}
}
return -1;
}

/**
* 获取顶点在邻接矩阵对于行row中col列的下一个邻接顶点
* @param row
* @param col
* @return 当有邻接顶点时返回邻接顶点下标,没有则返回-1
*/
public int getNeighbor{
for {
if {
return i;
}
}
return -1;
}
}

出处:https://www.cnblogs.com/gaofei200/p/13849762.html

以上就是微观生活(93wg.com)关于“数据结构与算法:图形结构”的详细内容,希望对大家有所帮助!

继续阅读
 
小微
  • 版权声明: 本文部分文字与图片资源来自于网络,转载此文是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即通知我们(管理员邮箱:81118366@qq.com),情况属实,我们会第一时间予以删除,并同时向您表示歉意,谢谢!
  • 转载请务必保留本文链接:https://93wg.com/8528.html