Python DAG—归简法—拓扑排序

本文探讨Python中如何使用归简法对有向无环图(DAG)进行拓扑排序。提到拓扑排序在软件安装等场景中的应用,并指出拓扑排序的非唯一性和必须在无回路的有向图中进行。文章提到了归简法的基本思路,即每次移除入度为零的节点,并解决剩余节点的问题。
摘要由CSDN通过智能技术生成

原文:http://blog.csdn.net/lanchunhui/article/details/50957608

这个代码有bug,count不知道是什么?有时间再优化

Python 数据结构与算法——拓扑排序

几乎在所有的项目,甚至日常生活,待完成的不同任务之间通常都会存在着某些 依赖关系 ,这些依赖关系会为它们的执行顺序行程表部分约束。对于这种依赖关系,很容易将其表示成一个 有向无环图 (Directed Acyclic Graph, DAG ,无环是一个重要条件),并将寻找其中依赖顺序的过程称为拓扑排序( topological sorting )。


 

很多情况下,拓扑排序问题往往会出现在一些中等复杂程度的计算系统中。这方面最典型的例子莫过于软件安装了,现在大多数操作系统都至少会有一个自动安装软件组件的系统(Ubuntu Linux 系统中的 apt-get,CentOS Linux 系统中的 RPM,Mac OS X 系统中的 brew 等),这些系统会自动检测依赖关系中缺少的部分,并下载安装它们,对于这一类工作,相关组件就必须按照一定的拓扑顺序来安装。

DAG 分析

  • (1)拓扑排序并不唯一
  • (2)不含回路的有向图(有向无环图)——一定存在拓扑排序。

归简法解 DAG

归简法求解拓扑排序,第一直觉是先移除其中一个节点(后面会说,每次移除的都是当前拓扑结构中的入度为零的点,入度为 0 的含义不依赖其他任何节点,即可发生),然后解决其余 n-1 个节点的问题。

def topsort(G):
    in_degrees = dict((u, 0) for u in G)
    for u in G:
        for v in  G[u]:
            in_degrees[v] += 1
                                    # 每一个节点的入度
    Q = [u for u in G if in_degrees[u] == 0]
                                    # 入度为 0 的节点
    S = []
    while Q:
        u = Q.pop()
                                    # 默认从最后一个移除
        S.append(u)
        for v in G[u]:
            count[v] -= 1
                                    # 并移除其指向
            if count[v] == 0:
                Q.append(v)
    return S
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

对上图而言,我们使用邻接表的dict 形式进行表示:

G = {
    'a':'bf',
    'b':'cdf',
    'c':'d',
    'd':'ef',
    'e':'f',
    'f':''
}
>>> print(topsort(G))
['a', 'b', 'c', 'd', 'e', 'f']
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
版权声明:本文为博主原创文章,未经博主允许不得转载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值