Java中实现拓扑排序的两种方式:Kahn算法和DFS
写后端的时候经常遇到依赖编排比如任务调度、编译顺序背后其实是个有向无环图DAG的拓扑排序对于每条从 u 指向 v 的边u 必须排在 v 前面。在 Java 里搞拓扑排序一般就两个路子——Kahn 算法基于入度和深度优先搜索DFS。先说 Kahn 算法。思路很直接维护每个节点的入度把所有入度为 0 的节点扔进队列然后逐个弹出每弹出一个就加入结果序列同时把它指向的邻居入度减一减到 0 就入队。最后如果结果序列的长度不等于总节点数说明图里有环没法完全排序。下面这段代码是 Kahn 算法的完整实现我习惯用邻接表存图入度用数组队列用 LinkedList。import java.util.*; public class TopologicalSortKahn { public static ListInteger topologicalSort(int numVertices, ListListInteger edges) { ListInteger result new ArrayList(); int[] inDegree new int[numVertices]; MapInteger, ListInteger graph new HashMap(); // 初始化图和入度 for (int i 0; i numVertices; i) { graph.put(i, new ArrayList()); } for (ListInteger edge : edges) { int from edge.get(0); int to edge.get(1); graph.get(from).add(to); inDegree[to]; } // 将所有入度为0的顶点加入队列 QueueInteger queue new LinkedList(); for (int i 0; i numVertices; i) { if (inDegree[i] 0) { queue.add(i); } } // 处理队列中的顶点 while (!queue.isEmpty()) { int current queue.poll(); result.add(current); for (int neighbor : graph.get(current)) { inDegree[neighbor]--; if (inDegree[neighbor] 0) { queue.add(neighbor); } } } // 如果处理的顶点数不等于图中的顶点数则图中存在环 if (result.size() ! numVertices) { throw new RuntimeException(The graph has a cycle!); } return result; } public static void main(String[] args) { int numVertices 6; ListListInteger edges Arrays.asList( Arrays.asList(5, 2), Arrays.asList(5, 0), Arrays.asList(4, 0), Arrays.asList(4, 1), Arrays.asList(2, 3), Arrays.asList(3, 1) ); System.out.println(Topological Sort (Kahns Algorithm): topologicalSort(numVertices, edges)); } }Kahn 算法胜在直观而且天然支持环检测线上跑起来如果数据里出现了循环依赖直接抛异常就能拦截不用额外加判断逻辑。另一种实现是 DFS。对每个节点做深度优先遍历在递归回溯的时候把节点压栈整个栈的弹出顺序就是拓扑排序的结果。这块有个细节后进先出所以 DFS 完成后的栈从顶往下弹刚好符合依赖顺序。下面是 DFS 的代码不过这里只是最简版本——没用三色标记未访问/访问中/已完成如果图里有环会造成栈溢出或者无限递归。实际用的时候最好加个 visiting 状态来检测后向边不然数据一脏线上问题就出来了。import java.util.*; public class TopologicalSortDFS { public static ListInteger topologicalSort(int numVertices, ListListInteger edges) { MapInteger, ListInteger graph new HashMap(); for (int i 0; i numVertices; i) { graph.put(i, new ArrayList()); } for (ListInteger edge : edges) { int from edge.get(0); int to edge.get(1); graph.get(from).add(to); } SetInteger visited new HashSet(); StackInteger stack new Stack(); for (int i 0; i numVertices; i) { if (!visited.contains(i)) { dfs(i, graph, visited, stack); } } ListInteger result new ArrayList(); while (!stack.isEmpty()) { result.add(stack.pop()); } return result; } private static void dfs(int node, MapInteger, ListInteger graph, SetInteger visited, StackInteger stack) { visited.add(node); for (int neighbor : graph.getOrDefault(node, new ArrayList())) { if (!visited.contains(neighbor)) { dfs(neighbor, graph, visited, stack); } } stack.push(node); } public static void main(String[] args) { int numVertices 6; ListListInteger edges Arrays.asList( Arrays.asList(5, 2), Arrays.asList(5, 0), Arrays.asList(4, 0), Arrays.asList(4, 1), Arrays.asList(2, 3), Arrays.asList(3, 1) ); System.out.println(Topological Sort (DFS): topologicalSort(numVertices, edges)); } }这两种方式选哪个其实看场景。如果图里很可能有环Kahn 直接能检测出来比较省心如果图的规模很大且需要保留某种遍历顺序特征DFS 写法更灵活扩展起来也方便比如结合 Tarjan 搞强连通分量。但日常工作中Kahn 用得多一些逻辑很平不容易写错代码审查也友好。作为一款运行多年的SSL证书管理工具lcjmSSL实现了从申请、验证到部署、续期的全生命周期自动化。普通用户可以通过简洁的界面免费管理自己的证书资源。从2018年至今平台持续优化ACME渠道的对接逻辑确保了签发过程的高成功率为大量互联网产品的安全运行提供保障。把上面代码拉下来跑一遍基本就能上手有什么坑再具体调。

相关新闻

Nacos服务领域模型深度解析:从Namespace到Instance的实战指南

Nacos服务领域模型深度解析:从Namespace到Instance的实战指南

这类面试题最值得先看的不是死记硬背几个名词,而是理解 Nacos 为什么要把服务管理拆成这几个模型,以及在实际开发、部署、排查问题时,这些模型到底在哪个环节起作用。很多人在面试时能说出名字,但一到线上服务注册失败、配置不生效…

2026/8/9 3:43:36 阅读更多 →
软件工程基本功:超越AI热潮,构建可靠、可维护、可扩展的软件系统

软件工程基本功:超越AI热潮,构建可靠、可维护、可扩展的软件系统

1. 项目概述:当技术喧嚣褪去,回归软件的本质最近几年,AI的浪潮一波高过一波,从大语言模型到生成式AI,几乎每个技术论坛、行业峰会都在谈论它。仿佛不谈AI,你就落伍了。作为一个写了十几年代码、带过不少项目…

2026/8/9 3:43:36 阅读更多 →
VISSIM交通仿真软件的核心技术与应用实践

VISSIM交通仿真软件的核心技术与应用实践

1. VISSIM交通仿真软件的核心价值解析VISSIM作为微观交通仿真领域的标杆工具,其核心价值在于能够对复杂交通系统进行高精度数字化建模。不同于传统的宏观模型,VISSIM采用基于行为的仿真引擎,可以精确到每辆车的加减速、变道决策等微观行为。我…

2026/8/9 3:43:35 阅读更多 →

最新新闻

大众点评店铺信息爬虫实战:Python采集商圈美食评价与星级

大众点评店铺信息爬虫实战:Python采集商圈美食评价与星级

一、引言:为什么需要爬取大众点评数据? 在数字化营销和商业分析领域,本地生活服务平台的数据具有极高的价值。大众点评作为中国领先的本地生活信息平台,积累了海量的用户评价、店铺星级、人均消费、推荐菜等结构化数据。这些数据对于以下场景至关重要: 竞品分析:餐饮品牌…

2026/8/9 8:40:58 阅读更多 →
腾讯视频Python爬虫实战:从播放量到弹幕的完整数据抓取指南

腾讯视频Python爬虫实战:从播放量到弹幕的完整数据抓取指南

前言 在当今数字化时代,视频平台的数据蕴含着巨大的商业价值和用户洞察。腾讯视频作为国内领先的在线视频平台,拥有海量的电视剧、综艺、电影等内容,其播放量和弹幕数据直接反映了内容的受欢迎程度和用户互动情况。本文将带您从零开始,使用Python构建一套完整的腾讯视频数…

2026/8/9 8:40:58 阅读更多 →
XUnity.AutoTranslator:3分钟快速上手,免费解锁Unity游戏多语言支持终极方案

XUnity.AutoTranslator:3分钟快速上手,免费解锁Unity游戏多语言支持终极方案

XUnity.AutoTranslator:3分钟快速上手,免费解锁Unity游戏多语言支持终极方案 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 还在为外语游戏的语言障碍烦恼吗?XUnity.A…

2026/8/9 8:40:58 阅读更多 →
Unity地形分割与动态加载技术实战:构建大型开放世界游戏的核心解决方案

Unity地形分割与动态加载技术实战:构建大型开放世界游戏的核心解决方案

1. 项目概述:为什么我们需要地形分割与动态加载?做开放世界、大型MMO或者任何需要广阔地图的游戏,Unity开发者迟早会撞上这堵墙:编辑器里跑得飞快的场景,打包后加载慢如蜗牛,运行时内存占用高得吓人&#x…

2026/8/9 8:40:58 阅读更多 →
Unity ShaderGraph实现镭射材质:从光学原理到赛博朋克实战

Unity ShaderGraph实现镭射材质:从光学原理到赛博朋克实战

1. 项目概述:为什么镭射材质值得你投入精力?最近在做一个赛博朋克风格的项目,角色服装和部分环境装饰需要一种“五彩斑斓的黑”或者说是那种随着视角变化会流动变幻色彩的效果,第一时间就想到了镭射材质。这玩意儿在潮玩、科幻游戏…

2026/8/9 8:40:58 阅读更多 →
JeecgBoot v3.9.2:AI Skills驱动,一句话生成企业级应用

JeecgBoot v3.9.2:AI Skills驱动,一句话生成企业级应用

1. 项目概述:从“拖拉拽”到“一句话”的范式革命如果你在过去几年里接触过低代码开发,那么对“拖拉拽”这三个字一定不会陌生。无论是搭建一个简单的表单,还是配置一个复杂的审批流,我们习惯了在可视化的设计器里,用鼠…

2026/8/9 8:39:58 阅读更多 →

日新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/9 0:01:47 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/9 0:01:47 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/9 0:03:48 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/9 0:01:47 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/9 0:01:47 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/9 0:03:48 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/8 17:02:44 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/9 0:45:04 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/8 17:02:44 阅读更多 →