您的位置:首页 > 编程语言 > Java开发

图的邻接矩阵存储---JAVA实现

2016-04-26 15:50 447 查看
摘要:

数据结构的一大特点就是用来存储数据的,作为图这种特别复杂的数据结构有三种存储方式,分别是邻接矩阵 邻接表 十字链表三种。本次来讨论邻接矩阵的存储方式。

邻接矩阵的思路:

在邻接矩阵中如果两个节点之间相连则用数字1来进行表示,如果两个节点之间没有边进行连接则用数字0来进行表示。节点初始的时候存储在一个集合或数组当中。二边则存储在一个整形的二维数组当中。

空间复杂度为:

O(n+n^2) 节点数组加二维数组所占用的空间。

这种存储方式的优点及缺点:

优点:存储方式非常清晰,遍历十分容易,存储稠密图的时候非常合适

缺点:当图为稀疏图的时候就不合适了,我们只考虑边的关系而它把有关系和没关系的都存储了起来就不太合适了,浪费空间。

代码:

package 邻接矩阵;

public class Matrix {
private char[] node;//邻接矩阵的点
private int[][] edgs;//邻接矩阵的边的集合

//初始化构建邻接矩阵的方法
public Matrix(char[] node,char[][]edgs){
int nLength = node.length;//获取节点的长度
int eLength = edgs.length;//获取边的长度
this.node = new char[nLength];//初始化邻接矩阵的点
for(int i =0;i<nLength;i++){
this.node[i] = node[i];
}
this.edgs = new int[nLength][nLength];//初始化邻接矩阵边的集合
for(int i =0;i<eLength;i++){    //循环遍历获取所有边的起点以及终点
int temp01 = position(edgs[i][0]);  //获取边的起点
int temp02 = position(edgs[i][1]);  //获取边的终点
this.edgs[temp01][temp02] = 1;
}
}
//查找当前节点所在位置
public int position(char t){
int result = 0;
//判断当前节点在节点数组中所在的位置把位置信息返回回去
for(int i=0;i<node.length;i++){
if(t == node[i]){
result = i;
}
}
return result;
}
//输出
public void print(char[] node,int[][]edgs){
for(int i=0;i<node.length;i++){
System.out.print("  ");
System.out.print(node[i]+"  ");
}
System.out.println();
for(int i=0;i<node.length;i++){
System.out.print(node[i]+" ");
for(int j=0;j<node.length;j++){
System.out.print(edgs[i][j]+"    ");
}
System.out.println();
System.out.println();
}
}
public static void main(String[] args){
char[] node = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};
char[][] edgs = new char[][]{
{'A', 'B'},
{'B', 'C'},
{'B', 'E'},
{'B', 'F'},
{'C', 'E'},
{'D', 'C'},
{'E', 'B'},
{'E', 'D'},
{'F', 'G'}};
Matrix m = new Matrix(node,edgs);
m.print(node, m.edgs);
}
}


结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: