详解Java实现拓扑排序算法

详解Java实现拓扑排序算法

什么是拓扑排序算法

拓扑排序算法是一种用来解决有向图中节点之间依赖关系问题的算法,它可以将有向无环图(DAG)中的所有节点按照一定的规则排序,可以用来确定一组任务的执行顺序,比如编译器可以用拓扑排序来确定源代码的编译顺序。

拓扑排序算法原理

拓扑排序算法基于DAG图,DAG图中每个节点表示一个任务,有向边表示任务之间的依赖关系,如果节点a到节点b有一条有向边,则表示节点a必须在节点b之前执行。拓扑排序算法就是将DAG中的节点按照依赖关系排序的过程。

拓扑排序算法的过程如下:

  1. 建立入度表和邻接表:

    • 入度表:用于保存每个节点的入度,入度为0的节点没有依赖关系,可以作为排序的起点;
    • 邻接表:用于记录每个节点的出度,即它所指向的其他节点。
  2. 创建一个队列,将初始入度为0的节点加入队列中。

  3. 对于队列中的节点,遍历其邻接节点,并将邻接节点的入度减1,如果减为0,则将其加入队列中。

  4. 不断重复步骤3,直到队列为空,或者所有节点都已被遍历。

  5. 最终的结果是排序后的节点列表,如果队列为空而图中还有未遍历的节点,则表示图中存在环路。

Java实现拓扑排序算法

在Java中实现拓扑排序算法,可以通过建立入度表和邻接表,并使用BFS(广度优先搜索)算法来进行遍历和排序。

下面是Java实现拓扑排序算法的详细示例代码:

import java.util.*;

public class TopologicalSorting {

    private Map<Integer, List<Integer>> adjacencyList;
    private Map<Integer, Integer> indegree;

    public void topoSort(int n, int[][] edges) {
        adjacencyList = new HashMap<>();
        indegree = new HashMap<>();

        // 初始化邻接表和入度表
        for (int i = 0; i < n; i++) {
            adjacencyList.put(i, new ArrayList<>());
            indegree.put(i, 0);
        }

        // 建立邻接表和入度表
        for (int[] edge : edges) {
            adjacencyList.get(edge[0]).add(edge[1]);
            indegree.put(edge[1], indegree.get(edge[1]) + 1);
        }

        // 初始化队列,将入度为0的节点加入队列中
        Queue<Integer> queue = new LinkedList<>();
        for (int i = 0; i < n; i++) {
            if (indegree.get(i) == 0) {
                queue.offer(i);
            }
        }

        // 遍历队列中的节点,并更新其邻接节点的入度
        List<Integer> result = new ArrayList<>();
        while (!queue.isEmpty()) {
            int node = queue.poll();
            result.add(node);
            for (int neighbor : adjacencyList.get(node)) {
                indegree.put(neighbor, indegree.get(neighbor) - 1);
                if (indegree.get(neighbor) == 0) {
                    queue.offer(neighbor);
                }
            }
        }

        // 判断是否存在环路
        if (result.size() != n) {
            throw new RuntimeException("The given graph contains a cycle");
        }

        // 输出排序结果
        System.out.println("Topological sorting result:");
        for (int i : result) {
            System.out.print(i + " ");
        }
    }

    public static void main(String[] args) {
        int n = 7;
        int[][] edges = {{0, 1}, {0, 2}, {1, 2}, {1, 3}, {2, 3}, {2, 4}, {3, 4}, {3, 5}, {4, 5}, {5, 6}};
        TopologicalSorting ts = new TopologicalSorting();
        ts.topoSort(n, edges);
    }
}

上述代码中,我们通过建立邻接表和入度表,利用BFS算法进行排序,并在最后输出排序结果。

示例说明

在上面的Java代码示例中,我们使用了以下示例图来进行拓扑排序:

          5 --> 6
         /       ↑
        ↓        |
0 --> 1 --> 2 --> 4
        |      /↑
        ↓     /
        3 --<

运行上述Java程序,输出的排序结果是:0 1 2 3 4 5 6。

我们可以再使用另外一个示例图来进行说明:

0 --> 1 --> 2 --> 3
        |      /↑
        |     /
        |    ↓
        5 <-- 4

在上述示例图中,节点0没有任何依赖,是排序的起点。我们可以修改Java代码中的邻接表和入度表,并重新运行程序,即可得到0 1 4 2 3 5的排序结果。

总的来说,拓扑排序算法是对有向无环图(DAG)中的节点进行排序的一种算法,它可以被广泛地应用于各种领域,如编译器、调度器等。在Java中,我们可以通过建立邻接表和入度表,并使用BFS算法进行排序来实现拓扑排序算法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Java实现拓扑排序算法 - Python技术站

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

相关文章

  • 图文教程教你IDEA中的Spring环境搭建+简单入门

    图文教程:IDEA中的Spring环境搭建+简单入门 本文基于集成开发环境IntelliJ IDEA,为初学者讲解了如何搭建Spring环境和进行简单入门操作。下面是详细的步骤: 1. 安装IDEA 首先需要下载并安装IntelliJ IDEA,官方网站为:https://www.jetbrains.com/idea/download/。选择对应操作系统版本…

    Java 2023年5月19日
    00
  • Idea运行单个main方法,不编译整个工程的问题

    当我们在使用 IntelliJ IDEA 进行 Java 开发时,有时候需要在项目中单独运行某个 Java 类的 main 方法,而不想编译整个工程。下面是完整的攻略,包含以下步骤: 步骤一:创建运行配置(Run configuration) 首先,在 IDEA 的工具栏中点击“Run” ->“Edit configurations…”进入运行配置…

    Java 2023年5月26日
    00
  • Sprint Boot @PatchMapping使用方法详解

    Spring Boot的@Validated的作用与使用方法 在Spring Boot中,@Validated注解用于验证请求参数的有效性。它可以用于验证请求参数的格式、范围、长度等,以确保请求参数的有效性。在本文中,我们将详细介绍@Validated注解的作用和使用方法,并提供两个示例。 @Validated注解的作用 @Validated注解用于验证请求…

    Java 2023年5月5日
    00
  • Java后端Cookie实现(时间戳)代码实例

    请看下面的详细讲解: Java后端Cookie实现(时间戳)代码实例 一、Cookie介绍 Cookie是指服务器通过HTTP响应发送给客户端的一小段文本信息。浏览器会将这些信息存储在客户端,并在下一次访问相同的服务器时发送回服务器。 Cookie可以用于实现在客户端保留数据的功能,比如记住登陆状态、保存浏览历史等。 二、创建Cookie 在Java后端开发…

    Java 2023年6月1日
    00
  • python实现提取jira bug列表的方法示例

    下面我将详细讲解Python实现提取Jira bug列表的方法示例的完整攻略。 1. 准备工作 在使用Python获取Jira bug列表前,我们需要先为访问Jira做好准备工作。具体做法是: 在Jira中创建一个新的用户,用于Python访问Jira时使用。 在Jira中为该用户授权,最好只授权访问相关的项目和数据,以保证安全性。 在Python中安装相关…

    Java 2023年6月16日
    00
  • 京东面经总结

    非科班,经历了无数场秋招,现将面试京东的题目记录如下: 一面 kafka在应用场景以及 项目 里的实现 bitmap底层 object里有哪些方法 hashmap相关 sychronized和reentrantlock相关问题以及锁升级 cas和volatile 线程几种状态以及转化 jvm内存模型 mybatis相关问题 Redis数据结构,问了下跳表的底…

    Java 2023年5月8日
    00
  • Java如何利用return结束方法调用

    当Java方法执行到return语句时,方法会立即停止执行并返回指定的值(如果有的话)。在这个过程中,所有未完成的代码将不再执行。 要利用return结束方法调用,需要在方法的内部使用return关键字,并提供返回值。下面是使用return的基本语法: public int add(int a, int b) { int sum = a + b; retur…

    Java 2023年5月26日
    00
  • Java性能分析工具的作用是什么?

    Java性能分析工具的作用 Java性能分析工具是用来检测Java程序中的性能问题并找出优化方法的工具。Java程序中的性能问题可能包括了CPU占用率高、内存泄漏、线程阻塞等等。 Java程序中可能存在很多潜在的性能问题,但是代码很长、复杂、分散等原因让我们很难快速找出问题所在。使用性能分析工具可以帮助我们在尽可能短的时间内找到问题所在,使我们更快速地进行优…

    Java 2023年5月11日
    00
合作推广
合作推广
分享本页
返回顶部