一、拓扑排序(Topological Sorting):
是一个 有向无环图(DAG,Directed Acyclic Graph) 的所有顶点的线性序列。且该序列必须满足下面两个条件:
- 每个顶点出现且只出现一次。
- 若存在一条从顶点A到顶点B的路径,那么在序列中顶点A出现在顶点B的前面。
例如,下面这个图:
它是一个DAG图,那么如何写出它的拓扑顺序呢?这里说一种比较常用的方法:
- 从DAG途中选择一个没有前驱(即入度为0)的顶点并输出
- 从图中删除该顶点和所有以它为起点的有向边。
- 重复1和2直到当前DAG图为空或当前途中不存在无前驱的顶点为止。后一种情况说明有向图中必然存在环。
于是,得到拓扑排序后的结果是{1,2,4,3,5}。
二、python 多重继承
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
class A(object):
def foo(self):
print('A foo')
def bar(self):
print('A bar')
class B(object):
def foo(self):
print('B foo')
def bar(self):
print('B bar')
class C1(A,B):
pass
class C2(A,B):
def bar(self):
print('C2-bar')
class D(C1,C2):
pass
if __name__ == '__main__':
print(D.__mro__)
d=D()
d.foo()
d.bar()
首先,我们根据上面的继承关系构成一张图,如下
- 找到入度为0的点,只有一个D,把D拿出来,把D相关的边剪掉
- 现在有两个入度为0的点(C1,C2),取最左原则,拿C1,剪掉C1相关的边,这时候的排序是{D,C1}
- 现在我们看,入度为0的点(C2),拿C2,剪掉C2相关的边,这时候排序是{D,C1,C2}
- 接着看,入度为0的点(A,B),取最左原则,拿A,剪掉A相关的边,这时候的排序是{D,C1,C2,A}
- 继续,入度哦为0的点只有B,拿B,剪掉B相关的边,最后只剩下object
- 所以最后的排序是{D,C1,C2,A,B,object}
我们执行上面的代码,发现print(D.__mro__)
的结果也正是这样,而这也就是多重继承所使用的C3算法啦
为了进一步熟悉这个拓扑排序的方法,我们再来一张图,试试看排序结果是怎样的,它继承的内容是否如你所想
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
class A(object):
def foo(self):
print('A foo')
def bar(self):
print('A bar')
class B(object):
def foo(self):
print('B foo')
def bar(self):
print('B bar')
class C1(A):
pass
class C2(B):
def bar(self):
print('C2-bar')
class D(C1,C2):
pass
if __name__ == '__main__':
print(D.__mro__)
d=D()
d.foo()
d.bar()
还是先根据继承关系构一个继承图
- 找到入度为0的顶点,只有一个D,拿D,剪掉D相关的边
- 得到两个入度为0的顶点(C1,C2),根据最左原则,拿C1,剪掉C1相关的边,这时候序列为{D,C1}
- 接着看,入度为0的顶点有两个(A,C1),根据最左原则,拿A,剪掉A相关的边,这时候序列为{D,C1,A}
- 接着看,入度为0的顶点为C2,拿C2,剪掉C2相关的边,这时候序列为{D,C1,A,C2}
- 继续,入度为0的顶点为B,拿B,剪掉B相关的边,最后还有一个object
- 所以最后的序列为{D,C1,A,C2,B,object}
最后,我们执行上面的代码,发现print(D.__mro__)
的结果正如上面所计算的结果
最后的最后,python继承顺序遵循C3算法,只要在一个地方找到了所需的内容,就不再继续查找。
转自:https://kevinguo.me/2018/01/19/python-topological-sorting/
相关推荐
拓扑排序的两种实现
根据提供的文件信息,我们可以推断出这是关于C语言实现拓扑排序算法的代码片段。由于提供的代码不完整且包含了一些非标准字符,我们将基于这部分内容提取关键知识点,并结合拓扑排序的基本概念进行详细阐述。 ### ...
压缩包中的文件“www.pudn.com.txt”可能是相关资料或说明文档,而“toplogical_sort”和“toplogical sort”可能是程序源代码,用于实现拓扑排序算法。这些源代码可以作为学习和理解拓扑排序的一个实例,你可以通过...
**拓扑排序(Topological Sorting)** 拓扑排序是对有向无环图(DAG, Directed Acyclic Graph)的一种线性排序,使得对于图中的每条有向边 (u, v),节点u都在节点v之前。拓扑排序的结果并不唯一,因为不同的起始节点和...
在C语言中实现拓扑排序算法,可以帮助我们理解数据结构与算法的基础,并为解决实际问题提供工具。下面将详细阐述拓扑排序的原理、步骤以及C语言的实现方法。 **拓扑排序定义** 拓扑排序是对有向无环图的所有顶点...
Kahn算法是一种经典的拓扑排序算法,其基本思想是从DAG中选择入度为0的顶点作为起点,然后依次删除该顶点及其相关的边,再从剩余的顶点中继续寻找入度为0的顶点,直到所有的顶点都被处理完毕。Kahn算法的具体步骤...
JavaScript的拓扑排序算法。 参见 。 :warning: 该代码要求定义regeneratorRuntime ,例如,通过导入 。 // Sort anything that can be iterated over with `for (const [u, v] of ...)` import { sorted } from...
拓扑排序(Topological Sorting)是一种对有向无环图(Directed Acyclic Graph,简称DAG)进行线性排序的方法。它能确保图中任何一对顶点u和v,只要在图中存在一条从u到v的有向边(即,v>∈E(G)),那么u在排序后的...
根据给定文件的信息,我们可以提炼出关于“拓扑排序算法 C++”的相关知识点。下面将对这些知识点进行详细的解析。 ### 拓扑排序算法概述 拓扑排序(Topological Sort)是一种针对有向无环图(Directed Acyclic ...
拓扑排序是对有向无环图(DAG,Directed Acyclic Graph)的一种线性排序,它使得对于图中的每一条有向边 (u, v),节点 u 的排序位置总是在节点 v 之前。在实际应用中,例如课程安排、项目依赖关系解决等场景,拓扑...
### Java 实现拓扑排序算法(源代码) #### 拓扑排序算法介绍 拓扑排序(Topological Sorting)是一种针对有向无环图(DAG,Directed Acyclic Graph)的特殊排序方法。其基本思想是对于有向图中的每条边 (u, v),...
拓扑排序算法分析 拓扑排序的基本思想是从图中选择一个没有前驱的顶点输出,然后从图中删除该顶点及其所有的出边。重复这个过程,直到所有顶点都被输出或者图中不存在没有前驱的顶点为止。如果整个过程中都能成功...
这里我们聚焦于三种经典的算法:Prim算法、哈夫曼(Huffman)算法和拓扑排序算法,它们都在解决特定问题时发挥着重要作用。这三种算法都是在C++环境下实现的,C++是一种广泛应用的面向对象编程语言,具有高效性和...
Kahn 算法是一种经典的拓扑排序方法,由 Arthur Robert Kahn 在1962年提出。该算法基于以下思路: 1. 初始化:计算所有节点的入度(即指向该节点的边的数量)。将入度为0的节点放入队列中。这是因为没有节点指向...
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑...
常用的拓扑排序算法有两种:深度优先搜索(DFS)和广度优先搜索(BFS)。这里主要介绍基于BFS的拓扑排序算法。 #### BFS拓扑排序算法步骤: 1. 初始化一个空栈,并创建一个临时队列。 2. 将所有入度为0的顶点放入...
在拓扑排序算法中,我们可以采用邻接表存储结构来实现有向图。邻接表存储结构由一个数组和多个链表组成,其中数组中每个元素对应一个顶点,链表中存储了该顶点的所有邻接点。 拓扑排序算法的基本思想是:首先找出...
主函数一般接收用户输入或读取文件,构建有向图,然后调用拓扑排序算法,输出排序结果。 5、有向图举例: 通过实例来展示有向图的不同表示方法,如邻接矩阵和邻接表,并演示如何进行拓扑排序。 总的来说,有向图的...
具体做法是,先求出所有顶点的入度,然后取所有入度等于000的顶点加入拓扑排序的结果里,接着进行BFS,将这些入度为000的顶点的前驱邻边依次删掉,一旦某个顶点的入度删为了000,就将其加入拓扑排序的结果里,并将其...