`

拓扑排序(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 两种实现

    拓扑排序的两种实现

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

    这是一个图的拓扑排序的程序,是数据结构的图一章中比较重要的内容,程序已经调试通过,可以供大家参考

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

    JavaScript的拓扑排序算法。 参见 。 :warning: 该代码要求定义regeneratorRuntime ,例如,通过导入 。 // Sort anything that can be iterated over with `for (const [u, v] of ...)` import { sorted } from...

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

    拓扑排序(Topological Sorting)是对DAG(有向无环图,Directed Acyclic Graph)的顶点进行排序,使得对每一条有向边 (u, v),均有 u(在排序记录中)比 v 先出现。它通常用于在具有依赖关系的任务中确定任务的执行...

    c++实现拓扑排序

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

    【Lintcode】127. Topological Sorting

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

    拓扑排序--课程表

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

    ACM拓扑排序

    假设给我们一个任意的图,它可能是也可能不是DAG(有向无圈图),推广拓扑排序算法,以使得给定有向图G的输入,它的输出是以下两者之一: (a) 一个拓扑排序,于是确定了G为DAG; 或者 (b) G中的一个圈,于是确定了G...

    ACM拓扑排序(可输出环)

    假设给我们一个任意的图,它可能是也可能不是DAG(有向无圈图),推广拓扑排序算法,以使得给定有向图G的输入,它的输出是以下两者之一: (a) 一个拓扑排序,于是确定了G为DAG; 或者 (b) G中的一个圈,于是确定了G...

    tuopupaixu.rar_topological sort_tuopupaixu_拓扑_拓扑 图_拓扑排序

    拓扑排序,简单地说,是由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。一个表示偏序的有向图可用来表示一个流程图。它或者是一个施工流程图,或者是一个产品生产的流程图,再或是一个数据...

    邻接矩阵的拓扑排序

    从文本文件中读取邻接矩阵,通过减一治的方法实现拓扑排序

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

    在AOV网中为了更好地完成工程,必须满足活动之间先后关系,需要将各活动排一个先后...拓扑排序算法void TopologicalSort(ALGraph G) 中,先输出入度为零的顶点,而后输出新的入度为零的顶点,此操作可利用栈或队列实现

    python实现拓扑排序的基本教程

    拓扑排序 几乎在所有的项目,甚至日常生活,待完成的不同任务之间通常都会存在着某些依赖...拓扑排序算法 任何无回路的顶点活动网(AOV网)N都可以做出拓扑序列: 从N中选出一个入度为0的顶点作为序列的下一顶点。 从

    有向图邻接表的建立,深度广度搜索及拓扑排序.zip_45V_bfs_dfs_有向图

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

    topological-sort:使用拓扑排序对依赖项进行排序

    拓扑排序 排序依赖项 import topological from '../index.js' ;let items = [{ name : 'jquery-plugin1' , src : 'jquery-plugin-1.2.1.js' , dep : [ 'jquery' ] } ,{ name : 'jquery' , src : 'jquery-1.6.2.js' ,...

    拓扑排序--医院选址

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

    matlab开发-Topologicalsort

    matlab开发-Topologicalsort。执行有向图的拓扑排序

    算法分类.txt

    拓扑排序(Topological Sort - AOV-Network) 关键路径(Critical Path - AOE-Network) 回路问题: 欧拉路(Euler Path), 汉密尔顿回路(Hamilton Tour) 差分约束(Difference Constraints): Bellman-Ford 二部图匹配...

    GraphList.7z

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

    Topological insulators

    Topological insulators (拓扑绝缘体) shun-qing-shen

Global site tag (gtag.js) - Google Analytics