`

拓扑排序(Topological Sorting)多重继承C3算法

 
阅读更多

一、拓扑排序(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/

分享到:
评论

相关推荐

    拓扑排序 Topological Sorting 两种实现

    拓扑排序的两种实现

    c语言拓扑排序算法

    根据提供的文件信息,我们可以推断出这是关于C语言实现拓扑排序算法的代码片段。由于提供的代码不完整且包含了一些非标准字符,我们将基于这部分内容提取关键知识点,并结合拓扑排序的基本概念进行详细阐述。 ### ...

    toplogical_sort.rar_topological sorting_拓扑_数据结构 图_数据结构 拓扑排序

    压缩包中的文件“www.pudn.com.txt”可能是相关资料或说明文档,而“toplogical_sort”和“toplogical sort”可能是程序源代码,用于实现拓扑排序算法。这些源代码可以作为学习和理解拓扑排序的一个实例,你可以通过...

    拓扑排序关键路径算法C语言完整代码

    **拓扑排序(Topological Sorting)** 拓扑排序是对有向无环图(DAG, Directed Acyclic Graph)的一种线性排序,使得对于图中的每条有向边 (u, v),节点u都在节点v之前。拓扑排序的结果并不唯一,因为不同的起始节点和...

    拓扑 排序 C语言 算法

    在C语言中实现拓扑排序算法,可以帮助我们理解数据结构与算法的基础,并为解决实际问题提供工具。下面将详细阐述拓扑排序的原理、步骤以及C语言的实现方法。 **拓扑排序定义** 拓扑排序是对有向无环图的所有顶点...

    文档拓扑排序-Kahn算法和字典序最小的拓扑排序

    Kahn算法是一种经典的拓扑排序算法,其基本思想是从DAG中选择入度为0的顶点作为起点,然后依次删除该顶点及其相关的边,再从剩余的顶点中继续寻找入度为0的顶点,直到所有的顶点都被处理完毕。Kahn算法的具体步骤...

    js-topological-sorting:JavaScript的拓扑排序算法

    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++

    根据给定文件的信息,我们可以提炼出关于“拓扑排序算法 C++”的相关知识点。下面将对这些知识点进行详细的解析。 ### 拓扑排序算法概述 拓扑排序(Topological Sort)是一种针对有向无环图(Directed Acyclic ...

    c语言实现图的拓扑排序

    拓扑排序是对有向无环图(DAG,Directed Acyclic Graph)的一种线性排序,它使得对于图中的每一条有向边 (u, v),节点 u 的排序位置总是在节点 v 之前。在实际应用中,例如课程安排、项目依赖关系解决等场景,拓扑...

    Java 实现拓扑排序算法(源代码)

    ### Java 实现拓扑排序算法(源代码) #### 拓扑排序算法介绍 拓扑排序(Topological Sorting)是一种针对有向无环图(DAG,Directed Acyclic Graph)的特殊排序方法。其基本思想是对于有向图中的每条边 (u, v),...

    拓扑排序和关键路径课设

    拓扑排序算法分析 拓扑排序的基本思想是从图中选择一个没有前驱的顶点输出,然后从图中删除该顶点及其所有的出边。重复这个过程,直到所有顶点都被输出或者图中不存在没有前驱的顶点为止。如果整个过程中都能成功...

    数据结构 prim算法、哈弗曼算法、拓扑排序算法。

    这里我们聚焦于三种经典的算法:Prim算法、哈夫曼(Huffman)算法和拓扑排序算法,它们都在解决特定问题时发挥着重要作用。这三种算法都是在C++环境下实现的,C++是一种广泛应用的面向对象编程语言,具有高效性和...

    拓扑排序Kahn算法和字典序最小的拓扑排序

    Kahn 算法是一种经典的拓扑排序方法,由 Arthur Robert Kahn 在1962年提出。该算法基于以下思路: 1. 初始化:计算所有节点的入度(即指向该节点的边的数量)。将入度为0的节点放入队列中。这是因为没有节点指向...

    c++实现拓扑排序

    对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑...

    拓扑排序代码

    常用的拓扑排序算法有两种:深度优先搜索(DFS)和广度优先搜索(BFS)。这里主要介绍基于BFS的拓扑排序算法。 #### BFS拓扑排序算法步骤: 1. 初始化一个空栈,并创建一个临时队列。 2. 将所有入度为0的顶点放入...

    拓扑排序(算法与数据结构课程设计).pdf

    在拓扑排序算法中,我们可以采用邻接表存储结构来实现有向图。邻接表存储结构由一个数组和多个链表组成,其中数组中每个元素对应一个顶点,链表中存储了该顶点的所有邻接点。 拓扑排序算法的基本思想是:首先找出...

    有向图的拓扑排序报告

    主函数一般接收用户输入或读取文件,构建有向图,然后调用拓扑排序算法,输出排序结果。 5、有向图举例: 通过实例来展示有向图的不同表示方法,如邻接矩阵和邻接表,并演示如何进行拓扑排序。 总的来说,有向图的...

    【Lintcode】127. Topological Sorting

    具体做法是,先求出所有顶点的入度,然后取所有入度等于000的顶点加入拓扑排序的结果里,接着进行BFS,将这些入度为000的顶点的前驱邻边依次删掉,一旦某个顶点的入度删为了000,就将其加入拓扑排序的结果里,并将其...

Global site tag (gtag.js) - Google Analytics