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日

相关文章

  • Java数据结构专题解析之栈和队列的实现

    Java数据结构专题解析之栈和队列的实现 什么是栈和队列? 在计算机科学中,栈(Stack)和队列(Queue)都是常见的数据结构,用于解决许多问题。它们都是线性数据结构,但它们的元素访问顺序不同。 栈是先进后出(Last In First Out,LIFO)的结构,即最后放入栈中的元素最先被访问。 队列是先进先出(First In First Out,FI…

    数据结构 2023年5月17日
    00
  • Java深入了解数据结构之优先级队列(堆)

    Java深入了解数据结构之优先级队列(堆) 本文将会详细介绍Java中的优先级队列,即堆数据结构的实现过程和使用方法。 什么是优先级队列? 在介绍优先级队列之前,我们需要了解先进先出队列(FIFO Queue)和后进先出队列(LIFO Queue,或称栈)的概念。FIFO Queue按照元素的插入顺序依次出队;而LIFO Queue则按照元素的插入顺序反向出…

    数据结构 2023年5月17日
    00
  • python数据结构之二叉树的建立实例

    下面是Python数据结构之二叉树的建立实例的完整攻略。 一、二叉树的概念 二叉树是一种常用的树形结构,它由一组父子关系组成,其中每个节点都最多有两个子节点。通常我们认为,一个二叉树的根节点是唯一的,它没有父节点,而叶子节点则没有子节点。在二叉树中,节点的左子树和右子树可以为空。 二、二叉树的遍历 二叉树的遍历是指访问二叉树中所有节点的操作,它分为三种不同的…

    数据结构 2023年5月17日
    00
  • 查询json的数据结构的8种方式简介

    查询json的数据结构的8种方式简介 在处理JSON数据时,经常需要提取特定的数据或获取某个属性的值。这时候就需要使用JSON的查询语言来进行查询操作。本文将介绍8种常用的JSON查询方式,帮助大家更方便、快捷地查询和分析JSON数据。 1. 点语法 使用点语法(.)查询JSON数据是最简单、最常用的方式,通过指定属性名来获取相应的值。例如,假设有以下的JS…

    数据结构 2023年5月17日
    00
  • C++实现数据结构的顺序表详解

    C++实现数据结构的顺序表详解 介绍 在进行程序开发时,常常需要对数据进行存储和操作。其中一种数据结构是顺序表,它提供了一种在内存中线性存储数据的方法,能够方便地对数据进行插入、删除、查找等操作。本文将详细介绍如何使用C++实现数据结构的顺序表,帮助读者掌握顺序表的创建、插入、删除、查找等操作。 创建顺序表 顺序表可以使用数组来实现。下面的代码展示了如何创建…

    数据结构 2023年5月17日
    00
  • C语言数据结构二叉树先序、中序、后序及层次四种遍历

    C语言数据结构二叉树四种遍历 什么是二叉树 二叉树是一种非常重要的数据结构,在计算机科学中具有广泛的应用。它由节点和边组成,每个节点最多有两个子节点。二叉树有许多种遍历方法,可以用来查找节点、在树中插入新节点、删除节点等操作。 二叉树遍历 二叉树遍历是指对二叉树的节点进行访问,有4种遍历方式: 先序遍历(Preorder Traversal) 中序遍历(In…

    数据结构 2023年5月17日
    00
  • nginx内存池源码解析

    Nginx内存池源码解析 Nginx是一个高性能、高并发的Web服务器。为了提高其性能和速度,Nginx采用了特殊的内存管理机制,即内存池。 什么是内存池? 内存池是一种高效的内存分配和管理机制。它将一块内存划分成多个大小相等的块,并按需分配给系统。当内存块不再使用时,它并不被立即释放,而是留在内存池中待重复利用。 Nginx内存池结构 Nginx内存池主要…

    数据结构 2023年5月17日
    00
  • 带你了解Java数据结构和算法之前缀,中缀和后缀表达式

    带你了解Java数据结构和算法之前缀、中缀和后缀表达式 1. 前缀表达式(Prefix Expression) 前缀表达式是指运算符位于操作数之前的表达式,也被称为波兰式。前缀表达式的优点在于,每个运算符的优先级都可以通过括号来明确,不需要考虑运算符的优先级。同时,整个表达式的意义也可以很清晰地传达。 举个例子,下面是一个前缀表达式: + * 4 5 6 /…

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