zoukankan      html  css  js  c++  java
  • 拓扑排序|Topological Sort类算法题心得(PYTHON版)

    拓扑排序

    寻找项目之间依赖顺序的过程称为拓扑排序(topological sorting)。


    首先要了解有向无环图|Directed Acyclic Graph

    用字典表示:G = { 'a':'bce', 'b':'d','c':'d','d':'','e':'cd'}

    Key为value的前置条件(满足其一即可)

    粗略解释来说就是: 访问bce前需要访问a, 访问d前需要访问b, 访问d前需要访问c, 访问cd前需要访问e。

    就像是选课一样,先上101,才能上201.


    之后要了解入度表|In_degrees

    入度表能够表示所有Key的入度数。

    何为入度数?

    大白话来讲就是“可作为其前置条件的数量”

    在G = { 'a':'bce', 'b':'d','c':'d','d':'','e':'cd'}这个例子中:

    入度表即为:in_degree = {'a':0, 'b':1, 'c':2, 'd': 3, 'e':1}

    解释一下就是:a的入度为0,因为它没有前置条件,所以它必然是整个环的起点;b和e的入度均为1(都是从a来的),c的入度为2(它可以从a or e过来)。。。

    画个图可以更好理解。


    做法:

    1.先建立Graph,其为有向无环图。

    2.建立入度表,得出每个Key的入度。

    3.将入度为0的key放到result首位。

    以下待修改

    4.再把下一个没有上一位key后入度为0的key加入result。

    5.循环上一步,直到result被填满所有key。


    python公式模板:

    def toposort(graph): #如果没有现成的Graph,就要自己想办法造一个出来
     in_degrees = dict((u,0) for u in graph) #初始化所有顶点入度为0
     for u in graph:
      for v in graph[u]:
       in_degrees[v] += 1  #计算每个顶点的入度,对应的key每在graph[u]里被提到一次,入度就+1
     start = [u for u in in_degrees if in_degrees[u] == 0] # 筛选入度为0的顶点
     result = []
     while start:
      u = start.pop()  #默认从最后一个删除
      result.append(u)
      for v in graph[u]:
       in_degrees[v] -= 1  #类似之前,对应的key每在graph[u]里被提到一次,入度就-1
       if in_degrees[v] == 0
        start.append(v)   #再次筛选入度为0的顶点
     return result
     
    G = {
     'a':'bce',
     'b':'d',
     'c':'d',
     'd':'',
     'e':'cd'
    }
    print(toposort(G))
     
    结果为:
    ['a', 'e', 'c', 'b', 'd']

     参考资料:

    Python实现拓扑排序的基本教程,赵洁钰Amy,2018年03月11日,脚本之家,https://www.jb51.net/article/136203.htm

  • 相关阅读:
    最受欢迎的ASP.NET的CMS下载
    asp.net开源CMS推荐
    Oracle分组小计、总计示例(grouping sets的使用)
    PLSQL登录的时候Warning提示:Using a filter for all users can lead to poor performance!
    hibernate saveorupdate方法只有更新有效果,保存没有效果
    Hibernate的generator属性
    在oracle中存入date类型数据遇到的问题及其解决方法(利用java.sql.date和Timestamp)
    Hibernate更新、删除后数据库无变化
    Oracle执行update时卡死问题的解决方法
    Hibernate
  • 原文地址:https://www.cnblogs.com/phinza/p/9820344.html
Copyright © 2011-2022 走看看