当前位置 : 主页 > 编程语言 > java >

java如何存储图数据结构

来源:互联网 收集:自由互联 发布时间:2023-12-28
Java如何存储图数据结构 在计算机科学中,图(Graph)是由节点(Node)和边(Edge)组成的一种数据结构。节点表示图中的实体,边表示节点之间的关系。图常用于表示现实世界中的各种

Java如何存储图数据结构

在计算机科学中,图(Graph)是由节点(Node)和边(Edge)组成的一种数据结构。节点表示图中的实体,边表示节点之间的关系。图常用于表示现实世界中的各种问题,如社交网络、路网、组织结构等。在Java中,我们可以使用不同的数据结构来存储图,包括邻接矩阵、邻接表和关联矩阵等。

邻接矩阵

邻接矩阵是一种二维数组,用于表示节点之间的连接关系。对于有N个节点的图,邻接矩阵的大小为N×N。如果节点i和节点j之间存在边,则邻接矩阵的第i行第j列元素为1;否则为0。邻接矩阵的存储效率较低,但它可以快速判断两个节点之间是否有边。

下面是使用邻接矩阵存储图的示例代码:

public class AdjacencyMatrixGraph {
    private int[][] adjacencyMatrix;
    private int numNodes;

    public AdjacencyMatrixGraph(int numNodes) {
        this.numNodes = numNodes;
        this.adjacencyMatrix = new int[numNodes][numNodes];
    }

    public void addEdge(int i, int j) {
        adjacencyMatrix[i][j] = 1;
        adjacencyMatrix[j][i] = 1;
    }

    public void removeEdge(int i, int j) {
        adjacencyMatrix[i][j] = 0;
        adjacencyMatrix[j][i] = 0;
    }

    public boolean hasEdge(int i, int j) {
        return adjacencyMatrix[i][j] == 1;
    }
}

邻接表

邻接表是一种链表数组,用于表示节点之间的连接关系。对于有N个节点的图,邻接表的大小为N。每个节点对应一个链表,链表中存储与该节点相邻的节点。邻接表的存储效率较高,但判断两个节点之间是否有边的效率较低。

下面是使用邻接表存储图的示例代码:

import java.util.ArrayList;
import java.util.List;

public class AdjacencyListGraph {
    private List<List<Integer>> adjacencyList;
    private int numNodes;

    public AdjacencyListGraph(int numNodes) {
        this.numNodes = numNodes;
        this.adjacencyList = new ArrayList<>(numNodes);
        for (int i = 0; i < numNodes; i++) {
            adjacencyList.add(new ArrayList<>());
        }
    }

    public void addEdge(int i, int j) {
        adjacencyList.get(i).add(j);
        adjacencyList.get(j).add(i);
    }

    public void removeEdge(int i, int j) {
        adjacencyList.get(i).remove(Integer.valueOf(j));
        adjacencyList.get(j).remove(Integer.valueOf(i));
    }

    public boolean hasEdge(int i, int j) {
        return adjacencyList.get(i).contains(j);
    }
}

关联矩阵

关联矩阵是一种二维数组,用于表示节点和边之间的关系。对于有N个节点和M条边的图,关联矩阵的大小为N×M。如果节点i和边j之间有关联,则关联矩阵的第i行第j列元素为1;否则为0。关联矩阵可以用于表示带权重的图。

下面是使用关联矩阵存储图的示例代码:

public class IncidenceMatrixGraph {
    private int[][] incidenceMatrix;
    private int numNodes;
    private int numEdges;

    public IncidenceMatrixGraph(int numNodes, int numEdges) {
        this.numNodes = numNodes;
        this.numEdges = numEdges;
        this.incidenceMatrix = new int[numNodes][numEdges];
    }

    public void addEdge(int i, int j) {
        incidenceMatrix[i][j] = 1;
        incidenceMatrix[j][i] = 1;
    }

    public void removeEdge(int i, int j) {
        incidenceMatrix[i][j] = 0;
        incidenceMatrix[j][i] = 0;
    }

    public boolean hasEdge(int i, int j) {
        for (int k = 0; k < numEdges; k++) {
            if (incidenceMatrix[i][k] == 1 &&
【文章原创作者:cc防御 http://www.558idc.com/gfip.html提供,感恩】
上一篇:java类之间传递变量
下一篇:没有了
网友评论