首页 游戏 软件 资讯 排行榜 专题
首页
编程语言
如何在 Java 中利用数组实现简单的拓扑排序(Topological Sort)中的入度表记录

如何在 Java 中利用数组实现简单的拓扑排序(Topological Sort)中的入度表记录

热心网友
35
转载
2026-04-30

如何在 Ja va 中利用数组实现简单的拓扑排序(Topological Sort)中的入度表记录

如何在 Ja va 中利用数组实现简单的拓扑排序(Topological Sort)中的入度表记录

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

在 Ja va 里用数组来实现拓扑排序的入度表,其实是个既简洁又高效的做法。它的核心思路,就是用一个整型数组 inDegree[] 来记录每个节点当前的“入度”——也就是有多少条边指向它。这种方法特别适合节点编号连续(比如从 0n-1)的有向无环图,省去了复杂数据结构的开销。

一、入度数组的定义与初始化

假设我们处理的图有 n 个顶点,编号正好是 0 到 n−1。第一步很简单,声明一个长度同样为 n 的整型数组:

int[] inDegree = new int[n];

初始化之后,数组里所有元素默认都是 0,这表示还没有统计任何入边。接下来的工作,就是遍历图中的所有有向边 u → v,每遇到一条,就对 inDegree[v] 执行一次加一操作。遍历完成,入度数组也就构建好了。

话说回来,如果想系统提升,不妨参考一下这份“Ja va免费学习笔记(深入)”。

二、从邻接表或边列表构建入度数组

实际编码时,图的输入形式通常有两种,处理上稍有区别:

  • 如果拿到的是邻接表,比如 List> graph(其中 graph[u] 存储了节点 u 的所有后继节点),那么构建过程就是两层循环:先遍历每个节点 u,再遍历它的每个邻居 v,并对 inDegree[v]++
  • 如果直接给的是边列表,例如 int[][] edges = {{0,1},{1,2},{0,2}},那就更直接了:遍历每条边 edges[i][0] → edges[i][1],然后对目标节点 edges[i][1] 对应的下标执行 inDegree[edges[i][1]]++ 即可。

三、配合队列实现 Kahn 算法(标准拓扑排序)

光有入度数组还不够,它本身并不产生排序。真正的排序逻辑,需要配合队列,也就是经典的 Kahn 算法:

  • 首先,扫描一遍入度数组,把所有 inDegree[i] == 0 的节点 i 放入队列。这些节点就是当前没有任何前置依赖的“起点”。
  • 接着,从队列中取出一个节点 u,将它加入最终的拓扑序列。
  • 然后,遍历 u 的每一个后继节点 v,将 inDegree[v] 减 1。你猜怎么着?如果减完之后 inDegree[v] 变成了 0,那就意味着 v 的所有前驱都已被处理,可以立即将它入队,等待后续处理。

循环这个过程,直到队列为空。最后,检查一下拓扑序列的长度是否等于节点总数 n。如果相等,恭喜你,排序成功;如果不相等,那基本可以断定,图中存在环,无法进行拓扑排序。

四、注意事项与边界情况

使用数组记录入度虽好,但有个重要前提:节点编号必须是连续且从0开始的整数。如果节点是字符串,或者编号是稀疏的(比如 100, 200, 999),那就得先做一步映射,把它们转换成 0~n−1 的连续索引,然后再建数组。当然,也可以退一步,直接使用 Map 来灵活存储。

另外,需要特别注意的是,入度数组只负责计数,它并不保存图本身的结构信息。因此,你仍然需要邻接表或邻接矩阵来提供每个节点的后继节点列表,以便在 Kahn 算法中遍历。理解了这一点,才算真正掌握了这个技巧的精髓。

来源:https://www.php.cn/faq/2398968.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

如何在 Java 中利用数组实现简单的完全二叉树判定逻辑(基于下标连续性分析)
编程语言
如何在 Java 中利用数组实现简单的完全二叉树判定逻辑(基于下标连续性分析)

如何在 Ja va 中利用数组实现简单的完全二叉树判定逻辑(基于下标连续性分析) 用数组来存储二叉树,是一种非常直观且高效的方式,尤其是在处理完全二叉树时。其存储规则大家都很熟悉:根节点放在索引0,对于任意节点i,其左孩子索引是2*i+1,右孩子是2*i+2。那么,如何快速判断一个给定的数组是否对应

热心网友
04.30
如何在 Java 中直接将数据流式写入 Amazon S3(无需本地临时文件)
编程语言
如何在 Java 中直接将数据流式写入 Amazon S3(无需本地临时文件)

告别临时文件:用AWS SDK for Ja va V2将数据直传S3 在处理海量动态数据时,你是否还在沿用“先落本地盘,再传云端”的老办法?这种模式不仅拖慢整体流程,更会在磁盘I O和存储空间上埋下性能瓶颈的隐患。今天,我们就来聊聊如何利用AWS SDK for Ja va V2,将内存中的数据(

热心网友
04.30
如何在 Java 中利用数组实现简单的环形链表检测(快慢指针法)逻辑建模
编程语言
如何在 Java 中利用数组实现简单的环形链表检测(快慢指针法)逻辑建模

Ja va中可用数组模拟链表并用快慢指针检测环:以next[i]表示节点i的后继索引,slow每次移1步、fast每次移2步,若相遇则有环,若越界则无环。 直接说结论:在Ja va里,虽然没法用数组造出一个真正的链表对象,但完全可以用数组来模拟链表的逻辑结构,再套用经典的快慢指针法来检测环。这其中的

热心网友
04.30
如何在 Java 中利用 Queue.peek() 在不影响队列状态的情况下预览队首任务
编程语言
如何在 Java 中利用 Queue.peek() 在不影响队列状态的情况下预览队首任务

如何在 Ja va 中利用 Queue peek() 在不影响队列状态的情况下预览队首任务 先明确一个核心概念:peek() 在队列为空时返回 null 而非抛异常。这与 poll() 的行为有微妙差别——后者在空队列时也返回 null,但会移除元素;而 peek() 则纯粹是只读操作。一个常见的陷

热心网友
04.30
如何在 Java 中利用数组实现简单的拓扑排序(Topological Sort)中的入度表记录
编程语言
如何在 Java 中利用数组实现简单的拓扑排序(Topological Sort)中的入度表记录

如何在 Ja va 中利用数组实现简单的拓扑排序(Topological Sort)中的入度表记录 在 Ja va 里用数组来实现拓扑排序的入度表,其实是个既简洁又高效的做法。它的核心思路,就是用一个整型数组 inDegree[] 来记录每个节点当前的“入度”——也就是有多少条边指向它。这种方法特别

热心网友
04.30

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

关于天气的农谚
职业与学业
关于天气的农谚

清明刮了坟头土,沥沥拉拉四十五。 这些流传已久的农谚,可不是随口说说的顺口溜,它们是千百年来农耕文明与自然对话的结晶,是写在时间里的“天气备忘录”。一句句简短的话语,背后藏着的是对节气、物候与农事活动之间精密联系的深刻洞察。 节气与农事 先看清明和谷雨这对“搭档”。老话说,“清明要晴,谷雨要淋”。清

热心网友
04.30
经典的励志语句
职业与学业
经典的励志语句

人生伟业的建立,不在能知,乃在能行。 仔细想想,真正的阻碍往往并非来自外界,而是源于内心。任何的限制,其实都是从自己的内心开始的。 那么,我们该如何突破呢?不妨先从一个简单的行动开始:如果我们都去专注地做那些自己能做到的事情,最终的结果,往往会让自己大吃一惊。 行动固然重要,但人终究是社会性的存在。

热心网友
04.30
描写春雨的优美句子
职业与学业
描写春雨的优美句子

亮晶晶的春雨 你听,那是什么声音?是欢快的打击乐,还是轻盈的舞步?原来,是一群天真烂漫的娃娃——亮晶晶的春雨,正在高空中云集。它们嬉戏着,咿咿呀呀地欢唱着,然后一股脑儿地、欢蹦乱跳地扑向大地母亲的怀抱。 这春雨,可不只是娃娃们的嬉闹。它绵绵不绝,细细密密,像极了巧手姑娘使用的花针与丝线。它们斜斜地交

热心网友
04.30
赞扬母亲的句子
职业与学业
赞扬母亲的句子

母亲的爱是世间最伟大的爱,也是最珍贵的爱 母爱,常常藏匿于那些看似微不足道的日常琐碎里。它或许没有惊天动地的形式,却如涓涓细流,汇聚成永恒的生命之源。 该如何形容这种无处不在的守护呢?春天,她是拂面的和风,送来丝丝暖意;夏日,她是那口沁凉的冰淇淋,带来纯粹的快乐;秋时,她化作枝头那片悄然飘落的黄叶,

热心网友
04.30
描写花的好句子
职业与学业
描写花的好句子

一列美人蕉 盛开着红色、黄色而带着黑斑的大朵的花,正伸张了大口,向着灿烂的春光微笑。远远望去,美人蕉的花簇像一团团燃烧得正旺的火焰,充满了生命力;凑近细看,每一朵又宛如小姑娘发间俏丽的红蝴蝶结,透着几分活泼与羞涩。至于它那宽大的叶子,则像极了一把把撑开的绿色芭蕉扇,在风中轻轻摇曳。 看着这些盛开的花

热心网友
04.30