Java数据结构之加权无向图的设计实现

Java数据结构之加权无向图的设计实现

前言

在计算机科学中,图(Graph)作为一种基本数据结构,被广泛应用于各种领域,如网络流、图像处理、计算机视觉等。本文将介绍加权无向图(Weighted Undirected Graph)的设计实现,涉及图的存储、添加边、获取特定节点的相邻节点、计算最短路径等。

设计实现

存储结构

加权无向图可以用一个邻接表数组存储,其中每个邻接表包含该节点相连的边和权值。每个节点的信息可以用一个 Map 存储,其中键为节点名称,值为相应节点的邻接表。

public class WeightedUndirectedGraph {
    private final Map<String, List<Edge>> graph = new HashMap<>();

    // add undirected edge to the graph
    public void addEdge(String node1, String node2, int weight) {
        addDirectedEdge(node1, node2, weight);
        addDirectedEdge(node2, node1, weight);
    }

    // add directed edge to the graph
    private void addDirectedEdge(String startNode, String endNode, int weight) {
        List<Edge> edges = graph.get(startNode);
        if (edges == null) {
            edges = new ArrayList<>();
            graph.put(startNode, edges);
        }
        edges.add(new Edge(startNode, endNode, weight));
    }
}

class Edge {
    String startNode;
    String endNode;
    int weight;

    Edge(String startNode, String endNode, int weight) {
        this.startNode = startNode;
        this.endNode = endNode;
        this.weight = weight;
    }
}

获取特定节点的相邻节点

通过节点名称从图中获取该节点的相邻节点,只需要在 Map 中查找相应的邻接表即可。

List<String> getNeighbors(String node) {
    List<Edge> edges = graph.get(node);
    if (edges == null) {
        return Collections.emptyList();
    }
    List<String> neighbors = new ArrayList<>();
    for (Edge edge : edges) {
        neighbors.add(edge.endNode);
    }
    return Collections.unmodifiableList(neighbors);
}

计算最短路径

实现最短路径算法,可以使用 Dijkstra 算法或 Bellman-Ford 算法。下面给出使用 Dijkstra 算法计算最短路径的代码示例。

Map<String, Integer> calculateShortestPath(String startNode) {
    Map<String, Integer> distances = new HashMap<>();
    for (String node : graph.keySet()) {
        distances.put(node, Integer.MAX_VALUE);
    }
    distances.put(startNode, 0);

    PriorityQueue<Node> queue = new PriorityQueue<>(Comparator.comparingInt(n -> n.distance));
    queue.offer(new Node(startNode, 0));

    Set<String> visited = new HashSet<>();

    while (!queue.isEmpty()) {
        Node node = queue.poll();
        if (visited.contains(node.name)) {
            continue;
        }
        visited.add(node.name);
        List<Edge> edges = graph.get(node.name);
        if (edges == null) {
            continue;
        }
        for (Edge edge : edges) {
            if (visited.contains(edge.endNode)) {
                continue;
            }
            int distance = distances.get(node.name) + edge.weight;
            if (distance < distances.get(edge.endNode)) {
                distances.put(edge.endNode, distance);
                queue.offer(new Node(edge.endNode, distance));
            }
        }
    }
    return Collections.unmodifiableMap(distances);
}

class Node {
    String name;
    int distance;

    Node(String name, int distance) {
        this.name = name;
        this.distance = distance;
    }
}

示例说明

添加边

使用 addEdge() 方法添加边,如下所示:

WeightedUndirectedGraph graph = new WeightedUndirectedGraph();
graph.addEdge("A", "B", 4);
graph.addEdge("A", "C", 2);
graph.addEdge("B", "C", 1);
graph.addEdge("B", "D", 5);
graph.addEdge("C", "D", 8);

计算最短路径

使用 calculateShortestPath() 方法计算两个节点之间的最短路径,例如从节点 "A" 到节点 "D" 的最短路径:

Map<String, Integer> shortestPath = graph.calculateShortestPath("A");
Integer distance = shortestPath.get("D"); // distance == 6

总结

本文介绍了加权无向图的设计实现,包括存储结构、获取相邻节点、计算最短路径等操作,并给出了相关代码实现。通过本文的学习,读者能够深入理解加权无向图的实现原理,为后续的算法实现奠定基础。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java数据结构之加权无向图的设计实现 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • 8个简单部分开启Java语言学习之路 附java学习书单

    8个简单部分开启Java语言学习之路 如果你想要学习Java语言,但是不知道从何入手,在这里,我们将为你提供一份简单易懂的攻略,分8个步骤带你开启Java语言学习之路。 1. 安装Java开发工具 Java学习的第一步是安装Java开发工具,目前比较流行的Java开发工具有多种,例如Eclipse、Intellij IDEA、NetBeans等。本攻略以In…

    数据结构 2023年5月17日
    00
  • C语言数据结构之vector底层实现机制解析

    C语言数据结构之vector底层实现机制解析 什么是vector? vector是C++标准库中的一种容器,可以动态调整大小,用于存储数据。 vector的底层实现机制 vector实际上是通过数组实现的,当需要添加元素时,如果当前数组已满,就会重新创建一个更大的数组,并将原数组中的元素复制到新数组中。这样,内存空间得到了增加,同时操作后的元素仍然是顺序存储…

    数据结构 2023年5月17日
    00
  • C++数据结构哈希表详解

    C++数据结构哈希表详解 哈希表(Hash Table)是一种非常重要的数据结构,用于实现字典等各种应用。哈希表将关键字映射到一个固定大小的数据集合中,以支持常数时间复杂度的插入、查找和删除操作。哈希表的核心思想是将关键字通过哈希函数(Hash Function)映射到数据集合中的一个索引位置,哈希函数需要满足良好的散列性质,使得关键字能够均匀地散布在数据集…

    数据结构 2023年5月17日
    00
  • C语言顺序表的基本结构与实现思路详解

    C语言顺序表的基本结构与实现思路详解 什么是顺序表 顺序表,顾名思义,就是使用连续的存储空间来存储数据元素的线性表。在顺序表中,每一个数据元素都占用一个连续的存储单元,这些存储单元在物理上连续存放,因此,顺序表实际上就是由一个存储数据元素的数组和记录该数组大小的变量组成的。 顺序表的基本结构 顺序表的定义 “`c #define MAXSIZE 100 /…

    数据结构 2023年5月17日
    00
  • Go 数据结构之二叉树详情

    Go 数据结构之二叉树详情 二叉树是一种树形数据结构,它的每个节点至多只有两个子节点,通常称为左子节点和右子节点。在本文中,我们将介绍二叉树的定义、遍历方法和常见应用场景。 定义 一个二叉树是一个有根树,它的每个节点最多有两个子节点,用左子树和右子树来区分。 在 Go 代码中,可以通过如下结构体定义表示二叉树的节点: type Node struct { L…

    数据结构 2023年5月17日
    00
  • 详解Pytorch中的tensor数据结构

    详解Pytorch中的Tensor数据结构 在Pytorch中,Tensor是一种重要的数据结构,它是一个多维数组(类似于NumPy的ndarray),并且支持GPU加速操作。在本文中,我们将详细介绍Pytorch中的Tensor数据结构,包括如何创建、初始化、检索和修改Tensor对象。 创建Tensor对象 创建Tensor对象的方法有很多种。以下是一些…

    数据结构 2023年5月17日
    00
  • C语言数据结构顺序表中的增删改(尾插尾删)教程示例详解

    C语言数据结构顺序表中的增删改(尾插尾删)教程示例详解 什么是顺序表 顺序表是一种线性表,它通过一块连续的存储空间来存储数据。顺序表中的数据元素排列在物理存储空间上也是连续的,每个元素占用一个固定的位置和大小,并且使用下标来访问。 顺序表的定义 下面是以int类型为例的一个简单顺序表的定义: #define SIZE 50 typedef struct { …

    数据结构 2023年5月17日
    00
  • C++ 数据结构线性表-数组实现

    C++ 数据结构线性表-数组实现 什么是线性表 线性表,简单来说,就是一种有序的数据结构,数据元素起来往往构成一列,比如数组、链表等等。 数组实现线性表 数组是一种容器,它可以存储相同类型的数据元素。使用数组实现线性表,就是将数据元素按照一定的顺序依次存储在数组中。 数组实现线性表的基本思路 定义一个数组,用来存储数据元素; 定义一个变量,用来记录线性表中元…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部