爪哇2博客
爪哇2博客

爪哇中的拓扑排序

在这篇文章中,我们将在图中看到有关拓扑排序的信息。

拓扑排序是顶点或节点的排序,例如,如果(u,v)之间存在边,那么在拓扑排序中u应该先于v。拓扑排序仅适用于有向无环图(DAG)。如果图中有一个周期,那么就赢了’不可能进行拓扑排序。

拓扑排序示例

让’借助示例了解。
您可能已经使用过maven作为构建工具。如果您在maven中具有多个模块,则maven会基于依赖关系来构建项目。
让’s说您有4个Maven模块。

  • Maven模型
  • Maven业务逻辑
  • mavan-util
  • Maven-ui

现在您需要在maven-business-logic之前构建maven-model,因为maven-business-logic使用来自maven-model的代码。
类似地,由于maven-ui依赖于所有三个模块,因此应在maven-ui之前构建maven-model,maven-business-logic和maven-util。

因此,在这种情况下,我们可以计算拓扑排序,以便maven可以按正确的顺序构建它们。

拓扑排序算法

拓扑排序

请注意,拓扑排序可以有多个解决方案。

让’在这里拾取节点30。

  • 节点30取决于节点20和节点10。
  • 节点10取决于节点20和节点40。
  • 节点20取决于节点40。

因此,在拓扑排序中,节点10,节点20和节点40应该位于节点30之前。

此算法是 深度优先搜索。在深度优先搜索中,我们首先打印顶点,然后转到其邻居,但是在拓扑排序的情况下,我们不’不要立即打印顶点,而是将其推入堆栈。

在拓扑排序中,我们将有一个临时堆栈。我们不会立即打印该顶点,我们首先对其所有相邻顶点递归调用拓扑排序,然后将其推入堆栈。完成递归拓扑排序后,我们将打印堆栈。

为什么有效?

之所以起作用,是因为当您将任何节点推入堆栈时,您已经推入了其邻居(及其邻居等),因此没有任何依赖关系的节点将位于堆栈的顶部。在我们的例子中,我们将在堆栈顶部放置40个。

爪哇程序实现拓扑排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
 
组织.Arpit.爪哇2blog;
 
进口 爪哇.实用程序.数组列表;
进口 爪哇.实用程序.清单;
进口 爪哇.实用程序.叠放;
 
上市 拓扑排序
{
    叠放<节点> ;
 
    上市 拓扑排序() {
        = 叠放<>();
    }
    静态的 节点
    {
        整型 数据;
        布尔值 参观过;
        清单<节点> 邻居;
 
        节点(整型 数据)
        {
            这个.数据=数据;
            这个.邻居= 数组列表<>();
 
        }
        上市 虚空 邻居(节点 邻居节点)
        {
            这个.邻居.(邻居节点);
        }
        上市 清单<节点> 得到Neighbours() {
            返回 邻居;
        }
        上市 虚空 setNeighbours(清单<节点> 邻居) {
            这个.邻居 = 邻居;
        }
        上市 toString()
        {
            返回 +数据;
        }
    }
 
    //递归拓扑排序
    上市  虚空 拓扑排序(节点 节点)
    {
        清单<节点> 邻居=节点.得到Neighbours();
        对于 (整型 i = 0; i < 邻居.尺寸(); i++) {
            节点 n=邻居.得到(i);
            如果(n!= 空值 && !n.参观过)
            {
                拓扑排序(n);
                n.参观过=真正;
            }
        }
        .(节点);
    }
 
    上市 静态的 虚空 主要( 精氨酸[])
    {
 
        拓扑排序 拓扑结构 = 拓扑排序();
        节点 节点40 = 节点(40);
        节点 节点10 = 节点(10);
        节点 节点20 = 节点(20);
        节点 节点30 = 节点(30);
        节点 节点60 = 节点(60);
        节点 节点50 = 节点(50);
        节点 节点70 = 节点(70);
 
        节点40.邻居(节点10);
        节点40.邻居(节点20);
        节点10.邻居(节点30);
        节点20.邻居(节点10);
        节点20.邻居(节点30);
        节点20.邻居(节点60);
        节点20.邻居(节点50);
        节点30.邻居(节点60);
        节点60.邻居(节点70);
        节点50.邻居(节点70);
 
        系统..打印(“拓扑排序顺序:”);
        拓扑结构.拓扑排序(节点40);
 
        //打印堆栈内容
        叠放<节点> resultStack=拓扑结构.;
         (resultStack.空的()==)
            系统..打印(resultStack.流行音乐() + );
    }
 
}
 

当您运行上述程序时,将获得以下输出:

拓扑排序顺序:
40 20 50 10 30 60 70

时间复杂度

它与深度优先搜索非常相似,只是有一个额外的堆栈。所以是 时间复杂度 是O(V + E)

。那’关于Java中的拓扑排序的全部内容。

分享这个

作者

关注作者

相关文章

  • 8月23日

    用Java排序数组

    在本文中,我们将看到如何在Java中对数组进行排序。有多种在Java中对数组进行排序的方法。您可以实现不同的排序算法来对数组进行排序。您可以使用Arrays.sort方法对Java中的数组进行排序。 数组s.sort方法有各种重载版本。你可以通过它[…]

  • 10月12日

    爪哇中的选择排序

    如果您想练习数据结构和算法程序,则可以阅读数据结构和算法面试程序。选择排序是一种就地比较排序算法。它实现起来非常简单,但是在大量输入时效果不佳。选择排序算法在列表中找到最小元素。 […]

  • 10月12日

    Shell在Java中排序

    Shell排序是基于比较的排序算法。是插入排序的概括。它是唐纳德·壳(Donald Shell)发明的。它允许对相距很远的元素进行排序。如果进行插入排序,则仅在相邻元素之间进行比较,而在外壳排序中进行比较,这样可以避免比较相邻元素直到最后一步。壳的最后一步[…]

  • 10月12日

    用Java快速排序

    如果您想练习数据结构和算法程序,则可以解决数据结构和算法面试问题。快速排序或分区交换排序是一种使用分而治之算法的排序算法。在快速排序中,我们首先选择一个数据透视表并将其分为两个子列表,一个子列表将包含低于数据透视表的元素和[…]

  • 10月12日

    爪哇中的堆排序

    在本文中,我们将看到如何在Java中实现堆排序。我将堆排序分为多个部分,以使其更易于理解。什么是堆?堆是具有某些特殊属性的树,因此node的值应大于或等于(小于或等于[…]

  • 10月12日

    用Java计算排序

    计数排序是一种特殊的排序技术,用于在特定范围之间对元素进行排序。假设元素属于1到K的范围,那么可以使用Counting sort来对元素进行O(N)次排序。计算排序以查找少于X的元素数的基本思想,因此X可以放在其[…]

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

订阅我们的新闻

获取质量教程到您的收件箱。现在订阅。


让’s be Friends

©2020 爪哇2博客