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数据结构之对象比较详解 在Java中,比较两个对象的内容是否相等一直是程序员们比较困惑的问题。本文将详细探讨Java中对象比较的几种方式,并给出相应的示例。 基本类型比较 在Java中,比较基本类型的值可以使用双等号(==)进行判断。例如: int a = 1; int b = 1; boolean result = a == b; System.o…

    数据结构 2023年5月17日
    00
  • 题目 3158: 蓝桥杯2023年第十四届省赛真题-三国游戏(贪心)

    题目描述 小蓝正在玩一款游戏。游戏中魏蜀吴三个国家各自拥有一定数量的士兵X, Y, Z (一开始可以认为都为 0 )。游戏有 n 个可能会发生的事件,每个事件之间相互独立且最多只会发生一次,当第 i 个事件发生时会分别让 X, Y, Z 增加Ai , Bi ,Ci 。当游戏结束时 (所有事件的发生与否已经确定),如果 X, Y, Z 的其中一个大于另外两个之…

    算法与数据结构 2023年4月30日
    00
  • 深入浅析C语言中堆栈和队列

    深入浅析C语言中堆栈和队列 堆栈(Stack) 堆栈是一种先进后出(Last In First Out,LIFO)的线性数据结构,只允许在一端进行插入和删除操作。堆栈在C语言中常用于函数调用时的参数传递、表达式求值和程序中断处理等场景。 实现堆栈的基本操作 下面是堆栈的基本操作,可以用数组来实现: 初始化 #define MAX_SIZE 100 // 假设…

    数据结构 2023年5月17日
    00
  • 图计算引擎分析–GridGraph

    作者:京东科技 李永萍 GridGraph:Large-Scale Graph Processing on a Single Machine Using 2-Level Hierarchical Partitioning 图计算框架 图计算系统按照计算方式划分可分为:单机内存图处理系统,单机核外图处理系统,分布式内存图处理系统,分布式核外图处理系统。本文将详…

    算法与数据结构 2023年4月20日
    00
  • 1811 E Living Sequence 两种解法

    思维 进制转换 数位DP 无前导0 T3Problem – 1811E – Codeforces 题目大意 从一个不含有数字4的递增序列中找第k个数并输出。如 \(1,2,3,5,6,7,8,9,10,11,12\), \(k = 4\) 时输出 \(5\)。 思路1 有一个巧妙的解法:考虑这个问题, 从一个没有限制的从1开始的递增序列找出第k个数, 显然就…

    算法与数据结构 2023年4月17日
    00
  • 【JavaScript快速排序算法】不同版本原理分析

    说明 快速排序(QuickSort),又称分区交换排序(partition-exchange sort),简称快排。快排是一种通过基准划分区块,再不断交换左右项的排序方式,其采用了分治法,减少了交换的次数。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速…

    算法与数据结构 2023年4月18日
    00
  • Java数据结构之链表详解

    Java数据结构之链表详解 什么是链表? 链表是一种基本的动态数据结构,它的基本思想是利用指针将一些零散的内存块串联起来,形成一个逻辑上的整体。链表由一些称为节点的元素组成,每个节点保存两个部分:数据和指向下一个节点的指针。相比于数组这种静态数据结构,链表具有动态性,我们可以通过动态的增加或删除节点来改变链表的大小。 链表的分类 单向链表:每个节点只有一个指…

    数据结构 2023年5月17日
    00
  • 详解Java数据结构之平衡二叉树

    详解Java数据结构之平衡二叉树 什么是平衡二叉树? 平衡二叉树(Balanced Binary Tree)是一种特殊的二叉搜索树,它的左子树和右子树的高度差不超过1,这样可以保证在最坏情况下,查找、插入、删除等操作的时间复杂度都是O(log n)。 平衡二叉树的基本性质 左子树和右子树的高度差不超过1。 平衡二叉树的左右子树也是平衡二叉树。 如何实现? 平…

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