概述:
左耳朵耗子专栏《左耳听风》 用户自发每周完成一个ARTS:
1.Algorithm:每周至少做一个 leetcode 的算法题
2.Review:阅读并点评至少一篇英文技术文章
3.Tip:学习至少一个技术技巧
4.Share:分享一篇有观点和思考的技术文章
Algorithm 学习构建基本的图数据结构
关于图的基础知识点目前掌握地不深入,只总结了这些内容:
下边来看代码
邻接矩阵:
package 图.邻接矩阵;
/**
* @author idea
* @data 2019/8/25
*/
public class Graph {
/**
* 二维矩阵
*/
public int[][] graph;
/**
* 矩阵里面的点集合 A,B,C,D,E,F,G
*/
public String[] nodeArr;
private int height;
private int width;
public void init(String[] nodeArr){
this.nodeArr=nodeArr;
int total=nodeArr.length;
init(total,total);
}
/**
* 初始化图的长和宽
*
* @param height
* @param width
*/
private void init(int height, int width) {
graph = new int[height][width];
this.height = height;
this.width = width;
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
graph[i][j] = 0;
}
}
}
/**
* 打印出图的内部结构
*/
public void displayGraph() {
System.out.println("图的高度:" + height + " 图的宽度:" + width);
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
System.out.print(graph[i][j]+" ");
}
System.out.println("");
}
}
/**
* 添加矩阵元素
*/
public void insertItem(String vert) {
String[] verts=vert.split(",");
if(verts.length==2){
String xStr=verts[0];
String yStr=verts[1];
if(xStr.equals(yStr)){
return;
}
int x=0,y=0;
for(int i=0;i<nodeArr.length;i++){
if(nodeArr[i].equals(xStr)){
x=i;
}
if(nodeArr[i].equals(yStr)){
y=i;
}
}
graph[x][y]=1;
graph[y][x]=1;
}
}
public static void main(String[] args) {
Graph g=new Graph();
g.init(new String[]{"A"});
g.displayGraph();
g.insertItem("A,B");
g.insertItem("B,C");
g.insertItem("C,D");
g.insertItem("D,E");
g.displayGraph();
}
}
构建邻接表
package 图.邻接表;
/**
* @author idea
* @data 2019/8/25
*/
public class ElementNode {
private String value;
private ElementNode next;
public ElementNode(String value, ElementNode next) {
this.value = value;
this.next = next;
}
public String getValue() {
return value;
}
public ElementNode setValue(String value) {
this.value = value;
return this;
}
public ElementNode getNext() {
return next;
}
public ElementNode setNext(ElementNode next) {
this.next = next;
return this;
}
}
package 图.邻接表;
import java.util.HashMap;
/**
* @author idea
* @data 2019/8/25
*/
public class Graph {
/**
* 邻接表元素集合
*/
private ElementNode[] elementNodes;
private int size;
/**
* 初始化图结构 添加定点的操作
*/
public void initGraph(String[] vertsArr){
size = vertsArr.length;
elementNodes=new ElementNode[size];
for(int i=0;i<size;i++){
elementNodes[i]=new ElementNode(vertsArr[i],null);
}
}
/**
* 添加边
*/
public void insertEdege(String edege){
ElementNode elementNode=new ElementNode(edege,null);
String[] arr = edege.split(",");
if(arr.length==2){
String from=arr[0],to=arr[1];
ElementNode fromNode=getElementNode(from);
ElementNode nextNode =fromNode.getNext();
ElementNode newNode=new ElementNode(to,null);
if(nextNode==null){
fromNode.setNext(newNode);
return ;
}
while(nextNode.getNext()!=null){
nextNode=nextNode.getNext();
}
nextNode.setNext(newNode);
}
}
/**
* 获取点
*
* @param value
* @return
*/
private ElementNode getElementNode(String value){
for(int i=0;i<size;i++){
if(elementNodes[i].getValue().equals(value)){
return elementNodes[i];
}
}
return null;
}
public void display(){
for(int i=0;i<size;i++){
ElementNode elementNode=elementNodes[i];
if(elementNode.getNext()==null){
System.out.print(elementNode.getValue()+"->null"+"\n");
continue;
}
while(elementNode!=null && elementNode.getNext()!=null){
System.out.print(elementNode.getValue()+"->");
elementNode=elementNode.getNext();
}
System.out.print(elementNode.getValue()+"\n");
}
}
public static void main(String[] args) {
Graph g=new Graph();
g.initGraph(new String[]{"A","B","C","D","E","F"});
g.display();
g.insertEdege("A,B");
g.insertEdege("C,A");
g.insertEdege("A,D");
g.insertEdege("E,B");
g.insertEdege("D,E");
g.insertEdege("D,F");
g.insertEdege("F,C");
g.display();
}
}