有向图php,【小龙的资结演算法秘籍】(8) 有向图(directed graph)及DAG(directed acyclic graph)的详细介绍...

哈啰~ 大家好, 之前在【小马的资结演算法秘笈】(6)超好懂的图(gragh)与树(tree) 的观念介绍介绍过什幺是graph, 那什幺是directed graph呢? 其实很简单,undirec...

哈啰~ 各位好!,

以前在【小龙的资结演算法秘籍】(6)非常好懂的图(gragh)与树(tree) 的意识详细介绍详细介绍过什幺是graph,

那什幺是directed graph呢?

其实不是很难,undirected graph的边是沒有分方位的,

边所相互连接的2个端点是相通的

譬如说这张地形图(北- 新北、桃- 桃源、竹- 新竹):

7d9f0c2175233f20e2bb8e0c8e54a225.png

「新北」与「桃源」邻近,画一条线连起來,

「桃源」与「新竹」邻近,画一条线连起來,

相互是能够 相通的

可是如果是directed graph,

大家便会把边标上方位,

意味着能够 从哪儿来到哪儿,

例如画成那样:

9c5139bbf0981e31f3ce5ba58a16181c.png

那幺含意就变为桃源跟新北是能够 相通的,

可是只能桃源能够 去新竹,新竹不能去桃源

由于directed graph,是有专一性的,

就很合适用于表达有单行线的地形图,

或者用于表述有依次关係的办事次序,

讨论一下一些生活上的事例协助了解吧

一、用餐次序

你来饭店用餐的情况下,

餐食将会会依照一定的次序出去,

用端点 A->B 表达 A要先吃了,B餐食才会出現

譬如说本图表达要先吃了开胃小菜才可以吃汤和主餐,

汤和主餐都吃完了才可以吃甜品

对于饮品沒有限定,什幺情况下吃都能够

aed786a13ce2f9636345c25341117976.png

二、修课次序

譬如说在修课的情况下,一部分课程内容会规定「先修课程内容」,

还可以用有向图表述修课依次关係,

譬如说图上表达要修「学习英语」以前要先修好「基础英文一」和「基础英文二」才能够 修,

通识课程内容则不用先修课程内容

6d0a495fd0a9a84a1c27e8af072950e9.png

DAG(directed acyclic graph)

简易详细介绍完directed graph,

那什幺是directed acyclic graph呢?

acyclic是沒有环的,

假如一个directed graph里边沒有cycle,

就称之为是一个DAG

cycle简易而言,是你能够 从一个点考虑,

历经一条相对路径后又回到原点,

譬如说这幅图你能从A考虑,

走A->B->C->D->A绕一圈返回A,

这幅图便是有cycle的

ea880eeedc51ae85c5913b391af6e29e.png

相反,若把图改为那样就沒有cycle

786e8c496448cc6878e25a23890fe3f6.png

形象化而言,假如用directed graph表达办事次序得话,

DAG能够 确保寻找一个次序把事儿做了,

要不是DAG就没法做(表达有环,会相互之间把事儿卡死),

打个比方:

是我很多东西爱吃,

吃鱼以前要先吃豆腐花

吃饮品以前要先吃鱼

吃苹果以前要先吃饮品

吃饮品以前要先吃豆腐花

1b25c90b7c83a3d8e8f393b2ad14160a.png

那样的话就没法寻找考虑所述标准的进食次序

简易详细介绍topological sort

topological sort(汉语译者拓扑排序)与DAG拂面有关,

即然姓名都称为sort了,

表达是某类排列

topological sort便是寻找一种次序,

促使你可以圆满把事儿把表达事儿顺序的directed graph做了,

譬如说这幅图是用餐次序

aed786a13ce2f9636345c25341117976.png

先吃了开胃小菜才可以吃汤和主餐,

汤和主餐都吃完了才可以吃甜品

饮品沒有限定,什幺情况下吃都能够

那幺「开胃小菜」->「汤」->「主餐」->「甜品」->「饮品」是一个合理合法的拓扑排序,

「开胃小菜」->「饮品」 ->「主餐」->「汤」->「甜品」也是一个合理合法的拓扑排序,

拓扑排序有很多种多样将会排法,要是不违背依次顺序的都能够

怎么知道一张有向图有木有cycle呢?

我们可以思索一个难题,让你一个directed graph,

你怎样可以用程序分辨这幅图有木有cycle呢?

这就留到下一章讲要怎么写程序做topological sort的情况下一併讲吧

参考文献

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值